避免多次添加事件
Avoid Adding Event Multiple Times
我正在使用 addEvent("keydown", function() {});
向元素动态添加事件。我的问题是,有时此代码会在同一元素上出现 运行 两次或更多次。行为变得笨拙,因为函数为该事件注册了几次 运行s。
有没有办法让我在一个元素上只 运行 上面的代码一次?也许检查之前是否已经添加了该事件?
要么不要每次都使用新功能,要么使用 class 或其他方式告诉您您已经添加了它。
不是每次都使用新功能
MooTools 的 addEvent
是 addEventListener
/attachEvent
上的一个相当薄的包装器,不会将相同的功能添加两次。因此,如果您确保使用相同的函数,则可以再次调用 addEvent
而无需执行任何操作:
// Somewhere it's created **once**
function keyDownHandler() {
// ....
}
然后:
element.addEvent("keydown", keyDownHandler); // Adds it only if not there
实例:
addIt();
addIt();
function addIt() {
$("foo").addEvent("click", handler);
}
function handler() {
var p = document.createElement('p');
p.innerHTML = new Date();
document.body.appendChild(p);
}
<div id="foo">Click me</div>
<script src="https://ajax.googleapis.com/ajax/libs/mootools/1.5.0/mootools-yui-compressed.js"></script>
记住你已经添加了它:
if (!element.hasClass("keydown-handler")) {
element.addClass("keydown-handler").addEvent("keydown", function() { /*...*/});
}
实例:
addIt();
addIt();
function addIt() {
var element = $("foo");
if (!element.hasClass("click-handler")) {
element.addClass("click-handler").addEvent(
"click",
function() {
var p = document.createElement('p');
p.innerHTML = new Date();
document.body.appendChild(p);
}
);
}
}
<div id="foo">Click me</div>
<script src="https://ajax.googleapis.com/ajax/libs/mootools/1.5.0/mootools-yui-compressed.js"></script>
也许您的问题不在于何时何地添加事件处理程序,而是如何添加。可以将事件委托给父元素。例如,这是将事件处理程序直接添加到目标元素的经典方法。
new Element( 'p', { 'text': 'Some Text' } ).inject( $( 'container' ) );
$$( '#container p' ).addEvent( 'click', function() {
console.log( this );
});
new Element( 'p', { 'text': 'Some Text' } ).inject( $( 'container' ) );
当然,只有第一段有点击事件。
下面是一个事件委托的例子。
$( 'container' ).addEvent( 'click:relay(p)', function() {
console.log( this );
});
$( 'container' ).adopt([
new Element( 'p', { 'text': 'Some Text' } ),
new Element( 'p', { 'text': 'Some Text' } )
]);
由于事件侦听器被分配给其所有子项的父项,因此所有段落都将具有点击事件,无论它们是在何时何地创建的。当您动态地将元素添加到页面中时,它非常有用。
我不知道这有多大帮助,但很高兴知道。
我正在使用 addEvent("keydown", function() {});
向元素动态添加事件。我的问题是,有时此代码会在同一元素上出现 运行 两次或更多次。行为变得笨拙,因为函数为该事件注册了几次 运行s。
有没有办法让我在一个元素上只 运行 上面的代码一次?也许检查之前是否已经添加了该事件?
要么不要每次都使用新功能,要么使用 class 或其他方式告诉您您已经添加了它。
不是每次都使用新功能
MooTools 的 addEvent
是 addEventListener
/attachEvent
上的一个相当薄的包装器,不会将相同的功能添加两次。因此,如果您确保使用相同的函数,则可以再次调用 addEvent
而无需执行任何操作:
// Somewhere it's created **once**
function keyDownHandler() {
// ....
}
然后:
element.addEvent("keydown", keyDownHandler); // Adds it only if not there
实例:
addIt();
addIt();
function addIt() {
$("foo").addEvent("click", handler);
}
function handler() {
var p = document.createElement('p');
p.innerHTML = new Date();
document.body.appendChild(p);
}
<div id="foo">Click me</div>
<script src="https://ajax.googleapis.com/ajax/libs/mootools/1.5.0/mootools-yui-compressed.js"></script>
记住你已经添加了它:
if (!element.hasClass("keydown-handler")) {
element.addClass("keydown-handler").addEvent("keydown", function() { /*...*/});
}
实例:
addIt();
addIt();
function addIt() {
var element = $("foo");
if (!element.hasClass("click-handler")) {
element.addClass("click-handler").addEvent(
"click",
function() {
var p = document.createElement('p');
p.innerHTML = new Date();
document.body.appendChild(p);
}
);
}
}
<div id="foo">Click me</div>
<script src="https://ajax.googleapis.com/ajax/libs/mootools/1.5.0/mootools-yui-compressed.js"></script>
也许您的问题不在于何时何地添加事件处理程序,而是如何添加。可以将事件委托给父元素。例如,这是将事件处理程序直接添加到目标元素的经典方法。
new Element( 'p', { 'text': 'Some Text' } ).inject( $( 'container' ) );
$$( '#container p' ).addEvent( 'click', function() {
console.log( this );
});
new Element( 'p', { 'text': 'Some Text' } ).inject( $( 'container' ) );
当然,只有第一段有点击事件。
下面是一个事件委托的例子。
$( 'container' ).addEvent( 'click:relay(p)', function() {
console.log( this );
});
$( 'container' ).adopt([
new Element( 'p', { 'text': 'Some Text' } ),
new Element( 'p', { 'text': 'Some Text' } )
]);
由于事件侦听器被分配给其所有子项的父项,因此所有段落都将具有点击事件,无论它们是在何时何地创建的。当您动态地将元素添加到页面中时,它非常有用。
我不知道这有多大帮助,但很高兴知道。