我正在将一个库转换为一个 jQuery 插件,以使其更易于初始化。这个想法是插件的行为取决于它运行的元素的类型。
如果元素是 a<p>
那么我正确初始化。但是,如果该元素是另一个块元素,我<p>
会在它前面加上 a。如果元素是内联元素,则需要将其从列表中移除。这工作得很好,数据附加到适当的元素(<p>
)。对于连锁能力,我想<p>
每次都返回 , 。
如果我从 开始$('p').Plugin({...data...})
,它确实会保留<p>
。但是,如果我以 开始链$('div).Plugin({...data...})
,<div>
则返回 。这是必需的,因为插件可能仅适用于特定元素。
这是让我有些困惑的代码:
(function($) {
var methods = {
init: function(options) {
// Maintain chainability
return this.each(function () {
var me;
if($(this).prop('tagName') != 'P')
{ $(this).append('<p></p>');
me = $(this).children('p');
}
else me = $(p);
// The following 2 lines error (I was desperate)
$(this) = me;
this = me;
// The following line does nothing (that I can tell)
return me;
});
},
... other methods ...
};
$.fn.Plugin = function (method) {
if (methods[method]) {
return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
} else if (typeof method === 'object' || !method) {
// Run Init
return methods.init.apply(this, arguments);
} else {
$.error('Method ' + method + ' does not exist on jQuery Plugin');
}
};
}
(jQuery));
我还尝试在 init 函数中重新创建列表,以便它只获取新创建<p>
的 s。有没有人有一个有效的工作建议来引导我朝着正确的方向前进?
注意:我知道上面的代码可以让我更有效率......为了解决这个问题,为了清楚起见,它被分解了。