在创建jQuery插件时,`this`应该始终是任何回调中的本机DOM元素吗?

时间:2011-03-25 02:22:02

标签: jquery jquery-plugins waitforimages

我写了一个jQuery plugin,我最近做了这个,所以回调可以访问this,这是原始选择器,所以你可以做...

$('#something').waitForImages(function() {
   $(this).fadeIn(500);
});

这看起来非常像jQuery API中的一些代码。

但是,jQuery始终提供this作为本机DOM元素,因此必须用$()包装它以开始在其上调用jQuery的方法。

Originally,我提供了this作为jQuery对象。但是,在观察了jQuery对thisI changed it

的处理之后

最好的方法是什么?提供它包裹与否?

4 个答案:

答案 0 :(得分:6)

我会说在这种情况下保留 unwrapped ,因为这似乎是一个事件处理程序。在事件处理程序中,几乎总是(在原始JS事件处理程序中的jQuery 中),您希望this成为 DOM元素您正在处理...这是我坚持的惯例。

一般情况下,尽可能采用最少惊喜的原则。

如果需要,您还可以将包装元素作为参数传递给函数,例如:

$('#something').waitForImages(function(e, jQueryObjectHere) {
   $(this).fadeIn(500);
});

......那样你就没有做出意想不到的事情,但如果他们被要求就提供好东西。我绝不会说这是必要的,只是方便。以上只是一个选项(真的是随意的想法)......虽然如果你将这个事件公开为.bind()的内容,这样做,因为它们可能是另外的约束力数据并期待。

答案 1 :(得分:2)

原始DOM元素是人们在编写插件时所期望的。您可能觉得更改这更方便和可读,但它不是标准的,如果您计划将其分发给开源社区,它只会导致jQuery对象的混淆和重复。 $(this)this引用预先存在的jQuery集合时,不会出错,但绝对不会有效。

您的代码将迭代集合并执行任何元素的回调,因此您可以将每个回调视为集合中单个元素的唯一回调,而不是整个集合上执行一次。

希望这能解释设计选择的理性和“高层次”愿景。它归结为语义和一致性。

答案 2 :(得分:1)

很多时候,当我编写一个jQuery插件时,我会立即将this分配给一个变量,如下所示:

$.fn.myPlugin = function () {
  var $this = this;
};

主要原因是我可以在重新定义this的内部函数中引用原始选择器,但是这里更相关的原因是它自己的this看起来像一个未包装的DOM因为$this前面的$让我记住它已经被包裹了。

因此,我认为您确实应该将this作为DOM元素提供,并允许用户将其包含在$()中,如果他们愿意的话。

答案 3 :(得分:0)

this指的是jQuery函数返回的所选元素数组。重新包装元素是非常不必要的。