初期化を簡単にするために、ライブラリを jQuery プラグインに変換しています。アイデアは、プラグインが実行される要素のタイプに応じて異なる動作をするということです。
要素が a の場合、<p>
正しく初期化します。ただし、要素が別のブロック要素である場合は、先頭に a<p>
を追加します。要素がインライン要素である場合は、リストから削除する必要があります。これは問題なく機能しており、データは適切な要素 ( ) にアタッチされています<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 のみを取得するようにしました。誰かが私を正しい方向に導くための有効な提案を持っていますか?
注:上記のコードの方が効率的であることは承知しています...問題を解決するために、わかりやすくするために分割しています。