該對象實現了一個模式來提供事件偵聽器。它至少可以在IE 11和Chrome中運行。爲什麼`this`不等於`Object`,爲什麼屬性`undefined`?
但我不明白爲什麼和我有兩個問題。
在按鍵事件監聽器中,有一個警報顯示this
等於[object HTMLInputElement]
而this.element
是undefined
。
- 爲什麼
this
不等於Object
? - 爲什麼
this.element
undefined
? (請注意,在init
方法初始化。)
看到這個JSFiddle
這裏是JavaScript:
function CustomEditor(id) {
'use strict';
this.element = null;
this.id = id;
this.init();
};
CustomEditor.prototype.addEvent = function (event, callback) {
'use strict';
return this.element.addEventListener(event, callback, false);
};
CustomEditor.prototype.init = function() {
'use strict';
this.element = document.getElementById(this.id);
this.addEvent('keypress', this.onCustomKeyPress);
};
CustomEditor.prototype.onCustomKeyPress = function() {
'use strict';
// alert("keypress event handler");
this.style.backgroundColor = "#000";
this.style.color = "#ff0";
alert('this = ' + this + '\n\nthis.element = ' + this.element);
};
// create and initialize custom editor
ce = new CustomEditor('myInput1');
document.getElementById('myInput1').value = 'a';
alert('ce = ' + ce + '\n\nce.element = ' + ce.element);
編輯:由@Bergi & @lombausch的意見,我瞭解我在this
和上下文(週末戰士在這裏)的錯誤觀念。我對我的對象進行了以下修改,現在this
具有我需要的上下文。 (我使用call
而非bind
這樣的代碼可與舊版瀏覽器。)
MyObj.prototype.addEvent = function (event, callback, caller) {
'use strict';
if (typeof window.addEventListener === 'function') {
return this.element.addEventListener(event, function() {
callback.call(caller);
}, false);
}
// for older versions of IE, order of test is important
return this.element.attachEvent('on' + event, function() {
callback.call(caller);
});
};
但是,一個新問題:什麼樣的變化已被該模式提出了onCustomKeypress
到有權訪問事件接口/對象?
事件接口是事件偵聽器的第一個參數,但我似乎無法將它傳遞給回調函數。例如,這不起作用:
MyObj.prototype.onCustomKeyPress = function (e) {
我假設你的意思是「等於'ce'」,而不是「對象」? – Bergi 2014-10-02 11:00:30
這就是事件偵聽器的工作方式,它們在綁定到的元素的上下文中調用。看到[這個問題](https://stackoverflow.com/questions/20279484/how-to-access-the-correct-this-context-inside-a-callback)的解決方案 - 或者你真的想知道*爲什麼*? – Bergi 2014-10-02 11:02:42
這對你來說總的來說是否令人困惑(就像大多數JavaScript新手一樣),或者特別是關於「嚴格使用」爲什麼沒有幫助? – 2014-10-02 11:02:51