1

例子:

我想创建一个多窗口 webapp。每个窗口都是一个 jQuery 对象(附有一个 DOM 元素),但它还应该具有特定的属性和方法(例如close()minimize())。看来,我应该创建一个具有包含 jQuery 对象MyWindow的属性的类。DOMElement

但是如何将 DOM 事件绑定到MyWindow对象?

我可以做类似的事情MyWindow.DOMElement.on('click', function(){...}。但是DOMElement不知道MyWindow它附加到哪个,并且如果需要将无法操纵它的属性。例如,它不能调用它的MyWindow方法close()

我目前看到两种解决这个问题的方法。

第一的。使用指向对象的父对象MyWindow.DOMElement的单个属性扩展属性中的 jQuery对象。myWindowMyWindow

第二。使用 's 的属性扩展 jQuery 对象MyWindow并使其成为一个instanceof MyWindow(也许是通过寄生继承?)。这样,事件处理程序将可以MyWindow通过使用this.

这两种方式似乎都有些奇怪。

将 DOM 对象分配给 Javascript 对象以进行事件绑定的首选方法是什么?

4

1 回答 1

1

我基本上会按照您在第一个解决方案中所说的那样做:

MyWindow 对象包含 dom 元素的相关 jquery 对象作为其属性之一:

var MyWindow = function(params) {
  this.close = function() {/*close window*/};
  this.minimise = function() {/*minimise window*/};
  this.$elm = $('#'+params.id);
  // do all the other stuff you have to do to initialise the window

  this.$elm.myWindow = this;
}

然后绑定点击:

window1 = new MyWindow({id: 'window'});
window1.$elm.on('click', function() {
  this.close();
});

编辑:我最近使用的另一种方法是拥有一个单独的事件处理程序,将事件路由到正确对象的正确方法,但这需要您跟踪哪些 id 对应于哪些对象,如下代码所示:

var myWindows = [];

var MyWindow = function(params) {
  // initialise object

  myWindows[params.id] = this;
};

$(function() {
  $(document).on({
    click: function(e) {
      var myWindow = myWindows[$(this).attr('id')];
      if (typeof myWindow.click === 'function') {
        myWindow.click(e);
      }
    }
  }, '.myWindow');
};

然后,您只需向对象添加适当的方法即可绑定事件

var myWindow = new MyWindow({'id': window});

myWindow.click = function(event) {
  this.close();
};

但是,这种方法的危险在于您必须非常小心地保持 myWindows 数组为最新,否则您会遇到各种内存泄漏(显然,这的难度/重要性将取决于您的应用程序的上下文)。

于 2013-05-19T21:33:21.400 回答