0

すでに質問されている場合はお詫び申し上げますが、どこにも答えが見つかりませんでした。

基本的なプラグインシェルを作成しました。

ここにコードがあります。

http://codepen.io/anon/pen/dlhjL

私の質問は、なぜこれをjQuery内で各関数内で再度ラップする必要があるのか​​ということです。

メソッドを初期化したとき、これはすでにjQuery内にラップされています(例:$('p')。myPlugin();

これを回避する方法はありますか?

B

4

2 に答える 2

2

.each()コールバックにプレーンなDOM要素のみを提供します。したがって、.each()コールバック内でjQueryオブジェクトを使用する場合、yuoは渡されたDOM要素からオブジェクトを作成する必要があります。

プラグイン自体thisはホストjQueryオブジェクトとして開始するため、実行できますが、ホストjQueryオブジェクトthis.each()内の各DOM要素を反復処理するときに、コールバック内の連続する各DOM要素に.each()変更されます。this

ここにいくつかの注釈があります:

(function($) {

  $.fn.myPlugin = function() {

      // "this" here is the incoming jQuery object and thus
      //    you can call this.each() to iterate each item in the jQuery object

      return this.each(function() {

          // "this" here is each successive DOM object in the jQuery object
          //    because of how .each() works.
          // If you want to be able to use a jQuery object here, you have
          //    to create one as this code does

          $(this).css('background', 'red');

      });
  };

}(jQuery));

この特定のケースでは、jQueryオブジェクト内のすべてのDOM要素に対して反復が行われる.each()ため、実際には必要ありません。.css()あなたはこれを行うことができます:

jQuery.fn.myPlugin = function() {
    return this.css('background', 'red');
}
于 2013-03-22T16:22:15.937 に答える
0

ラップされるのはすべての段落要素ですが、.eachコールバック内では、すべての要素を同時に操作することは意味がありません。

通常、繰り返される要素をjQueryifyする必要はありません。この場合、次のように記述できます。

return this.css("background-color", "red");
于 2013-03-22T16:26:27.240 に答える