2

在阅读 Ben Alman 的 Pub/Sub 库时,我对他将一个空对象传递给 jQuery 函数的第一行感到困惑。此外,他使用绑定函数对象只是将它应用于那个几乎“空”的对象(我使用 firebug 来检查该对象,它只返回一个包含空对象的 jQuery 对象)。有人可以为我解释这个逻辑吗?非常感谢!P/S:我了解 Pub/Sub 模式在非框架上下文中的用法和想法,只是不了解它在 jQuery 中的实现。

这是我读过的库代码:

 (function($){
    var o = $({});
    $.subscribe = function() {
        o.bind.apply( o, arguments );
    };
    $.unsubscribe = function() {
        o.unbind.apply( o, arguments );
    };
    $.publish = function() {
        o.trigger.apply( o, arguments );
    };
 })(jQuery);
4

2 回答 2

2

当您创建元素的 jQuery 对象时...最终对象包括所有 jQuery 方法

过度简化的例子:

{ element: 'div'
    jQuery:{
      hide:function(){},
      animate:function(){}
       on:function(){}
    }

}

演示代码中的空对象用于能够做同样的事情。一旦它被包装起来,$()它就可以绑定 jQuery 事件处理程序,因为该对象包含许多 jQuery 方法(不是全部)作为属性

你可以写:

o.on('myCustomeEvent',doSomething);

在另一部分代码中

o.trigger('myCustomeEvent');
于 2012-12-26T02:46:51.317 回答
1

它只是一种创建某种空容器来存储事件处理程序的方法。

一些 jQuery 方法也可以用于 DOM 元素以外的对象,如 jQuery文档[docs]中所述:

使用普通对象

目前,在 jQuery 中封装的纯 JavaScript 对象上支持的唯一操作是:.data().prop().bind().unbind()和. 在普通对象上使用(或任何需要的方法)将导致对象上的新属性称为(例如。)。.trigger().triggerHandler().data().data()jQuery{randomNumber}jQuery123456789

// define a plain object
var foo = {foo:'bar', hello:'world'};

// wrap this with jQuery
var $foo = $(foo);

// test accessing property values
var test1 = $foo.prop('foo'); // bar

// test setting property values
$foo.prop('foo', 'foobar');
var test2 = $foo.prop('foo'); // foobar

// test using .data() as summarized above
$foo.data('keyName', 'someValue');
console.log($foo); // will now contain a jQuery{randomNumber} property

// test binding an event name and triggering
$foo.bind('eventName', function (){
    console.log('eventName was called');
});

$foo.trigger('eventName'); // logs 'eventName was called'

[...]

.trigger文档 [docs]

.trigger()方法可用于包装普通 JavaScript 对象的 jQuery 集合,类似于 pub/sub 机制;触发事件时将调用绑定到对象的任何事件处理程序。

这正是代码中发生的事情:

  • var o = $({});从一个空的普通对象创建一个 jQuery 对象。
  • o.bind.apply( o, arguments );将事件处理程序绑定到该对象。
  • o.trigger.apply( o, arguments );触发绑定到该对象的事件处理程序。
于 2012-12-26T02:40:27.087 回答