JS等效于jQuery one()

qua*_*lla 7 javascript jquery

有人能指出我的解决方案吗?我正在尝试为这个jQuery代码找到一个JS等价物:

var formSelector = 'my selector here';
var attribute = 'name';
var formHistory = [];

$(formSelector).one('focusout', function(e) {
    formHistory.push(e['target'].getAttribute(attribute));
});
Run Code Online (Sandbox Code Playgroud)

Phi*_*lip 11

在eventlistener回调中,只需破坏事件监听器:)这是一个辅助函数:

document.getElementById('btn').addEventListener('click', () => {
  console.log('Hello and goodbye');
}, {
  once: true,
});
Run Code Online (Sandbox Code Playgroud)
<button id="btn">Click me</button>
Run Code Online (Sandbox Code Playgroud)

  • 在将函数绑定到事件之前声明函数可能是个好主意,因此在解除绑定时可以引用函数(而不是`arguments.callee`).强烈建议不要使用`callee`. (4认同)

jon*_*nny 8

这是一个使用数据属性的非常简单的解决方案.

document.querySelector('#click').addEventListener('click', function(e){
    if(e.currentTarget.dataset.triggered) return;
    e.currentTarget.dataset.triggered = true;
    alert('clicked');
})
Run Code Online (Sandbox Code Playgroud)
<button id="click">Click me</button>
Run Code Online (Sandbox Code Playgroud)

  • 此答案不会删除该事件,因此其他解决方案更好。只需添加 e.removeEventListener (2认同)

小智 7

您可以once: trueoptions传递给的参数中使用addEventListener()

浏览器支持:不支持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 });
Run Code Online (Sandbox Code Playgroud)
<button id="foo">Click me</button>
Run Code Online (Sandbox Code Playgroud)

参考: