2012-09-14 10 views
6

私はjquery documentation of plugin authoringを読んでおり、それに精通しています。しかし、与えられた例は、常に以前に一致した要素のセットで動作します。 - 初期化プロセスの種類(必ずしも必要ではないがjQueryプラグイン関数をスタンドアロンで呼び出し可能にする方法は、コレクションでは動作しません。

// example usage of my to-be-created plugin function 

// this is the way described in the docs, and I know how to do that 
$("a").myFunction() 

// but I also want to be able to call the function without a collection: 
$.myFunction(); 

$.myFunction()場合は、それが一致する内容要素の自身のコレクションだ作成し、操作対象のコレクションなしで呼び出された:私は両方を行うことができます関数を作成したいです一度だけ実行してください)。また、$.myFunction()は連鎖性を維持する必要があります。

私が達成したいものの擬似コード:

// [...] 
function myFunction(): { 
    if (notCalledOnACollection) { 
     // this should run when called via $.myFunction() 
     $elements = $("a.myClass"); 
    } 
    else { 
     $elements = $(this); 
    } 
    return $elements.each (function() { 
     // do sth. here 
    }); 
} 

私は本当に、単一の関数定義内の関数の実装/機能のすべてを維持したい、と均等という名前の2つの個別の名前の関数や2を持っていませんjQueryオブジェクト内の2つの別々の場所で機能します。

そしてもちろん(私は複数のプラグインのためにそのアプローチを使用したい、とmyFunction()とargumentesがあるだろう、私は実行するためにif文のどの枝を示すパラメータmyFunction (do_init)を追加することができますが、それは私の引数リストを煩雑にします私は単純さのためにここに出てきました)。

良い提案はありますか?

答えて

8

単にプラグインdefinitonで別の参照を追加することで、簡単に、標準のプラグインコードを使用することができます

(function($) { 
    $.myPlugin = $.fn.myPlugin = function(myPluginArguments) { 
     if(this.jquery) 
      //"this" is a jquery collection, do jquery stuff with it 
     } else { 
      //"this" is not a jquery collection 
     } 
    }; 

    $.fn.myPlugin.otherFunc = function() { 
    }; 
})(jQuery); 

ここでの唯一の違いは、あなたが直接jQueryのセレクタを実行せずにプラグインを呼び出すことができます$.myPlugin =部分があるが関数。他の関数やプロパティが必要な場合は、プラグインのプロパティとして作成することができます。

使用法:

//using a selector (arguments optional) 
$(".someClass").myPlugin(); 

//using the options variable - or whatever your arguments are 
$.myPlugin({id: "someId"}); 

//accessing your other functions/properties 
$.myPlugin.otherFunc(); 
+0

私はあなたのソリューションとの深刻な問題を抱えています。私はあなたのアプローチをjsfiddleに複製しました:http://jsfiddle.net/pnpbU/ しかし、一旦 '$ .myPlugin()'を実行すると、テストされたすべてのブラウザは100%CPUを消費し、スタックします(LinuxおよびWindowsではFFでテストされます) 、Safari for Mac)をクリックします。 – Dyna

+0

私のマシンでその問題が表示されません。そして、私は現時点で恐竜の上にいる。さらに、jsfiddleはパフォーマンステストに使用すべきではありません。たくさんのエキストラがロードされています。私もローカルでテストし、そこに問題は見られませんでした。私はあなたの見解がこのコードと何が関係しているのか本当に疑問です。 – Donamite

+0

jsfiddleのjs部分の行のコメントを外しましたか?それ以外の場合は実行されません!私は現在大学にいて、たくさんのコンピュータにアクセスでき、物理的に異なる3つのマシンで100%のCPU消費を再現できます。 http://jsfiddle.net/pnpbU(最後の行のコメントを外して)を実行してrunを押すと、Fedora 17のスクリプトがブロック/終了します:Firefox 14.0.1、Chrome 22; Windows 7:Firefox 14、IE9; OS X Lion:Safari 5、Firefox 14だから、確かに*再現可能です。これはjsfiddleとは無関係で、そのスクリプトをjQuery 1.8.0と一緒にコピーして実行すると同じ効果が得られます。 – Dyna

関連する問題