我看过很多不同的 jQuery 插件样板,并阅读了很多不同的 jQuery 插件创作文章,包括官方的一篇。但是,从根本上说,我似乎仍然缺少一些东西!
我使用了我在其他地方看到的混合代码和jQuery 的官方创作指南。
从代码中可以看出,我在return this.each(function() { });
. 这包括我的私人功能。我假设这意味着对于每个.pluginName();
调用,代码都将运行并绑定到该实例。例如,我在randID
每个元素 ID 的末尾添加一个,这样如果创建了多个实例,则该实例可以引用正确的元素。
我的问题是,当我在同一页面上有两个实例时,第二个实例的函数(如displayAvailableItems()
)正在使用第一个实例randID
。
我假设有两件事是错误的:函数在错误的位置,randID 是识别元素的不好方法。如果我移动displayAvailableItems()
到retun this.each(function() { });
, 则availableItem
变量不再可用。
这是我的代码的缩写版本:(pastebin)http://tny.cz/6d3d52a8
$.pluginName = {
id: 'PluginName'
,version: '1.0'
,defaults: { // default settings
foo: 'bar'
}
};
(function($) {
//Attach this new method to jQuery
$.fn.extend({
pluginName: function(params) {
//Merge default and user parameters
var params = $.extend($.pluginName.defaults, params)
,otherGeneralVars = 'example'
;
return this.each(function() {
var $t = $(this);
//Generate a random ID to attach to the elements, so we can have endless (up to 50k) quantities of the plugin on the page
var randID = 1 + Math.floor(Math.random() * 50000);
//Make sure the randID hasn't been previously used
while ($.inArray(randID, usedRandIDs) > -1)
{
randID = 1 + Math.floor(Math.random() * 50000);
}
usedRandIDs.push(randID);
randID = '_PluginName' + randID;
/*
RUN INITIALIZATION SETTINGS
*/
var availableItemsContainerID = 'availableItemsContainer' + randID
,tagSearchContainerID = 'tagSearchContainer' + randID
,tagSearchID = 'tagSearch' + randID
,availableItemsID = 'availableItems' + randID
,selectedItemsContainerID = 'selectedItemsContainer' + randID
,selectedItemsID = 'selectedItems' + randID
,selectedValuesID = 'selectedValuesInputName' + randID
;
//Build element structure
$t.append('<div id="' + availableItemsContainerID + '">' +
'<div id="' + tagSearchContainerID + '">' +
'<input id="' + tagSearchID + '" value="' + params.searchDefaultText + '" />' +
'</div>' +
'<div id="' + availableItemsID + '"></div>' +
'</div>' +
'<div id="' + selectedItemsContainerID + '">' +
'<div id="' + selectedValuesID + '"></div>' +
'<div id="' + selectedItemsID + '"></div>' +
'</div>');
//Show the list of available items
displayAvailableItems();
$('#' + availableItemsContainerID).css({
'width': params.availableItemsContainerWidth + params.unitOfMeasurement,
'height': params.availableItemsContainerHeight + params.unitOfMeasurement
});
$('#' + selectedItemsContainerID + ', #' + selectedItemsID).css({
'width': params.selectedItemsContainerWidth + params.unitOfMeasurement,
'height': params.selectedItemsContainerHeight + params.unitOfMeasurement
});
function displayAvailableItems() {
//Clear out the available items
$("#" + availableItemsID).html('');
//Do other stuff
}
});
}
})
})(jQuery);