2010-01-13 12 views
27

Czy istnieje sposób na łatwe zastąpienie funkcji jQuery za val()?Zastąpić funkcję jQuery .val()?

Powodem, dla którego chcę go zastąpić, jest to, że chcę dodać przetwarzanie za każdym razem, gdy wartość jest ustawiona dla elementu. I nie chcę tworzyć innego ustawienia wartości niestandardowej, na przykład myVal().

+0

Przyjmuję założenie, że zdarzenie .change() nie działa tutaj dla ciebie? –

+0

@ Mark: Kiedy ustawiam wartość elementów wykonując $ ("# foo"). Val ("someValue") zdarzenie .change() nie zostanie wywołane. Wydaje się, że wyzwalana jest tylko wtedy, gdy wartość zmieniana jest przez użytkownika w GUI/przeglądarce. – 7wp

+0

$ ('# foo'). Val ("someValue"). Trigger ("change"); może być użyteczne, aby łańcuch spustu tam ... –

Odpowiedz

46

można przechowywać odniesienie do oryginalnego val funkcji, a następnie zastąpić je i wykonać obróbkę, a później powołać go call, aby użyć właściwego kontekstu:

(function ($) { 
    var originalVal = $.fn.val; 
    $.fn.val = function(value) { 
    if (typeof value != 'undefined') { 
     // setter invoked, do processing 
    } 
    return originalVal.call(this, value); 
    }; 
})(jQuery); 

pamiętać, że można odróżnić getter call $(selector).val(); i wywołanie setera $(selector).val('new value'); po prostu sprawdzając, czy argument value jest undefined czy nie.

+0

Dziękuję, doceniam. – 7wp

+4

To nie zadziała (przynajmniej nie w jQuery 1.7). Oryginalna funkcja jQuery polega na liczeniu argumentów, więc będzie traktowała pierwotne wywołanie metody val() zawsze jako narzędzie ustawiające. Aby to naprawić, zastąp "return originalVal.call (this, value);" z "return originalVal.apply (this, arguments);" – dkl

+4

Ani oryginalna ani proponowana zmiana przez @dkl nie działa z Chrome. Używanie atrybutu if..else do sprawdzenia, czy uzyskujesz lub ustawienia działają. Poniżej przedstawiono przezroczyste zastąpienie, w razie potrzeby zmień. (funkcja ($) { var originalVal = $ .fn.val; $ .fn.val = funkcja (wartość) { jeśli (wartość typeof == zdefiniowana ") { powrotu originalVal.call (tym); } else { return originalVal.call (this, value); } }; }) (jQuery); – Martijn

1

Jeśli jestem zrozumienia pan rację, coś takiego powinno wystarczyć dobrze:

jQuery.fn.val = function (new_val) { 
    alert("You set a val! How wonderful!"); 
    this.value = new_val; 
}; 

Tylko upewnij się, że obejmują regularne funkcje: Wprowadzenie wartości wybiera i tak dalej. Po prostu trzymaj ten kod po po zwykłej bibliotece jQuery.

+0

Nie kopiuj oryginalnego zachowania, po prostu wywołaj je jawnie, aby zapewnić kompatybilność z innymi zastąpieniami funkcji val(). – Martijn

+0

@Martijn: Gdybym wiedział dwa lata temu, co wiem teraz, zrobiłbym to. Ale niestety jest to trochę za późno. – Reid

2

Wiem, że problem jest stary, ale po prostu dać pełne rozwiązanie. Aby zarówno jQuery.val(), jak i jQuery.val (wartość) działały po nadpisaniu, należy go przesłonić odpowiednio i osobno. Ponieważ podczas wywoływania jQuery.val(), a następnie originalVal.call (this, value); nie będzie działać poprawnie.

Aby zrobić to we właściwy sposób, musisz zrobić coś takiego, gdy otrzymasz wartość: originalVal.call (this);

Tu jest miejsce, gdzie wszystko jest wyjaśnione: http://extremedev.blogspot.com/2012/01/override-jqueryval-and-jqueryvalvalue.html

Pozdrowienia, Roman

+5

Dzięki Romanowi już to wiedziałem, ale jesteś w pewnym sensie samoprzylepny dla swojej witryny. Byłoby bardziej przydatne, gdybyś przynajmniej wkleił pełną odpowiedź w przepełnienie stosu. W ten sposób, jeśli Twoja witryna kiedykolwiek zniknie z internetu, Twoja odpowiedź na tej stronie będzie nadal widoczna dla ludzi. Byłoby o wiele bardziej pomocne Roman. Dziękuję za wysiłek. – 7wp

+1

@ 7wp +1 ładny komentarz. –

+0

Byłoby miło, gdyby ten kod zadziałał! Gdzie jest zdefiniowane "widgetElementId", zanim spróbujesz rozwiązać problem za pomocą jQuery? –

15

Wiem, że to stary przedmiot, ale jest to pierwszy w wyszukiwarce Google i odpowiedź nie jest całkowicie rację ...

Na przykład, jeśli spróbujesz w konsoli $('#myinput').val(), powinieneś otrzymać wartość #myinput.

Ale jeśli nie $('#myinput').val(undefined) należy ustawić wartość #myinput! ( z aktualną odpowiedź i komentarze o tym, że nie będzie ustawić wartość #myinput)

Oto odpowiedź, że zmodernizowane użyj arguments.

(function ($) { 
    var originalVal = $.fn.val; 
    $.fn.val = function(value) { 
    if (arguments.length >= 1) { 
     // setter invoked, do processing 
     return originalVal.call(this, value); 
    } 
    //getter invoked do processing 
    return originalVal.call(this); 
    }; 
})(jQuery); 

jeśli chcesz przejść wszystkie argumenty można również użyć zastosować

(function ($) { 
    var originalVal = $.fn.val; 
    $.fn.val = function(value) { 
    if (arguments.length >= 1) { 
     // setter invoked, do processing 
    } else { 
     //getter invoked do processing 
    } 
    return originalVal.apply(this, arguments); 
    }; 
})(jQuery); 

Mam nadzieję, że to pomoże!

+0

Świetna odpowiedź! Działa świetnie. – Rajesh

0

mam coś do dodania do CMS odpowiedź, moja realizacja różniłaby i być tak:

(function ($) { var fnVal = $.fn.val; 
    $.fn.val = function(value) { 
     if (typeof value == 'undefined') { 
      return fnVal.call(this); 
     } 
     var result = fnVal.call(this, value); 
     $.fn.change.call(this); 
     // here you can add some more implementation 
     return result; 
    }; 
})(jQuery); 

przestrzegać $ .fn.change.zadzwoń (to); zostanie wywołany przed wyjściem z funkcji val (''), która uruchomi również .change() dla każdego przypisania val ('').

Powiązane problemy