如何将事件两次绑定到 javascript 插件
How to bind an event twice to a javascript plugin
我想在插件内外调用我的插件的点击事件。我的意思是如果我添加
clicked: function() { console.log("called from outside"); },
作为插件实例的选项,插件将执行自己的函数,然后从选项中调用自定义函数。这是代码:
(function() {
// Define our constructor
this.Test = function() {
this.options = arguments[0];
}
Test.prototype.make = function(){
this.SelectArea = document.getElementById(this.options.id);
this.SelectArea.addEventListener('click', function(){
// first execute scripts to this function
console.log("calling from inside");
// then execute options clicked function
this.options.clicked;
});
}
}());
var Test = new Test({
id: 'testId',
clicked: function(){
console.log("calling from outside");
}
});
Test.make();
但是上面的代码失败了,它只触发了一次。选项中的 clicked
事件函数未执行。
您需要调用存储在this.options.clicked
中的函数。我相信这一点:
// then execute options clicked function
this.options.clicked;
应该是:
// then execute options clicked function
this.options.clicked();
因为this.options.clicked
是一个函数。现在正在引用该函数,但丢弃了表达式,因此什么也没有发生。
this.options.clicked;
您在这里根本没有调用该函数,您只是在引用它。您需要添加括号才能调用它:
this.options.clicked();
但是还有一个问题。在点击事件回调中,this
是 DOM 元素,而不是 Test
实例。您需要保存对它的引用,然后这样调用它:
Test.prototype.make = function(){
this.SelectArea = document.getElementById(this.options.id);
var clickHandler = this.options.clicked;
this.SelectArea.addEventListener('click', function(){
// first execute scripts to this function
console.log("calling from inside");
// then execute options clicked function
clickHandler(); // here
});
}
而且,为了更好,您可能希望传递事件变量和 DOM 上下文,以防处理程序想要使用它:
clickHandler.apply(this, arguments);
我想在插件内外调用我的插件的点击事件。我的意思是如果我添加
clicked: function() { console.log("called from outside"); },
作为插件实例的选项,插件将执行自己的函数,然后从选项中调用自定义函数。这是代码:
(function() {
// Define our constructor
this.Test = function() {
this.options = arguments[0];
}
Test.prototype.make = function(){
this.SelectArea = document.getElementById(this.options.id);
this.SelectArea.addEventListener('click', function(){
// first execute scripts to this function
console.log("calling from inside");
// then execute options clicked function
this.options.clicked;
});
}
}());
var Test = new Test({
id: 'testId',
clicked: function(){
console.log("calling from outside");
}
});
Test.make();
但是上面的代码失败了,它只触发了一次。选项中的 clicked
事件函数未执行。
您需要调用存储在this.options.clicked
中的函数。我相信这一点:
// then execute options clicked function
this.options.clicked;
应该是:
// then execute options clicked function
this.options.clicked();
因为this.options.clicked
是一个函数。现在正在引用该函数,但丢弃了表达式,因此什么也没有发生。
this.options.clicked;
您在这里根本没有调用该函数,您只是在引用它。您需要添加括号才能调用它:
this.options.clicked();
但是还有一个问题。在点击事件回调中,this
是 DOM 元素,而不是 Test
实例。您需要保存对它的引用,然后这样调用它:
Test.prototype.make = function(){
this.SelectArea = document.getElementById(this.options.id);
var clickHandler = this.options.clicked;
this.SelectArea.addEventListener('click', function(){
// first execute scripts to this function
console.log("calling from inside");
// then execute options clicked function
clickHandler(); // here
});
}
而且,为了更好,您可能希望传递事件变量和 DOM 上下文,以防处理程序想要使用它:
clickHandler.apply(this, arguments);