2013-09-27 17 views
5

Piszę niestandardową wtyczkę jQuery, która zasadniczo odtwarza funkcjonalność danych wejściowych. Mógłbym wyjaśnić, dlaczego, ale zgodnie z prawdą wyjaśnienie jest dość długie i uważam, że nie ma to znaczenia dla pytania.Rozszerzanie metody .val() jQuery do elementów bez wprowadzania danych.

Problem pojawia się, gdy próbuję rozszerzyć metodę .val() jQuery na moją niestandardową wtyczkę jQuery. Oto, co próbowałem:

$.fn.custom_text_input = function(options){ 
    return this.each(function(){ 
     var custom_text_input = new CustomTextInput(options, this) 

     $(this)[0].val = function(){ 
      alert('something useful') 
     } 
    }) 
} 

Ive próbował kilka innych odmian tego, wszystkie bez skutku. Jeśli ktokolwiek ma jakieś pomysły, które będą działać, bardzo bym docenił mądrość!

Dzięki!

+0

nie powinien definicja funkcji iść w definicji CustomTextInput? –

+0

Chcę móc wywoływać go z dowolnego miejsca za pomocą selektora jquery. przykład: $ ('# div'). custom_text_input(), a następnie gdzieś indziej w moim kodzie $ ('# div'). val() –

+1

BTW, '$ (this) [0]' jest takie samo jak 'this' . Podczas tworzenia obiektu jQuery w tym obiekcie jQuery znajduje się tablica elementów DOM z zerowym indeksem. Więc kiedy wejdziesz do pierwszego indeksu (zero), otrzymasz pierwszy element. – Jasper

Odpowiedz

4

Aby zastąpić metodę $.val(), należy wykonać polecenie takie, jak $.fn.val = function() {...}. Oto wersja demo: http://jsfiddle.net/CRRP5. Zalecam zapisanie starej metody .val() w zmiennej, aby można było z niej korzystać, gdy .val() jest wywoływana na zwykłym wejściu do formularza.

+1

Czy to nie zastąpi oryginalnego .val() dla wszystkich elementów? Próbuję tego uniknąć, chyba że nie ma innej drogi. Być może istnieje sposób na wywołanie metody .val() jquery z mojej niestandardowej metody .val(), jeśli element nie jest częścią mojej wtyczki? –

+2

@FredGarbutt To właśnie miałem na myśli przez ostatnie zdanie w mojej odpowiedzi. Zapisz starą funkcję '.val()' do zmiennej i wywołaj ją, gdy twoja funkcja '.val()' zostanie wywołana na wejściu formularza. Musisz sprawdzić typ elementu HTML, a jeśli jego dane wejściowe zostaną wprowadzone, zwróć odpowiedź z oryginalnej funkcji '.val()', w przeciwnym razie zwróć odpowiedź z niestandardowej. I tak, to nadpisuje standardowe jQuery '.val()'. – Jasper

+1

@FredGarbutt Alternatywą może być zwrócenie obiektu jQuery z metody 'custom_text_input' ze zaktualizowaną metodą' .val() '. W ten sposób można tylko nadpisać metodę '.val()' dla tego pojedynczego obiektu jQuery. Będzie to coś w stylu 'var $ this = $ (this); $ this.val = function() {...} '. Należy zapisać zwrócony obiekt jQuery jako zmienną, aby był dostępny w przyszłości, ponieważ odtworzenie obiektu jQuery przez wybranie węzła DOM byłoby oparte na globalnej metodzie ".val()", której nie zaktualizowano. To jest niesprawdzone, tylko przyszło mi do głowy. – Jasper

2

Jedynym sposobem, w jaki to zrobisz, jest rozszerzenie wyniku metody jQuery o val().

$(function(){ 
    $.fn.oldVal = $.fn.val 
    $.fn.val = function(value){ 
    //I'm assuming here that you're setting/getting a data value 
    //on the object to keep track of it's "custom value" 
    if(value && $(this).data('custom-input-value')){ 
     return $(this).data('custom-input-value', value); 
    } 
    else if(value = $(this).data('custom-input-value')){ 
     return value; 
    }else{ 
     return value ? $(this).oldVal(value) : $(this).oldVal(); 
    } 
    } 


}) 

To może pracować dla Ciebie: p

Oto jsfiddle z nim pracować: http://jsfiddle.net/Z4c6d/

+0

to jest dokładnie to, czego potrzebowałem! jest to również to, o czym wcześniej mówił mi Jasper. Technicznie obaj mówicie to samo. dzięki za wyraźne odpowiedzi! –

+0

Zaktualizowałem kod tak, aby działał poprawnie ... i zawierał działający jsfiddle. – nzifnab

+0

Znalazłem problem z kodem w jsfiddle, jeśli spróbujesz ustawić wartość obu wejść - zwarcia kodu podczas ustawiania za pomocą oldVal. Zrobiłem aktualizację, która zachowuje się właściwie w takim przypadku: http://jsfiddle.net/Z4c6d/1/ –

Powiązane problemy