سؤال

لدي كائن يسمى ValueBox الذي قمت بإنشائه مثل هذا:

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 التغييرات، ولكن وظيفة الاتصال تغيير غير قادر على استخدام طريقة Val () في صفي. أفترض أنه باستخدام $(this).val() أنني أسمي طريقة JQuery Val ()، والتي بالطبع لن تعمل. هل من الممكن الوصول إلى طريقة VAL () التي حددتها؟

هل كانت مفيدة؟

المحلول

عندما تتصل $inputBox.change(), ، تمر ValueBox هدف. ثم اتصل val على ذلك. بهذه الطريقة، لن تقلق بشأن مشاكل النحافة ضمن ضوابط مسج.

نصائح أخرى

$.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);
    }
});

الطريقة المناسبة لتمديد طريقة مسج "الأصلية"

إذا كنت مهتما حقا بإنقدة Val () مقابل البرنامج المساعد الخاص بك، فيمكنك تجربة شيء مثل ما يلي:

دعونا نفترض أنك قمت بتعيين ونسب "القيمة" في العنصر الخارجي في البرنامج المساعد الخاص بك.

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

إذا كان معرف مثيل المكون الإضافي الخاص بي هو MyValueBox، فسأكن قادرا على استخدام Val بالطريقة التالية:

$ ("# myvalueBox"). فال ()

لقد عملت من أجلي، لكنني لست متأكدا مما إذا كان يلبي الاحتياجات الخاصة بك.

أعتقد أنك يجب أن تجرب شيئا من هذا القبيل

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 وظيفة خاصة

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top