以传统的方式添加事件监听器:
function getComboA(sel) {
var value = sel.options[sel.selectedIndex].value;
}
<select id="comboA" onchange="getComboA(this)">
<option value="">Select combo</option>
<option value="Value1">Text1</option>
<option value="Value2">Text2</option>
<option value="Value3">Text3</option>
</select>
但我想适应addEventListener的方式:
productLineSelect.addEventListener('change',getSelection(this),false);
function getSelection(sel){
var value = sel.options[sel.selectedIndex].value;
alert(value);
}
它不起作用,因为我不能将getSelection()中的任何参数作为addEventListener方法中的第二个参数传递?据我所知,我只能使用没有括号的函数名称。
有什么想法吗?
顺便说一句,请查看my previous question有关console.log在safari 6.0开发人员检查器中不起作用,我无法在控制台中编写任何输出,这是令人沮丧的。
答案 0 :(得分:99)
无需传递任何内容。用于addEventListener
的函数将自动将this
绑定到当前元素。只需在您的函数中使用this
:
productLineSelect.addEventListener('change', getSelection, false);
function getSelection() {
var value = this.options[this.selectedIndex].value;
alert(value);
}
这是小提琴:http://jsfiddle.net/dJ4Wm/
如果要将任意数据传递给函数,请将其包装在您自己的匿名函数调用中:
productLineSelect.addEventListener('change', function() {
foo('bar');
}, false);
function foo(message) {
alert(message);
}
这是小提琴:http://jsfiddle.net/t4Gun/
如果您想手动设置this
的值,可以使用the call
method来调用该函数:
var self = this;
productLineSelect.addEventListener('change', function() {
getSelection.call(self);
// This'll set the `this` value inside of `getSelection` to `self`
}, false);
function getSelection() {
var value = this.options[this.selectedIndex].value;
alert(value);
}
答案 1 :(得分:6)
在JS代码的第一行:
select.addEventListener('change', getSelection(this), false);
您通过将(this)
放在函数引用后面来调用getSelection 。这很可能不是你想要的,因为你现在将该调用的返回值传递给addEventListener,而不是对实际函数本身的引用。
在addEventListener
调用的函数中,this
的值将自动设置为侦听器附加到的对象,在这种情况下为productLineSelect
。
如果这是您想要的,您只需传递函数引用,并且此示例中的this
将在来自addEventListener的调用中为select
:
select.addEventListener('change', getSelection, false);
如果不是你想要的,那么你最好bind
对你传递给addEventListener
的函数的价值PhantomJS:< / p>
var thisArg = { custom: 'object' };
select.addEventListener('change', getSelection.bind(thisArg), false);
.bind
部分也是一个调用,但此调用只返回我们调用bind
的相同函数,该函数范围内的this
值为< strong>已修复到thisArg
,有效地覆盖了此绑定的动态特性。
要了解您的实际问题:&#34;如何将参数传递给addEventListener中的函数?&#34;
您必须使用其他功能定义:
var globalVar = 'global';
productLineSelect.addEventListener('change', function(event) {
var localVar = 'local';
getSelection(event, this, globalVar, localVar);
}, false);
现在我们传递事件对象,一个对addEventListener回调中this
的值的引用,一个在该回调中定义和初始化的变量,以及一个来自整个addEventListener调用之外的变量给你自己的{{} 1}}功能。
我们也可能在外部回调中再次选择getSelection
对象:
this
答案 2 :(得分:5)
使用addEventListener
时,this
将自动绑定。因此,如果您想要对安装了事件处理程序的元素进行引用,只需在函数中使用this
:
productLineSelect.addEventListener('change',getSelection,false);
function getSelection(){
var value = sel.options[this.selectedIndex].value;
alert(value);
}
如果你想从你调用addEventListener
的上下文传递一些其他参数,你可以使用一个闭包,如下所示:
productLineSelect.addEventListener('change', function(){
// pass in `this` (the element), and someOtherVar
getSelection(this, someOtherVar);
},false);
function getSelection(sel, someOtherVar){
var value = sel.options[sel.selectedIndex].value;
alert(value);
alert(someOtherVar);
}
答案 3 :(得分:2)
如果您想要的this
值只是您将事件处理程序绑定到的对象,那么addEventListener()
已经为您执行了此操作。当你这样做时:
productLineSelect.addEventListener('change', getSelection, false);
已经调用getSelection
函数,并将this
设置为事件处理程序绑定的对象。它还将传递一个参数,该参数表示具有关于事件的各种对象信息的事件对象。
function getSelection(event) {
// this will be set to the object that the event handler was bound to
// event is all the detailed information about the event
}
如果所需的this
值是除了绑定事件处理程序的对象之外的其他值,则可以执行以下操作:
var self = this;
productLineSelect.addEventListener('change',function() {
getSelection(self)
},false);
作为解释:
this
的值保存到其他事件处理程序的本地变量中。this
传递给它。