Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [DOM] parsowanie węzłów + dynamiczne dodawanie
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
erix
O ile siedzę w JS już jakiś czas, to dzisiaj nastąpił dla mnie zupełny zonk.

Mianowicie, piszę UserJS-a dla Opery do Blipa. Jako entry-point, przeciążyłem metodę Prototype'a Element.insert. Dla tych, którzy nie wiedzą, jak działa Blip - ściąga sobie AJAX-em kod JS, który operuje bezpośrednio na stronie; nie ma żadnego JSON-a, czy czegoś w stylu parsowania, ale to nie jest problem.

I wszystko fajnie-cacy działa, jeżeli są to pojedyncze elementy - moje hooki nie zawodzą.

Jednak problem pojawia się, gdy użytkownik korzysta z paginacji - całe drzewo jest usuwane i metoda Element.insert jest wywoływana wielokrotnie. Wówczas mój skrypt parsuje tylko pierwszy element, w dodatku wielokrotnie. Tak, jakby zmienna z uchwytem elementu była nie uaktualniana przy dodawaniu kolejnych elementów... dry.gif

Metoda przeciążająca:
[JAVASCRIPT] pobierz, plaintext
  1. var overload = function(){
  2. // extract item ID
  3. var Rexpr = /update\-([0-9]+)/i;
  4. // overload Prototype's method
  5. var o = Element.insert;
  6. Element.insert = function(a,b){
  7. // execute filters
  8. for(i in filters){
  9.  
  10. if(filters[i] && (filters[i].test(b.top) || filters[i].test(b.bottom))){
  11. return;
  12. }
  13. }
  14.  
  15. // use Prototype's previous method:
  16. var node = o(a,b);
  17. // and parse
  18. parseNode(node);
  19. }
  20. }
[JAVASCRIPT] pobierz, plaintext


Samo parseNode wykonuje naprawdę podstawowe operacje na DOM, ale wariuje nawet odczyt (sprawdzałem). Liczba wywołań się zgadza, ale same dane już nie - za każdym razem jest to samo albo gdzieś znikają elementy (!)...

Jest to bombardowane w mniej-więcej ten sposób:
[JAVASCRIPT] pobierz, plaintext
  1. $$("li.update").each(function(value, index) {
  2. value.remove();
  3. });
  4. Element.insert("dashboard-updates", { bottom: "..." });
  5. Element.insert("dashboard-updates", { bottom: "..." });
  6. Element.insert("dashboard-updates", { bottom: "..." });
  7. Element.insert("dashboard-updates", { bottom: "..." });
  8. Element.insert("dashboard-updates", { bottom: "..." });
  9. Element.insert("dashboard-updates", { bottom: "..." });
  10. Element.insert("dashboard-updates", { bottom: "..." });
  11. Element.insert("dashboard-updates", { bottom: "..." });
  12. Element.insert("dashboard-updates", { bottom: "..." });
  13. Element.insert("dashboard-updates", { bottom: "..." });
  14. Element.insert("dashboard-updates", { bottom: "..." });
  15. Element.insert("dashboard-updates", { bottom: "..." });
  16. Element.insert("dashboard-updates", { bottom: "..." });
  17. Element.insert("dashboard-updates", { bottom: "..." });
  18. $$('.next-page').invoke('show');
[JAVASCRIPT] pobierz, plaintext



Moje pytanie - co zrobić, abym mógł manipulować obiektami DOM przy ich dodawaniu zamiast całkowitego skanowania po wykonaniu wielu operacji?

edit: najciekawsza jest jednak inna rzecz, spróbowałem dojść krokami, wtf:

[JAVASCRIPT] pobierz, plaintext
  1. // use Prototype's previous method:
  2. var node = o(a,b);
  3. // and parse
  4. parseNode(node);
[JAVASCRIPT] pobierz, plaintext

Kod do funkcji trafia prawidłowy. Jeżeli wyłuskam ID z kodu i odwołam się przez document.getElementById, to do funkcji zostanie dostarczony zawsze pierwszy, ten sam identyfikator. Jakby DOM nie nadążało za samym sobą...? O.o
wookieb
A jest jakaś możliwość abyś wystawił to gdzieś online aby można było się pobawić?
erix
http://eriz.pcinside.pl/files/826690

Przyda się konto na Blipie, podpinasz ten UserJS. Błąd jest widoczny przy przestawianiu stron na kokpicie. Wtedy dzieją się cyrki...
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.