2013-03-27 40 views
28

Używam jQuery litebox. Po dodaniu plików JS i CSS otrzymałem ten błąd TypeError:

$(...).on is not a function at this line in js file           
"return $('body').on('click',  
'a[rel^=lightbox], area[rel^=lightbox]', function(e) {" 

Czy ktoś może mi pomóc zrozumieć problem tutaj?

Wykonuję tę implementację w CakePHP 1.3.

+4

Zrobiłeś to jQuery w wersji 1.7 lub nowszej, a ty sam okład Twój kod w dokumencie. Masz już rację? – adeneo

+0

Tak, dodałem jquery 1.7 – user1613870

+0

i nie zaimplementowałem żadnego kodu do lightboxa, jeśli tylko dodaję pliki js i css, otrzymałem ten błąd – user1613870

Odpowiedz

26

Zwykle przyczyną jest to, że jesteś również użyciu prototyp, MooTools, lub jakąś inną bibliotekę, która korzysta z $ symbolem, a ty w tym, że po biblioteki jQuery, i tak, że biblioteka jest " wygrywając "(biorąc dla siebie $). Tak więc wartość zwracana $ nie jest instancją jQuery, więc nie ma na niej metod jQuery (jak on).

Można użyć jQuery z tymi innymi bibliotekami, ale jeśli nie, trzeba użyć jQuery symbol zamiast jego alias $, np

jQuery('body').on(...); 

I to zazwyczaj najlepiej jeśli dodać to natychmiast po tag script tym jQuery, przed tym drugim jednej biblioteki:

<script>jQuery.noConflict();</script> 

... chociaż nie jest to wymagane jeśli załadować oth er biblioteka po jQuery (jeśli najpierw wczytujesz drugą bibliotekę).

Korzystanie z wielu pełnych funkcji bibliotek manipulacji DOM na tej samej stronie nie jest idealne, ale pod względem masy strony. Więc jeśli możesz trzymać się tylko Prototype/MooTools/cokolwiek lub tylko jQuery, zazwyczaj jest lepiej.

+0

Crowder, dzięki za wskazówki, nie dodaję żadnej biblioteki przed jquery, wszystkie biblioteki zostały dodane po bibliotece jquery . Używam tej techniki css ('skin/lightbox.css', 'stylesheet'); ?> i script (array ('libs/lightbox'), array ('inline' => false)); ?> – user1613870

+1

@ user1613870: Tak jak powiedziałem, jeśli dodajesz inną bibliotekę ** po ** jQuery (jak Prototype lub MooTools), będziesz miał ten problem. (Nie, jeśli umieścisz je w * przed *, jeśli zrobiłeś je * przed *, będziesz miał inny problem.) Używasz Prototype lub MooTools? –

49

Problem może być, jeśli używasz starszej wersji jQuery. Ponieważ starsze wersje jQuery mieć metodę zamiast „on”

8

Ten problem został rozwiązany, w moim przypadku, przez umieszczenie mojego jQuery w „na żywo”:

(function($) { 
//my jquery 
})(jQuery); 
3

Jeśli używasz starej wersji jQuery (< 1.7), możesz użyć "bind" zamiast "on". Działa to tylko w przypadku, gdy używasz starej wersji, ponieważ od jQuery 3.0 "bind" jest przestarzałe.

Powiązane problemy