querySelector dla IE7

Właśnie wyczytałem w serwisie Ajaxian informację na temat ciekawej sztuczki dla Internet Explorera 7 i starszych, która pozwala wyszukiwać elementy za pomocą selektorów CSS. W całym projekcie nie byłoby nic dziwnego - ponieważ mamy sporo projektów z własnym modułem wyszukiwania elementów, np. jQuery - gdyby wyszukiwanie nie odbywało się z "natywną szybkością" przeglądarki. Uzyskanie takich rezultatów było możliwe dzięki wyeliminowaniu etapów parsowania treści selektora oraz czasochłonnego wyszukiwania elementów za pomocą DOM.

Projekt wykorzystuje fakt, że Internet Explorer oferuje w implementacji arkuszy stylów funkcjonalność zwaną expressions. Cały trik polega na tym, że podczas każdego wywołania funkcji querySelector, do dokumentu dodawany jest nowy arkusz stylów zawierający selektor przekazany do funkcji i z deklaracją zawierającą wspomniane wyrażenia. Zadaniem expressions jest wypełnienie wynikowej tablicy referencją do każdego elementu pasującego do przekazanego selektora. Po zakończeniu funkcji, dodatkowy arkusz stylów jest usuwany z dokumentu.

Cały kod w wersji zminimalizowanej zajmuje zaledwie 327 znaków.

Poniżej prezentuję kod skryptu.

/*@cc_on 
if(!document.querySelector)
   document.querySelector=function(s){
      d=document;
      h=d.documentElement.firstChild;
      t=d.createElement("STYLE");
      h.appendChild(t);
      d.__q=[];
      t.styleSheet.cssText=s+"{x:expression(this.__q?0:(function(t){document.__q.push(t);t.__q=0;})(this));}";
      window.scrollBy(0, 0);
      h.removeChild(t);
      return d.__q;
}@*/

Skrypt ten oczywiście ma pewne ograniczenia. Głównym problemem jest możliwość stosowania wyłącznie selektorów obsługiwanych przez przeglądarkę. Z tego powodu dla IE6 odpadnie wykorzystanie m.in. selektora dzieci (>). Drugim faktem jest konieczność udostępnienia wynikowej tablicy w globalnym kontekście bądź jako własności dokumentu, żeby funkcja wywoływana z poziomu expressions miała do niej dostęp. Ale pomimo tych wad, skrypt robi niezwykłe wrażenie. Jest to na pewno jedna z ciekawszych sztuczek zaprezentowanych w ostatnich miesiącach.


Kategorie: Internet Explorer, Techblog 28 sierpnia 2009, 14:53:44 3 komentarze

Komentarze dla notki “querySelector dla IE7”

  1. Wasacz - 28 sierpnia 2009, 14:57:26

    Ciekawe :)

    Tylko że querySelector powinien zwrócić referencję do jednego elementu, a querySelectorAll do kolekcji elementów. Ale to już wydaje mi się łatwe do dopisania ;)

    Szkoda, że w silniku IE8 wycięli expressions…

  2. demotywatory - 28 sierpnia 2009, 15:03:13

    dobre, przyda się :)

  3. Rafał - 28 sierpnia 2009, 15:37:13

    W komentarzach w serwisie Ajaxian wypowiedział się też John Resig, który wymienił kilka kolejnych problemów związanych z tą techniką. Poważnym problemem wydaje się być obsługa błędów, np. dla nie obsługiwanych selektorów. Druga sprawa to możliwość wykorzystania funkcji tylko w kontekście aktualnego dokumentu. Nie da się np. wyszukiwać w fragmentach dokumentu (DocumentFragment).

    Ale jak pisałem, mimo tych wszystkich wad technika jest ciekawa i możliwe, że dla niektórych będzie wystarczająca, żeby stosować ją we własnych projektach.

Pozostaw komentarz

Copyright © 2003-2011 Rafał Kukawski. Powered by Jogger | RSS Subskrybuj