2011-07-21 118 views
2

的擴展方法我有HTML類似如下:無法調用jQuery對象

<div id="quoteContainer"> 
    <div class="quote prototype"></div> 
    <div class="quote live q0"></div> 
    <div class="quote live q1"></div> 
    <div class="quote live q2"></div> 
    <div class="quote live q3"></div> 
    ... 
</div> 

這裏每個現場的div是原型股利coppies。下面是進行復制的代碼:

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

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

美孚是結合「Q」和報價的數量的變量。 QuoteCalculator類有幾個我想調用的方法,包括(例如)shout()。這裏是QuoteCalculator的一部分:

var QuoteCalculator = { 
    ... 

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

    ... 
};  

在程序的另一個點,我想調用shout方法。這裏是我的代碼:

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

這裏是螢火說: this.shout不是一個函數 [打破這個錯誤] 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「class」(jQuery函數的原型),以便工廠返回的所有jQuery實例都具有您想要的方法。

+0

如果我不太對,你想擴展jQuery原型,那麼我認爲nrabinowitz用他的答案擊中頭部。 – JAAulde

+0

我認爲我想要做的是擴展DOM而不是原型。 – BlackSheep

+0

聽起來很對 - nrabinowitz爲你解答! – JAAulde

相關問題