jQuery.extendとjQuery.fn.extendの違いは?


83

2つのプラグインを1つにマージしたいので、jqueryプラグインの構文を理解しようとしています。インターバルを停止したり、何度も実行したりできる必要があるウインカー。

とにかく、この構文はと同じですか

jQuery.fn.extend({
    everyTime: function(interval, label, fn, times) {
        return this.each(function() {
            jQuery.timer.add(this, interval, label, fn, times);
        });
    },
    oneTime: function(interval, label, fn) {
        return this.each(function() {
            jQuery.timer.add(this, interval, label, fn, 1);
        });
    },

この

$.fn.blink = function(options)
    {

first(without =)は、一度に複数のメソッドを設定する方法のように見えるためです。これは正解?また、私がここにいる間、要素といくつかのロジックをjqueryオブジェクトに追加する理由は何でしょうか?

jQuery.extend({
    timer: {
        global: [],
        guid: 1,
        dataKey: "jQuery.timer",

(これはタイマープラグインからのものです)


あなたの学習のカスタムjQueryプラグインを開発した場合、私はこのスレッド読むことをお勧め stackoverflow.com/questions/1117086/...
CrandellWS

回答:


89

jQuery.extendは、追加の関数でオブジェクトを拡張するために使用されますが、jQuery.fn.extendは、jQuery.fnオブジェクトを拡張するために使用されます。これにより、実際には、(各関数を個別に割り当てる代わりに)一度に複数のプラグイン関数が追加されます。

jQuery.extend

var obj = { x: function() {} }

jQuery.extend(obj, { y: function() {} });

// now obj is an object with functions x and y

jQuery.fn.extend

jQuery.fn.extend( {
        x: function() {},
        y: function() {}
});

// creates 2 plugin functions (x and y)

1
おかげで、複数のオブジェクトを割り当てることについては明らかですが、いつjquery.extendを使用すべきかはまだわかりません。fn.extendで行うことをjquery.extendに渡すのはなぜですか?2つの質問をしたので、これについて新しい質問を投稿することもできます。
リチャード

13
jQuery.extend()は、実際には、独自のjavascriptコードで使用して、オブジェクトを一般的な方法で拡張できる便利な関数です。これは、jQueryの「ユーティリティ」関数の一部です(DOM操作には使用されません)
Philippe Leybaert 2010年

74
jQuery.extend({
    abc: function(){
        alert('abc');
    }
});

使用法:$.abc()。(のようにセレクターは必要ありません$.ajax()。)

jQuery.fn.extend({
    xyz: function(){
        alert('xyz');
    }
});

使用法:$('.selector').xyz()。(セレクターが必要です$('#button').click()。)

主に実装に使用され$.fn.each()ます。

お役に立てば幸いです。


20

jQuery.extendとjQuery.fn.extendの違いは?

実際には、それらの基本参照以外に何もありません。でjQueryのソース、あなたが読むことができます:

jQuery.extend = jQuery.fn.extend = function() { … };

それで、それはどのように機能しますか?ドキュメントは読み取ります。

2つ以上のオブジェクトのコンテンツを最初のオブジェクトにマージします。

これは、プロパティをコピーするfor-in-loopであり、ネストされたオブジェクトを再帰するフラグが追加されています。そして別の機能:

に引数が1つだけ指定されている$.extend()場合、これはターゲット引数が省略されたことを意味します

 // then the following will happen:
 target = this;

したがって、関数がjQuery(明示的なターゲットなしで)それ自体で呼び出されると、jQuery名前空間が拡張されます。また、関数がjQuery.fn(明示的なターゲットなしで)呼び出されると、すべての(プラグイン)メソッドが配置されているjQueryプロトタイプオブジェクトが拡張されます。


私の賛成!!!! これに。私はソースコードを見て、jQueryがどのように拡張されるかを確認していました
dekdev 2013

15

このブログ投稿には素晴らしい説明があります:

$.fn.extend({
myMethod: function(){...}
});
//jQuery("div").myMethod();

$.extend({
myMethod2: function(){...}
});
//jQuery.myMethod2();

引用:

原則として、関数の場合はjQueryオブジェクトを拡張し、メソッドの場合はjQuery.fnオブジェクトを拡張する必要があります。メソッドとは対照的に、関数はDOMから直接アクセスされません。


1
'DOMから直接メソッドにアクセスする'とはどういう意味ですか?
ダンニッセンバウム2016年

1
directly from the DOM関数呼び出しとオブジェクトプロパティ/プロトタイプ呼び出し(ネイティブDOMオブジェクトのjQueryラッパー上)の非常に基本的なJavaScriptの概念を指します。例を参照して違いを見つけ、例のコードが互換性がない理由を考えてみてください。
givenkoa 2016年

10
$.fn.something= function{};

jQuery.prototypeを指し、「this」を介してdom要素にアクセスできるようにします。今、あなたは使用するかもしれません$(selector).something();ので、これは次のようなプラグイン関数として機能します$(selector).css();

$.something = function{};

プロパティまたは関数をjQueryオブジェクト自体に追加し、uはdomアクセスに「this」を使用できません。これで、uはそれを$.something();として使用できます。これはユーティリティ関数として機能します$.trim()

だが

$.fn.extend({function1(), function2()}) and  $.extend({function1(), function2()}) 

同時に複数の関数を追加できます。また、複数のオブジェクトを提供する場合は、2つのオブジェクトリテラルをマージするために使用できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.