2009-08-31 13 views
14

Jestem zdecydowanie bez programisty JS (właściwie prawie nie programistą :) ale chciałem spróbować napisać mały skrypt Greasemonkey, aby ukryć kilka elementów na określonej stronie. Kiedy zacząłem go wycinać, zdecydowałem się użyć jQuery, aby to ułatwić. Wszystko poszło dobrze, skrypt działa, ale teraz, kiedy jest gotowy, zacząłem zastanawiać się nad szczegółami.Jak zamrozić repliki przeglądarki podczas zmiany widoczności elementów?

W ramach skryptu muszę znaleźć określony element i ukryć go, wraz z poprzednim i kolejnym rodzeństwem. Ja nie zakończyła się, że czytelne, ale linia pracy:

$('div#some-weird-box').prev().toggle(w).next().toggle(w).next().toggle(w); 

Moja obawa o to, że jestem usunięcie trzech oddzielnych div w trzech oddzielnych etapach. Spowoduje to, że przeglądarka "odświeży" stronę trzy razy, prawda? To nie jest problem z trzema divami, to prawdopodobnie zaczyna mieć znaczenie, gdy jest więcej elementów. Moje pytanie brzmi: czy istnieje sposób, aby powiedzieć przeglądarce "przestań odświeżać/przerysować stronę"? Jeśli tak, mogę go użyć, ukryć dowolną liczbę elementów, a następnie poprosić przeglądarkę o aktualizację ekranu.

Odpowiedz

18

Wykonanie Javascript blokuje przeglądarkę, a nie zobaczysz odświeżenia, dopóki wykonanie kodu nie zostanie zakończone. Naprawdę nie masz się czym martwić.

Zamieściłem to dobry przykład na jsbin.com: http://jsbin.com/ecuku/edit

Aktualizacja: Często zaleca się modyfikowania węzłów poza DOM ponieważ modyfikowania DOM powoduje zmiany układu (nie repaints). Zmiany są dokonywane, gdy przeglądarka musi ponownie obliczyć pozycje i rozmiary elementów na stronie, ponieważ coś się zmieniło. Chociaż wykonywanie skryptów javascript może powodować wielokrotne przepływy, spowoduje tylko jedno przemalowanie (po zakończeniu kodu). Te zmiany mogą być dużym hitem wydajnościowym, ale w przypadku niewielkiej liczby zmian DOM (np. Twój kod ma tylko 3) prawdopodobnie nie warto pracować nad zmianami poza stroną. Również klonowanie węzła i modyfikowanie go poza stroną przed wstawieniem go może mieć nieoczekiwane konsekwencje. Na przykład, jeśli załączono obsługę zdarzeń, trzeba je ponownie dołączyć do nowych węzłów.

+1

Interesujące. Czy jest jakaś dobra lektura, na którą możesz mnie wskazać? Jeśli tak, to dlaczego widzę wszystkie te porady, aby usunąć element z drzewa, zastosować zmiany, a następnie je przywrócić? http://www.slideshare.net/nzakas/writing-efficient-javascript - slajd 77 lub 88 ...? – yacoob

+0

To dość odważne, ogólne stwierdzenie, nie można powiedzieć, że będzie to przypadek w 100% przypadków. –

+0

Nie złożyłem oświadczenia zbiorczego. Złożyłem oświadczenie dotyczące kodu, który opublikował. Nie ma się o co martwić. Będzie widział tylko jedną odświeżoną w dowolnej przeglądarce, a podczas modyfikowania 3 węzłów nie powinien klonować węzła i modyfikować go poza stroną. – Prestaul

2

Można użyć cloneNode. Po klonowaniu można wykonać wszystkie manipulacje klonem i zastąpić oryginalny węzeł. Zapobiegnie to migotaniu treści podczas wyświetlania: brak podobny do J-P.

+0

cloneNode nigdy nie jest dobrym pomysłem, jeśli chcesz manipulować przy DOM. Wszelkie odwołania do starego węzła nie zostaną zaktualizowane do sklonowanego węzła, jak również wszelkie eventHandler na pierwotnym węźle zostaną utracone. – Flexo

Powiązane problemy