将元素传递给事件侦听器回调函数

Pass Element to Event Listener Callback Function

在下面的代码中:

document.getElementById( 'elem' ).addEventListener( 'blur', function() {
    myScript();
});

如何将 document.getElementById( 'elem' ) 对象传递给 myScript()?我在想像关键字 "this," 这样的东西,这样我就可以在回调函数中对元素进行操作。

你有四种方式传递对象this

绑定this对象并调用函数:

如果你需要在myScript()执行之前执行一些逻辑,应该使用这种方法

function myScript() {
  console.log(this.id);
}

document.getElementById('elem').addEventListener('click', function() {
  myScript.bind(this)();
});
<button id="elem">Click me!</button>

调用函数 myScript 使用函数 call:

如果你需要在myScript()执行之前执行一些逻辑,应该使用这种方法

另请参阅函数 Function.prototype.apply()

function myScript() {
  console.log(this.id);
}

document.getElementById('elem').addEventListener('click', function() {
  myScript.call(this);
});
<button id="elem">Click me!</button>

直接传函数:

function myScript() {
  console.log(this.id);
}

document.getElementById('elem').addEventListener('click', myScript);
<button id="elem">Click me!</button>

或者传递对象this:

function myScript(element) {
  console.log(element.id);
}

document.getElementById('elem').addEventListener('click', function() {
  myScript(this); //Here you will need to use the param.
});
<button id="elem">Click me!</button>

资源

根据Ele的回答,您应该更喜欢绑定方法。正如dfsq在评论中所说,你可以去

element.addEventListener('click', function() {
    myScript(element);
}

但是,使用这样的匿名函数意味着您将无法删除事件侦听器。

const element = document.getElementById('elem');
// creates a new function instance with element bound as first arg
const eventListenerCallback = myScript.bind(null, element);
element.addEventListener('click', eventListenerCallback);

function myScript(element, event) {
    element.setAttribute('data-clicked', 'true');
    // remove the event listener once it has been clicked
    element.removeEventListener('click', eventListenerCallback);
}