如何将事件处理程序从一个元素复制到另一个元素?例如:
$('#firstEl')
.click(function() {
alert("Handled!");
})
;
// here's where the magic happens
$('#secondEl').click = $('#firstEl').click; // ????
Run Code Online (Sandbox Code Playgroud)
请注意,第二个元素正在处理第一个元素获取其处理程序的不同时间,这意味着:
$('#firstEl, #secondEl').click(function() { ... });
Run Code Online (Sandbox Code Playgroud)
......不行.
Chr*_*tof 22
这个问题已经得到解答,但是为了将来参考:您可以通过迭代原始元素的事件并将其处理程序绑定到目标来复制它们.
>请参阅下面的编辑!
// iterate event types of original
$.each($('#original').data('events'), function() {
// iterate registered handler of original
$.each(this, function() {
$('#target').bind(this.type, this.handler);
});
});
Run Code Online (Sandbox Code Playgroud)
当您无法控制原始元素时(例如,在使用插件时)并且只想克隆某个元素的行为时,这很方便.
编辑:在以后的jQuery版本中更改了对元素事件处理程序的访问.这适用于较新的版本:
$.each($._data($('#original').get(0), 'events'), function() {
// iterate registered handler of original
$.each(this, function() {
$('#target').bind(this.type, this.handler);
});
});
Run Code Online (Sandbox Code Playgroud)
干杯
您不能轻易(而且可能不应该)“复制”该事件。您可以做的是使用相同的函数来处理每个函数:
var clickHandler = function() { alert('click'); };
// or just function clickHandler() { alert('click'); };
$('#firstEl').click(clickHandler);
// and later
$('#secondEl').click(clickHandler);
Run Code Online (Sandbox Code Playgroud)
或者,您实际上可以触发第二个处理程序中第一个元素的事件:
$('#firstEl').click(function() {
alert('click');
});
$('secondEl').click(function() {
$('#firstEl').click();
});
Run Code Online (Sandbox Code Playgroud)
编辑:@nickf 担心污染全局命名空间,但这几乎总是可以通过将代码包装在对象中来避免:
function SomeObject() {
this.clickHandler = function() { alert('click'); };
}
SomeObject.prototype.initFirstEvent = function() {
$('#firstEl').click(this.clickHandler);
};
SomeObject.prototype.initSecondEvent = function() {
$('#secondEl').click(this.clickHandler);
};
Run Code Online (Sandbox Code Playgroud)
或者将代码包装在匿名函数中并立即调用它:
(function() {
var clickHandler = function() { alert('click'); };
$('#firstEl').click(clickHandler);
$('#secondEl').click(clickHandler);
})();
Run Code Online (Sandbox Code Playgroud)