2011-11-18 23 views
8

Podpis funkcji jQuery .on jestdwuznaczność interpretacji opcjonalne parametry

$ (elementy) .W (zdarzenia [selektor] [, dane] Wózek);

gdzie selector i data są opcjonalne. Dlatego wywołanie funkcji

$ (elementy) .on (var1, var2, var3);

mogłoby być interpretowane z var2 albo jako selector lub jako data. Czy jest niejednoznaczność?

Bardziej ogólnie, jak jest niejednoznaczność z opcjonalnych parametrów rozpatrywanych dla jakiejkolwiek innej funkcji jQuery?

+2

+1 często się nad tym zastanawiałem. – jondavidjohn

Odpowiedz

4

Jeśli tylko jeden z parametrów selektora i dane są dostarczane i wartość jest ciągiem zakłada się selektor.

Z jQuery doco for .on():

Argument dane mogą być dowolnego typu, ale jeśli stosuje się ciąg selektor musi albo być dostarczone lub wyraźnie przekazywane jako wartość null tak, że dane nie są mylone z selektora. Najlepszą praktyką jest użycie obiektu (mapy), aby wiele wartości można było przekazywać jako właściwości.

Podobna zasada dotyczy innych metod jQuery z opcjonalnymi parametrami.

1

Selektor jest ciągiem znaków, a dane obiektem. Test powinien być podobny.

if (typeof var2 === 'string') { 
    // var2 is selector 
} else { 
    // var2 is data 
} 

Edit, rzeczywiste źródło jQuery z https://github.com/jquery/jquery/blob/master/src/event.js

on: function(types, selector, data, fn, /*INTERNAL*/ one) { 
    var origFn, type; 

    // Types can be a map of types/handlers 
    if (typeof types === "object") { 
     // (types-Object, selector, data) 
     if (typeof selector !== "string") { 
      // (types-Object, data) 
      data = selector; 
      selector = undefined; 
     } 
     for (type in types) { 
      this.on(type, selector, data, types[ type ], one); 
     } 
     return this; 
    } 
1

Dla podanego przykładu argumenty oczekują różnych typów obiektów. Argument selector powinien być ciągiem, a data powinien być obiektem. Można je odróżnić za pomocą operatora typeof. Na przykład:

if(typeof selector === "string") { 
    //We know that the 2nd argument is actually a selector string 
} 

Należy pamiętać, że jeśli nie trzeba przekazać ciąg na on jako data argumentu selector argumentem musiałaby być określona zbyt (nawet jeśli tylko przechodzą w null).

1

Oto trochę źródła jquery. Zasadniczo analizują typy parametrów i w razie potrzeby przypisują je do innych parametrów. Na przykład, jeśli pozycja w pozycji "selektora" na liście parametrów nie jest łańcuchem znaków, zakłada się, że miała ona być parametrem "data" i tak dalej.

on: function(types, selector, data, fn, /*INTERNAL*/ one) { 
    var origFn, type; 

    // Types can be a map of types/handlers 
    if (typeof types === "object") { 
     // (types-Object, selector, data) 
     if (typeof selector !== "string") { 
      // (types-Object, data) 
      data = selector; 
      selector = undefined; 
     } 
     for (type in types) { 
      this.on(type, selector, data, types[ type ], one); 
     } 
     return this; 
    } 

    if (data == null && fn == null) { 
     // (types, fn) 
     fn = selector; 
     data = selector = undefined; 
    } else if (fn == null) { 
     if (typeof selector === "string") { 
      // (types, selector, fn) 
      fn = data; 
      data = undefined; 
     } else { 
      // (types, data, fn) 
      fn = data; 
      data = selector; 
      selector = undefined; 
     } 
    } 
1

Mam własne skrupułów z .on(), a także ...

Kontekst this był zawsze bardzo wyraźny w przypadku delegata kontra wiązania (lub dowolnego skrótu wiązania). Teraz z on kontekst mogą zmieniać się bardzo gwałtownie ...

na przykład

//This is pretty clear, you now want to turn the paragraph tag red when clicked 
$('p').on('click', function() { 
    $(this).css('color', 'red'); 
}); 

//Woah... so the context of `this` just changed by a single argument 
//this now refers to all anchor tags that are descendants of paragraph tags. 
$('p').on('click', 'a', function() { 
    $(this).css('color', 'red'); 
}); 

Jest to metoda PIERWSZA jQuery kiedykolwiek zmienić kontekst this prostu przekazując inny argument.

Szybki fakt: - delegate - (w 1.4.2) była pierwszą metodą niewykorzystania selektora do przedstawienia kontekstu funkcji wywołania zwrotnego. Ale przynajmniej było nadal jasne ... kiedy widzisz .delegate(), rozumiesz, co się dzieje.

+0

'this' dotyczy elementu określonego, tak jak powiedziałeś - elementu w twoim drugim przykładzie. dlaczego takie zaskoczenie? W każdym razie jest to całkowicie nie na temat. – nnnnnn

+0

@nnnnnn dwuznaczność funkcji on() jest wyłączona? –

+0

Tak. Pytanie dotyczy interpretacji parametrów opcjonalnych dla funkcji on() i innych funkcji jQuery. Punkt, o którym mówimy o on on(), jest wart dyskusji osobno, ale nie odnosi się do tego, w jaki sposób jQuery rozwiązuje opcjonalne parametry. (Nie martw się, nie padłem ani nic.) – nnnnnn

Powiązane problemy