Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [DOM] parsowanie węzłów + dynamiczne dodawanie
erix
post
Post #1





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




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... (IMG:style_emoticons/default/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
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 26.09.2025 - 16:51