有人能为我提供下面问题的解决方案吗?我正在尝试找到一个JS等效的jQuery代码:
var formSelector = 'my selector here';
var attribute = 'name';
var formHistory = [];
$(formSelector).one('focusout', function(e) {
formHistory.push(e['target'].getAttribute(attribute));
});
有人能为我提供下面问题的解决方案吗?我正在尝试找到一个JS等效的jQuery代码:
var formSelector = 'my selector here';
var attribute = 'name';
var formHistory = [];
$(formSelector).one('focusout', function(e) {
formHistory.push(e['target'].getAttribute(attribute));
});
在大多数浏览器中,您现在可以在选项对象中传递once:true
:
document.getElementById('btn').addEventListener('click', () => {
console.log('Hello and goodbye');
}, {
once: true,
});
<button id="btn">Click me</button>
在事件监听器回调函数中,只需销毁事件监听器即可 :) 下面是一个帮助函数:
function oneTimeEvent(element, eventType, callback) {
element.addEventListener(eventType, function(e) {
e.target.removeEventListener(e.type, arguments.callee);
return callback(e);
});
}
var btn = document.querySelector('button');
oneTimeEvent(btn, 'click', function () {
alert('♫ You clicked me once, but I won\'t let you click me twice, yeah!');
});
<button>Click me!</button>
arguments.callee
)。使用callee
是极其不推荐的。 - ssubearguments.callee
,但保留使用匿名函数名称/多个不同函数的能力? - LovethenakedgunaddEventListener
传递一个选项对象,其中包含属性 once: true
。 - Phillip这里有一个使用数据属性的非常简单的解决方案。
document.querySelector('#click').addEventListener('click', function(e){
if(e.currentTarget.dataset.triggered) return;
e.currentTarget.dataset.triggered = true;
alert('clicked');
})
<button id="click">Click me</button>
addEventListener()
的options
参数中使用once: true
。
浏览器支持:Chrome 55+,Firefox 50+,Safari 10,Edge 16,不支持IE。
document.getElementById('foo').addEventListener('click', function(e) {
alert('This will be displayed only once.');
}, { once: true });
<button id="foo">Click me</button>
参考资料:
使用ES6和一些闭包,这是一个不错的方法。
const button = document.querySelector('button');
function composeHandler(element, event, handler, ...captureArgs) {
return function handlerFunc (...args) {
handler(...args);
element.removeEventListener(event, handlerFunc, ...captureArgs);
}
}
function addEventListenerOnce(element, event, handler, ...captureArgs) {
element.addEventListener(event, composeHandler(element, event, handler, ...captureArgs), ...captureArgs);
}
addEventListenerOnce(button, 'click', (e) => alert('clicked on button ' + e.target.innerText), true)
<button>
Click me once!
</button>
尝试编写您的one
实现。就像这样:
function one(element,eventType,callback,self) {
var one=function(event) {
try{
callback.call(self,event);
} finally {
element.removeEventListener(eventType,one);
}
}
element.addEventListener(eventType,one);
}
addEventListener()
来附加事件,然后在其中使用removeEventListener()
来移除它。注意我没有测试过。 - DontVoteMeDown