2009-07-28 32 views
0

我有一個名爲ValueBox的對象,我喜歡這創造:jQuery的VAL()上的自定義對象方法

function ValueBox(params) { 
    ... 
    $.extend(true, this, $('/* some HTML elements */')); 
    ... 
    var $inputBox = $('input[type=text]', this); 
    ... 
    this.val = function(newValue) { 
     if(typeof newValue == "number") { 
     $inputBox.val(newValue); 
     $inputBox.change(); 
     } else { 
     return parseFloat($inputBox.val()); 
     } 
    } 
} 

我有這觸發每當$inputBox變化的特定ValueBox實例的變化事件,但更改回調函數無法在我的類中使用val()方法。我假設通過使用$(this).val()來調用jQuery val()方法,這當然不起作用。是否可以訪問我定義的val()方法?

+0

「無法使用」的意思究竟是什麼(澄清)。它無法訪問它?你嘗試從螢火蟲中調用val方法嗎?它當然會向我公開。 – geowa4 2009-07-28 15:01:27

+0

我的內容是在更改處理程序中,關鍵字「this」引用元素本身,而不是我創建的對象。如果我包裝像$(this)那樣,它只是使用正常的jQuery對象而不是我的。 – DLH 2009-07-28 15:34:26

+0

哦!好吧,我想我知道一個方法。 – geowa4 2009-07-28 15:55:30

回答

1

當您撥打$inputBox.change()時,將其傳遞給ValueBox對象。然後請撥打val。這樣,您就不必擔心jQuery控件中的範圍問題。

+0

是的,我不太喜歡它,但我認爲這是唯一的方法。謝謝你的幫助。 – DLH 2009-07-29 12:09:06

+0

是的,jQuery將函數應用於自己的作用域,並且您需要某種方式來更改它,而不會破壞jQuery的內部代碼。因此,您需要傳遞該對象。 – geowa4 2009-07-29 12:19:53

-1

我想你應該嘗試類似的東西

function ValueBox(params) { 
    ... 
    $.extend(true, this, $('/* some HTML elements */')); 
    ... 
    this.inputBox = $('input[type=text]', this); 
    ... 
} 

ValueBox.prototype.val = function(newValue) { 
    if(typeof newValue == "number") { 
     this.inputBox.val(newValue); 
     this.inputBox.change(); 
    } else { 
     return parseFloat(this.inputBox.val()); 
    } 
}; 

// then this should work 
var test = new ValueBox(); 
test.val(123); 

在原型定義公共方法,所有這些都是在ValueBox功能是私有的;

+1

'this.val = function ...'絕對不是私人的。 – geowa4 2009-07-28 17:41:22

+0

如果它是'val(){...}',那麼它將是一個私有函數。 – geowa4 2009-07-28 17:43:58

0

如果你在爲你的插件擴展VAL()很感興趣,你可以嘗試類似如下:

讓我們假設你已經設置並在您的插件的最外層元素屬性「值」。

jQuery.fn.extend({ val: function(newValue) { 
    if (newValue == null) { 
     return $(this).attr("value"); 
    } else { 
     $(this).attr("value", newValue);   
    } 
} 
}); 

如果我的插件實例的ID是myValueBox然後我就可以通過以下方式使用VAL:

$( 「#myValueBox」)VAL()

它的工作對我來說,但我不確定它是否符合您的要求。

3
$.fn.yourpluginscope.originalVal = $.fn.val; 
$.fn.extend({ 
    val: function (value) { 
     if (/* detect your plugin element */) 
     { 
      if (value == undefined) 
       return /* getter */; 
      return $.fn.yourpluginscope.originalVal.call(/* setter */, value); 
     } 
     return $.fn.yourpluginscope.originalVal.call(this, value); 
    } 
}); 

正確的方式來擴展「原生」的jQuery方法