2010-01-18 2 views
0

У меня есть переключатель, содержащий инлайн onclick событие:Достоверно добавление к событию Javascript

<input type="radio" class="quantitycheckbox" onclick="alterQuantity(this.form)"> 

Я пытаюсь ненавязчиво добавить больше функциональных возможностей по щелчку, и этот код:

function updateCustomFields(box) { 
    // save current onclick event before assigning new one 
    var currEvent = box.onclick; 
    box.onclick = function() { 
     currEvent(); 
     // do additional stuff here 
    } 
} 

var boxes = $class('quantitycheckbox'); 
for(var i = 0; i < boxes.length; i++) { 
    updateCustomFields(boxes[i]); 
} 

Однако значение this.form, которое передано в функцию alterQuantity, не определено, и я получаю сообщение об ошибке. Как я могу зарезервировать событие onclick как есть и добавить свои функции?

ответ

2

Вам не нужно ничего делать с помощью встроенного события onclick. Просто прикрепление другое событие, используя attachEvent или addEventListener решит вашу проблему, так как событие рядный onclick всегда будет стрелять первым:

function updateCustomFields(box) { 
    var myCallback = function(){ 
     // Do stuff here 
    } 
    if(window.addEventListener){ 
     box.addEventListener('click', myCallback, false); 
    } else if (window.attachEvent){ 
     box.attachEvent('onclick', myCallback); 
    } 
} 

Порядок выполнения будет:

  1. Инлайн событие
  2. Ваше новое событие
+0

Как это * правильный * способ? И где документировано, что обработчик событий, установленный через свойство 'onclick', гарантированно запускается первым во всех браузерах? –

+1

@Tim, события всегда выполняются по порядку. Поскольку обработчики inline 'onclick' сначала« зарегистрированы »(вы не можете добавлять событие в элемент DOM до его существования, и как только он существует, встроенный обработчик уже привязан к элементу). Это правильный путь из-за того, насколько сильно я чувствую, что логику следует хранить отдельно от структуры. Я думаю, что я хотел быть в кавычках, чтобы он обнаружил мою предвзятость ... Я отредактирую :) –

+0

Взаимодействие между встроенными событиями и стандартом W3 DOM Events (не говоря уже о беспорядке IE) не стандартизировано вообще. Хотя, когда IE, Mozilla, WebKit и Opera все согласны с чем-то, вы, как правило, на победителя. – bobince

1

Попытка:

currentEvent.call(box); 

передать box в качестве значения this в currentEvent();

Редактировать: Решение Doug на самом деле лучше. Во всяком случае, методы call и apply, доступные для всех объектов функций, - это то, как вы изменяете значение этого в вызовах функций.

+0

Я думаю, проблема в том, что 'this.form' никогда не передается, а не значение' this'. Информация о аргументах не сохраняется, когда он вызывает 'currEvent();'. –

+1

Это также можно сделать с помощью 'call':' currentEvent.call (box, box.form) '. – bobince

+0

@Jon: То, что вы не понимаете, это то, что currentEvent выглядит так: 'function() {alterQuantity (this.form)}'. Функция 'alterQuantity()' компилируется как тело обработчика события, а не обработчик события. Поэтому просто передать 'this' достаточно, чтобы передать' this.form' в 'alterQuantity()'. – slebetman

 Смежные вопросы

  • Нет связанных вопросов^_^