重新定义事件处理程序的上下文

时间:2014-07-01 14:57:12

标签: javascript

我为事件show_keyboard创建了一个监听器。在处理程序中,我需要解除此事件的绑定。在这种情况下,事件是从本机android插件抛出的。

appView.sendJavascript("cordova.fireWindowEvent('native.showkeyboard', { 'keyboardHeight':" + Integer.toString(keyboardHeight)+"});");

addHeightHandler中,我需要this作为addHeightHandler的父级才能解除绑定。因此,我在调用self时传递addHeightHandler。但是,当我执行此操作时,我无法访问ekeyboardHeight属性。

注意:我的雇主坚持认为必须这样做,没有匿名功能或self变量的全局设置

/*
 * When keyboard is shown, add height of keyboard to body to make scrollable. 
 */
this.addHeightHandler = function (e) {
    keyboardHeight = e.keyboardHeight;
    //e is undefined 
    //do some stuff to add keyboard height
    window.removeEventListener('show_keyboard', this.addHeightHandler);
};

/*
 * Listen for showkeyboard events thrown by native code on Android
 */
this.addKeyboardListeners = function () {
    var self = this;
    window.addEventListener('native.showkeyboard', function () {
        self.addHeightHandler(self)
    }, false);
};

我知道还有其他方法可以做到这一点,但这就是我指示这样做的方式。我相信将self传递给addHeightHandler意味着e会被覆盖,这是正确的吗?

1 个答案:

答案 0 :(得分:0)

是,以下内容:

this.addKeyboardListeners = function () {
    var self = this;
    window.addEventListener(eventConstants.nativeShowKeyboard, function () {
        self.addHeightHandler(self);
    });
};

self作为e的值传递。

您可以做的是将addHeightHandler函数绑定到所需的上下文。在addKeyboardListeners中,您可以:

this.addKeyboardListeners = function () {
    var handler = this.addHeightHandler.bind(this);
    addEventListener(eventConstants.nativeShowKeyboard, handler);
};

以上所做的是" bind" addHeightHandler函数到this的上下文,意味着当它被调用时,函数内的this关键字将引用绑定它时的this

该函数仍将e作为参数,因此当事件发生且处理程序运行时,e仍然是事件。