【发布时间】:2010-08-03 05:01:03
【问题描述】:
如何控制只触发一次事件?
实际上,快速谷歌似乎暗示.one 有帮助的事实..
【问题讨论】:
标签: javascript jquery dom-events
如何控制只触发一次事件?
实际上,快速谷歌似乎暗示.one 有帮助的事实..
【问题讨论】:
标签: javascript jquery dom-events
如果您不需要支持 Internet Explorer,请使用 once:
element.addEventListener(event, func, { once: true });
否则使用这个:
function addEventListenerOnce(target, type, listener, addOptions, removeOptions) {
target.addEventListener(type, function fn(event) {
target.removeEventListener(type, fn, removeOptions);
listener.apply(this, arguments);
}, addOptions);
}
addEventListenerOnce(document.getElementById("myelement"), "click", function (event) {
alert("You'll only see this once!");
});
【讨论】:
this 并传递所有参数的略微改进的版本。
this
您可以使用 jQuery 的one method,它只会订阅第一次发生的事件。
例如:
$('something').one('click', function(e) {
alert('You will only see this once.');
});
【讨论】:
e 是回调的事件形式参数。在这种情况下,它是未使用的。两个参数分别是事件类型和函数。
one 方法可以带三个参数;请参阅文档。 api.jquery.com/one
one方法相当于调用bind,然后在handler中调用unbind。
和 rofrol 的回答一样,只是另一种形式:
function addEventListenerOnce(element, event, fn) {
var func = function () {
element.removeEventListener(event, func);
fn();
};
element.addEventListener(event, func);
}
【讨论】:
略微改进的 rofrol 的 anwser 版本:
function addEventListenerOnce(target, type, listener) {
target.addEventListener(type, function fn() {
target.removeEventListener(type, fn);
listener.apply(this, arguments);
});
}
通过使用 apply 所有参数都被传递,this 按预期工作。
【讨论】:
只需在 addEventListener 方法调用中使用适当的选项:
element.addEventListener(event, func, { once: true })
【讨论】:
此外,您还可以这样做:
window.addEventListener("click", function handleClick(e) {
window.removeEventListener("click", handleClick);
// ...
});
【讨论】:
添加了添加/删除事件监听器的选项:
function addEventListenerOnce(target, type, listener, optionsOrUseCaptureForAdd, optionsOrUseCaptureForRemove) {
const f = event => {
target.removeEventListener(type, f, optionsOrUseCaptureForRemove);
listener(event);
}
target.addEventListener(type, f, optionsOrUseCaptureForAdd);
}
【讨论】: