在不干扰原始功能的情况下劫持onchange事件

时间:2011-10-12 18:14:36

标签: javascript jquery javascript-events onchange

我正在写一个图书馆我希望包含在可能已经使用onchange事件的不同页面上 - 有没有办法将我的事件附加到onchange而不删除原始事件?

编辑:

在窗口obj上的onchange。不仅是一个单独的元素 - 在URL中的哈希变化中的onchange等等。抱歉,如果我混淆了它们!

3 个答案:

答案 0 :(得分:7)

如果我是正确的,听起来你想要将新代码注入现有事件中。如果你想要一个纯粹的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将继续使用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/

中的功能

答案 1 :(得分:2)

使用jQuery的.change()函数来分配onchange处理程序不会覆盖现有的onchange事件(或其他jQuery分配的处理程序)。请在此处查看工作演示:http://jsfiddle.net/nrabinowitz/EyKdm/

答案 2 :(得分:0)

较新的浏览器有addEventListener可以做到但是 dean.edwards解决方案更好

与旧浏览器更兼容

你也可以使用一个costem eventhandeler(s)调用数组的函数(正确完成你可以处理子函数的return值来决定你是否要运行下一个函数,也可以event

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之前发表评论