我写了一个jQuery plugin,我最近做了这个,所以回调可以访问this
,这是原始选择器,所以你可以做...
$('#something').waitForImages(function() {
$(this).fadeIn(500);
});
这看起来非常像jQuery API中的一些代码。
但是,jQuery始终提供this
作为本机DOM元素,因此必须用$()
包装它以开始在其上调用jQuery的方法。
Originally,我提供了this
作为jQuery对象。但是,在观察了jQuery对this
,I changed it。
最好的方法是什么?提供它包裹与否?
答案 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函数返回的所选元素数组。重新包装元素是非常不必要的。