我有一个自定义Javascript类,可以生成一个JQuery mousedown回调。 mousedown回调在$(document)上,实际上应该只为第一个新实例设置,而不是为任何后续实例设置。我有类似的东西:
function myclass(arg){
this.arg = arg;
$(document).mousedown(function(down_event){
// start action
}).mouseup(function(){
// stop action
})
}
我希望那些回调只在多个myclass
实例被装箱的情况下注册一次,如果没有创建,则完全不注册。
答案 0 :(得分:2)
您应该使用变量来标记事件是否已经注册,并且只有在尚未注册的情况下才注册它们。
这方面的一个例子:
var registered = false; // the 'flag' variable, default to false (i.e. not yet registered)
function myclass(arg){
this.arg = arg;
if (!registered) { // check the 'flag' variable if events have been registered yet
registered = true; // set the 'flag' variable as events will be registered this time
$(document).mousedown(function(down_event){
// start action
}).mouseup(function(){
// stop action
})
}
}
答案 1 :(得分:1)
以下是一些可能的选择。
选项1:全局变量
function myclass(arg){
this.arg = arg;
if (!window._myClassCreatedAlready) {
$(document).mousedown(function(down_event){
// start action
}).mouseup(function(){
// stop action
})
}
window._myClassCreatedAlready = true;
}
选项2:jQuery数据
function myclass(arg){
this.arg = arg;
if (!$.data(document, "mousedownset")) {
$(document).mousedown(function(down_event){
// start action
}).mouseup(function(){
// stop action
})
}
$.data(document, "mousedownset", true);
}
答案 2 :(得分:1)
有一个jQuery函数。使用.one()
将处理程序绑定到在元素上引发的事件的第一个实例(在本例中为document
)。
function myclass(arg){
this.arg = arg;
$(document)
.one('mousedown.yourEvent', downHandler)
.one('mouseup.yourEvent', upHandler);
}
function downHandler(e) {
// start action
}
function upHandler(e) {
// stop action
//ensure event dead forever
$(document).on('.yourEvent', function() { return false; });
}
更新。更改(使用命名处理程序而不是匿名函数,将事件放在特定命名空间中)是为了确保myclass的新实例不会重新绑定到事件,如果它们是在第一个完成未绑定后创建的。