私はさまざまな jQuery プラグインの定型文を見てきました。また、公式の記事を含め、さまざまな jQuery プラグインのオーサリング記事を読みました。しかし、根本的に、まだ何かが欠けているようです!
他の場所で見たコードとjQuery の公式の作成ガイドラインを組み合わせて使用しています。
コードからわかるように、私はすべてを内部で行っていますreturn this.each(function() { });
。これには、私の私的な機能が含まれます。これは、呼び出されるたび.pluginName();
にコードが実行され、そのインスタンスに関連付けられることを意味すると思いました。たとえば、randID
複数のインスタンスが作成された場合にインスタンスが正しい要素を参照できるように、各要素 ID の末尾に a を追加しています。
私の問題は、同じページに 2 つのインスタンスがある場合、2 番目のインスタンスの関数 ( などdisplayAvailableItems()
) が最初のインスタンスrandID
s を使用していることです。
関数が間違った場所にあり、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);