繁体   English   中英

普通Javascript对象上的jQuery.bind()事件

[英]jQuery.bind() events on plain Javascript objects

将jQuery事件绑定到普通的非DOM Javascript对象是否可以:

var myobject = {};
$(myobject).bind("foobar", function() { alert("daa"); });

$(myobject).trigger("foobar");

有什么影响

  • 垃圾收集(没有新的引用创建阻止对象到GC'ed)

  • 对象属性(分配给对象的新属性)?

  • 性能

我注意到的一些事情

  • 事件名称不得与对象上的函数名称冲突,例如,您不能将函数init和事件命名为init并触发它的相关性

我将使用jQuery.Callbacks方法实现一个模仿它的方法,而不是使用jquery事件系统。

var myClass = function(){
    this._callbacks = {};
};
myClass.prototype = {
  addEvent: function(evname,callback) {
    if (!this._callbacks[evname]) {
      this._callbacks[evname] = $.Callbacks();
    }
    this._callbacks[evname].add(callback);
  },
  removeEvent: function(evname) {
    if (!this._callbacks[evname]) {
      return;
    }
    this._callbacks[evname].remove();
    //Might need this too:
    //this._callbacks[evname] = null;
  },
  triggerEvent: function(evname) {
    if (this._callbacks[evname]) {
      this._callbacks[evname].fire();
    }
  }
};
var foo = new myClass();
foo.addEvent("foo",function(){
  console.log('foo');
});
foo.triggerEvent("foo");
foo.removeEvent("foo");
// event was removed, the below line won't do anything.
foo.triggerEvent("foo"); 

http://jsfiddle.net/kEuAP/


但是,为了回答您的问题,除了没有记录之外,我没有看到您正在做什么的任何直接问题,并且可能会在版本之间更改功能(尽管它适用于所有当前可用的1.2.6+版本)。

看到j​​Query也支持通过动画更改对象属性,这绝对没问题。

var obj = {'test':0}; 
var interval = setInterval(function(){console.log(obj);}, 250);
$(obj).on("fun", function(){this.test++});

$(obj).animate(
    {'test':100}, 
    3000, 
    function (){ 
        console.log(obj);
        clearInterval(interval);


        $(obj).trigger("fun")
        console.log("increment",obj); 
    }
);

//will console log {test: 1.5}, {test: 6.4} etc then {test: 100}
//and finally "interval" {test: 101}

Quickredfox的备份评论也是一个非常好的来源: http//forum.jquery.com/topic/triggering-custom-events-on-js-objects

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM