2011-11-25 129 views
2

我需要重新定義jQuery val()函數,但我不想混淆源代碼。是否有可能只修改一個元素?重新定義jQuery函數

具體來說,我需要做這樣的事情:$("div.smth").val = function() {return this.innerText;};。但是,val函數未被此代碼修改。我究竟做錯了什麼?

回答

3

您應該修改原型的功能(jQuery調用fn)。這是從$(...).something繼承的所有功能。

$.fn.val = function() { ... }; 

如果你想保存原有的功能:

var old = $.fn.val; // `old` won't be overwritten 

$.fn.val = function() { ... }; 
+0

如何調用原函數從新定義中? – ulu

+1

@ulu:這有點複雜,因爲有一個'this'值需要傳遞。你可以使用'old.call(this,...)',這相當於前面的$(this).val(...)'。如果你想傳遞所有參數,你可以使用'old.apply(this,arguments)'。 – pimvdb

+1

這是如何滿足從「只修改一個元素」這個問題的要求? – nnnnnn

2

這會做你想要什麼,你需要你的新val方法附加到jQuery的插件堆棧:

$.fn.val = function(value) { 
    return this[0].innerText; 
} 
+0

很好的答案,但@ pimvdb是第一個。 – ulu

0

其他答案指出如何替換.val()方法,但是如果您知道只需要一個特定元素,那麼您是不是可以這樣做:

$("div.smth")[0].innerText 

但是無論如何,現有的jQuery .text()方法並沒有那麼多?

+0

關鍵是我想使用現有的jQuery插件(自動完成)與contenteditable div。所以我需要重新定義從該插件調用的val。 – ulu

0
jsval: function(fn) { 
    var that = this; 
    var newfn = function(event) { fn.apply(that, arguments); }; 
    this.click(newfn); 
    return newfn; 
} 

相反,現在你可以打電話給你的正常val和特定DIV,調用​​

+0

關鍵是我想使用一個現有的jQuery插件(自動完成)與contenteditable div。所以我需要重新定義從該插件調用的val。 – ulu