Перехват события onchange без вмешательства в исходную функцию - PullRequest
2 голосов
/ 12 октября 2011

я пишу в библиотеке, которую я хочу включить на разных страницах, которые могут уже использовать событие onchange - есть ли способ прикрепить мое событие к onchange, не удаляя исходное?

EDIT:

onchange в окне obj. не только один элемент - onchange как изменение хеша в URL и т. д. извините, если я их перепутал!

Ответы [ 3 ]

7 голосов
/ 12 октября 2011

Если я прав, звучит так, будто вы хотите добавить новый код в существующее событие. Это может помочь вам, если вы хотите чисто JavaScript-решение, и вот скрипка, демонстрирующая эту функцию. http://jsfiddle.net/VZCve/1/

var element = document.getElementById("myElementId");

element.onchange = (function (onchange) {
  return function(evt) {
    // reference to event to pass argument properly
    evt  = evt || event;

    // if an existing event already existed then execute it.
    if (onchange) {
      onchange(evt);
    }

    // new code "injection"
    alert("hello2");
  }
})(element.onchange);

ИЗД. jQuery будет продолжать связывать новые функции, используя jQuery.change ().

обратите внимание, что следующее выполнит все назначенные функции изменения

$(document).ready(function () {
  $("#myElement").change(function() { alert('executed') });
  $("#myElement").change(function() { alert('executed again') });
  $("#myElement").change(function() { alert('executed again again') });
});

Когда вы активируете событие изменения для элемента в селекторе, вы получите 3 предупреждения.

Обратите внимание, что порядок запуска событий зависит от порядка, в котором каждая функция была связана с элементом.

Вот простая скрипка, демонстрирующая функциональность в jQuery http://jsfiddle.net/VZCve/

2 голосов
/ 12 октября 2011

Использование функции jQuery .change() для назначения обработчика onchange не приведет к переопределению существующих событий onchange (или других назначенных jQuery обработчиков).Смотрите рабочую демонстрацию здесь: http://jsfiddle.net/nrabinowitz/EyKdm/

0 голосов
/ 12 октября 2011

Более новые браузеры имеют addEventListener, который может это сделать, но dean.edwards решение лучше

более совместим со старыми браузерами

вы также можете использовать costem eventhandeler (s), который вызывает массив функций (если все сделано правильно, вы можете обработать значение return подфункций, чтобы решить, хотите ли вы запускать следующую функцию, также рассчитывает на * 1009) *

if(typeof element.onclickfunctions == "undefined"){
  element.onclickfunctions = [];
}
element.onclickfunctions.push( function(event){return Myfunct(event);});//or var
element.onclick = function(event){
  for(x in element.onclickfuncitons){
    if(! x(event)){
      break;
    }
  }
};

код не проверен, пожалуйста, прокомментируйте перед downvote

...