TreeWalker#
TreeWalker.filter#
Właściwość filter
zwraca filtr skojarzony z danym przemierzaczem drzewa. Właściwość jest tylko do odczytu.
Opis działania#
Samo wywołanie i poszczególne jego części najlepiej objaśnić na zapisie składniowym:
var walker_filter = treeWalker.filter;
gdzie poszczególne człony oznaczają:
- walker_filter - filtr w postaci obiektu lub domyślna wartość
null
. - treeWalker - przemierzacz drzewa będący obiektem kontekstu.
Filtr jest ustawiany bezpośrednio przy tworzeniu przemierzacza drzewa (jako trzeci argumenty) za pomocą metody Document.createTreeWalker()
i nigdy nie ulega zmianie. Wartość zwracana przez właściwość filter
bezpośrednio zależy od tego trzeciego argumentu:
- W przypadku pominięcia argumentu zwrócona zostanie domyślna wartość
null
, co z perspektywy algorytmu przefiltrowania jest równoważne filtrowi zwracającemu wartość1
(stałaNodeFilter.FILTER_ACCEPT
). - W przypadku przekazania argumentu wszystko zależy od sposobu utworzenia filtra, którym może być funkcja lub standardowy obiekt JS z metodą o nazwie "
acceptNode
".
Prosty przykład:
<script>
// Tworzymy nowego przemierzacza drzewa z domyślnym filtrem
var walker1 = document.createTreeWalker(document);
// Tworzymy nowego przemierzacza drzew z konkretnym filtrem
var walker2 = document.createTreeWalker(document, 1, function(){
return 1;
});
// Tworzymy nowego przemierzacza drzew z konkretnym filtrem
var walker3 = document.createTreeWalker(document, 1, {
acceptNode: function(){return 1;}
});
document.write(walker1.filter); // null
document.write("<br><br>");
document.write(walker2.filter); // function (){ return 1; }, w Chrome [object NodeFilter] (błędnie)
document.write("<br>");
document.write(walker2.filter.SHOW_ALL); // undefinded, w Chrome 4294967295 (błędnie)
document.write("<br>");
document.write(walker2.filter.acceptNode); // undefinded, w Chrome function acceptNode() { [native code] } (błędnie)
document.write("<br><br>");
document.write(walker3.filter); // [object Object], w Chrome [object NodeFilter] (błędnie)
document.write("<br>");
document.write(walker3.filter.SHOW_ALL); // undefinded, w Chrome 4294967295 (błędnie)
document.write("<br>");
document.write(walker3.filter.acceptNode); // function (){return 1;}, w Chrome function acceptNode() { [native code] } (błędnie)
document.write("<br><br>");
// Tworzymy nowego przemierzacza drzew z konkretnym filtrem
function test(){};
var walker4 = document.createTreeWalker(document, 1, test);
document.write(test == walker4.filter); // true, w Chrome false (błędnie)
</script>
W przykładzie widzimy, że przeglądarka Chrome błędnie zwraca wartość dla właściwości filter
. W rzeczywistości otrzymujemy nowy obiekt implementujący interfejs NodeFilter, z którego można nawet odczytać konkretne stałe (te same co w interfejsie NodeFilter). Oczywiście jest to nieprawidłowe zachowanie, interfejs NodeFilter jest typu zwrotnego, dlatego należy zaimplementować go samodzielnie w klasycznym obiekcie JS, a ów obiekt powinien zostać zwrócony przez właściwość filter
. Firefox, IE i Opera (Presto) działają prawidłowo.
Składnia Web IDL#
interface TreeWalker { readonly attribute NodeFilter? filter; }