在addeventlistener中使用此关键字调用javascript类方法

时间:2011-03-09 09:44:38

标签: javascript javascript-events

我想使用带有参数的addEventListener调用javascript类方法,使用此关键字

 var _this = this;
function onClickBound(e) {
    _this.getItemList.call(text_box, e || window.event);
}
if (text_box.addEventListener) {
    text_box.addEventListener("change", onClickBound, false);
}

这里没有参数。但我想要参数.ie,。我想调用_this.getItemList('2','4')

代码参考

stackoverflow addeventlistener this

2 个答案:

答案 0 :(得分:0)

您可以使用arguments中的onClickBound伪参数来获取已传递的运行时参数,然后使用apply来调用getItemList

像这样(未经测试):

var _this = this;
function onClickBound(e) {
    arguments[0] = e || window.event; // Handle IE-ism
    _this.getItemList.apply(text_box, arguments);
}
if (text_box.addEventListener) {
    text_box.addEventListener("change", onClickBound, false);
}

arguments是一个伪数组,它在每个函数中预定义并包含函数的参数。 (它不是不是 Array,但它的行为很像一个,apply很乐意接受它。)

apply相当于call,但是传入类似数组的东西(Arrayarguments)来指定参数,而不是提供它们作为电话中的离散args。


更新:我想我可能误解了你的问题。让我们再试一次:

如果要在函数中“烧入”(咖喱)参数,可以使用函数工厂函数(创建函数的函数)来执行此操作:

if (text_box.addEventListener) {
    text_box.addEventListener(
        "change",
        createBoundEventHandler(this.getItemList, text_box, '2', '4'),
        false
    );
}
// Elsewhere with your other utility stuff
function createBoundEventHandler(f, thisArg) {
    var args, index;

    // Copy all but the first two args; leave a
    // gap at the beginning for the event argument
    args = [];
    for (index = 2; index < arguments.length; ++index) {
        args[index-1] = arguments[index];
    }

    // Return the function
    return function(e) {
        args[0] = e || window.event; // Handle IE-ism
        return f.apply(thisArg, args);
    };
}

这比标准的咖喱式函数要复杂一点,因为我们在事件参数的开头留下了这个空白。

如果你不想要事件对象(你曾经说过你想要调用_this.getItemList('2','4')),这应该可行:

if (text_box.addEventListener) {
    text_box.addEventListener(
        "change",
        bindAndCurry(this.getItemList, text_box, '2', '4'),
        false
    );
}
// Elsewhere with your other utility stuff
function bindAndCurry(f, thisArg) {
    var args, index;

    // Copy all but the first two args
    args = [];
    for (index = 2; index < arguments.length; ++index) {
        args.push(arguments[index]);
    }

    // Return the function
    return function() {
        return f.apply(thisArg, args);
    };
}

答案 1 :(得分:0)

尝试将此语法用于参数化函数。 click here了解更多详情。

&#13;
&#13;
var _this = this;
function onClickBound(e) {
    _this.getItemList.call(text_box, e || window.event);
}
if (text_box.addEventListener) {
    text_box.addEventListener("change", function(){onClickBound("x")}, false);
}
&#13;
&#13;
&#13;