2011-07-21 23 views
2

の拡張メソッドを呼び出すことはできません。は、私は以下のようなHTML何かを持っているjQueryオブジェクト

quote = $(".quote.prototype").clone().show() 
     .removeClass("prototype").addClass("live") 
     .addClass(foo) 
     .appendTo("#quoteContainer"); 

$.extend(quote, QuoteCalculator); 
quote.setQuoteClass(foo); 

Fooは、 "q"と引用符の数を組み合わせた変数です。 QuoteCalculatorクラスには、(ex。)shout()など、いくつかの呼び出したいメソッドがあります。ここではQuoteCalculatorの一部です:

var QuoteCalculator = { 
    ... 

    shout: function() { 
     console.log("hello from calculator"); 
    }, 

    ... 
};  

私はプログラムの別のポイントで、シャウトメソッドを呼び出したいと思います。ここに私のコードは次のようになります。)(this.shout [このエラーのブレーク] this.shoutが機能 ではありません。:ここでは

$(".quote.live").each(function() { 
     this.shout(); 
}); 

は言う放火犯であります

編集:これは変わった部分です:quote.setQuoteClass(foo)を呼び出してもエラーは発生しません。逆に、それは完全に動作します。

なぜこの問題が発生するのですか、原因は何ですか?また、どのように修正しますか?

答えて

2

quoteがDOMオブジェクトであると思われます。代わりに、DOMを参照するjQueryオブジェクトです。これを試してみてください:

$.extend(quote.get(0), QuoteCalculator); 
+0

+1私はその可能性を考慮していませんでしたが、意味があります。彼はDOM要素を拡張していると思っているか、jQueryのプロトタイプを拡張していると思っています。どちらも実際には起こっていません。 – JAAulde

+0

getはDOMを拡張するでしょうか? – BlackSheep

+0

ありがとう、私はこれを試み、それは問題を解決した。 +1素晴らしいです。 – BlackSheep

3

あなたの拡張:

$.extend(quote, QuoteCalculator); 

は、jQueryの機能のインスタンスを延長しています。 ではなく、 jQueryプロトタイプを拡張して、前のコレクション(quote)にあった要素の新しいクエリでもメソッドを取得できるようにします。その^^

$(".quote.live") 

はあなたが拡張quoteに保存されているインスタンスに接続されていないのjQueryの新しいインスタンスで、その結果、新しいクエリです。

plugin authoringを調べ、jQueryの「クラス」(jQuery関数のプロトタイプ)を拡張して、ファクトリから返されたjQueryのすべてのインスタンスが必要なメソッドを持つようにする必要があります。

+0

jQueryのプロトタイプを拡張したいと思っていないのであれば、nrabinowitzは彼の答えで頭に釘を打つと思います。 – JAAulde

+0

私がやりたいことは、プロトタイプではなくDOMを拡張することだと思います。 – BlackSheep

+0

右の音が - nrabinowitzが答えを持っています! – JAAulde

関連する問題