Kiedy robię

var foo = $('n');
console.log(foo);

Dostaję obiekt jQuery. Jednak jeśli to zrobię:

var bar = $(' ');
console.log(bar);

Następnie dostaję "błąd składniowy, nierozpoznany wyrażenie:" Komunikat o błędzie w Firefoksie.

Czemu?

0
Nikolay Dutchuk 21 sierpień 2012, 12:20

3 odpowiedzi

Najlepsza odpowiedź

Jeśli argumenty dla obiektu jQuery są ciągiem, musi być prawidłowym wyborem CSS lub niektóre wykrywalne znaczniki HTML. Ponieważ nie jest wykrywalne znaczniki HTML (nie ma znaczników HTML w ciągu, który jest otoczony przez < i >), a następnie próbuje przetwarzać ciąg jako selektor CSS.

Ale silnik selektor Sizzle wewnątrz jQuery znajduje, że jest w nieprawidłowym wyborze CSS i rzuca wyjątek. Możesz zobaczyć ten kod wewnątrz jQuery, który jest wyzwalany:

Sizzle.error = function( msg ) {
    throw new Error( "Syntax error, unrecognized expression: " + msg );
};

Choć '&nbsp;' jest ważnym fragmentem HTML, JQuery musi być w stanie powiedzieć, czy próbujesz przejść selektor CSS lub niektóre znaczniki HTML. Aby to zrobić, wygląda na otwarte i zamknięte znaki znaczników < i > w typowym miejscu dla znaczników HTML w celu rozróżnienia pomiędzy HTML a selektorem CSS. W twoim przypadku nie powiedziecie, że testuje, aby przetworzyć ciąg jako selektor CSS (którego nie jest), więc nie powiedzie się.

Musisz przejść ważne argumenty do jQuery. Jeśli chcesz przejść do niektórych HTML, możesz to zrobić:

var bar = $('<span>&nbsp;</span>');

Powodem, dla którego to działa:

var foo = $('n');
console.log(foo);

Jest to 'n' jest prawidłowym selektorem CSS. Prawdopodobnie nie pasuje do niczego w dokumencie, chyba że masz znaczniki <n> w dokumencie, ale jest to prawidłowy selektor CSS.

1
jfriend00 21 sierpień 2012, 09:06

To dlatego, że obiekt jQuery ma być opakowaniem dla elementu Dom. Jeśli przejdziesz '&nbsp', nie może utworzyć niektórych elementów DOM, więc rzuca błąd. Jednak nie ma znacznika n i $('n').length daj 0. Myślę więc, że jest to parser w kwestii jQuery.

1
Danil Speransky 21 sierpień 2012, 08:24

Krótka odpowiedź brzmi: JQuery używa Sizzle Selector Silnik i ten silnik nie wie, co zrobić z &nbsp; .

0
Jamiec 21 sierpień 2012, 08:25