NodeIterator#
NodeIterator.filter#
Właściwość filter
zwraca filtr skojarzony z danym iteratorem węzłowym. 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 iterator_filter = nodeIterator.filter;
gdzie poszczególne człony oznaczają:
- iterator_filter - filtr w postaci obiektu lub domyślna wartość
null
. - nodeIterator - iterator węzłowy będący obiektem kontekstu.
Filtr jest ustawiany bezpośrednio przy tworzeniu iteratora węzłowego (jako trzeci argumenty) za pomocą metody Document.createNodeIterator()
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 iteratora węzłowego z domyślnym filtrem
var iterator1 = document.createNodeIterator(document);
// Tworzymy nowego iteratora węzłowego z konkretnym filtrem
var iterator2 = document.createNodeIterator(document, 1, function(){
return 1;
});
// Tworzymy nowego iteratora węzłowego z konkretnym filtrem
var iterator3 = document.createNodeIterator(document, 1, {
acceptNode: function(){return 1;}
});
document.write(iterator1.filter); // null
document.write("<br><br>");
document.write(iterator2.filter); // function (){ return 1; }, w Chrome [object NodeFilter] (błędnie)
document.write("<br>");
document.write(iterator2.filter.SHOW_ALL); // undefinded, w Chrome 4294967295 (błędnie)
document.write("<br>");
document.write(iterator3.filter.acceptNode); // undefinded, w Chrome function acceptNode() { [native code] } (błędnie)
document.write("<br><br>");
document.write(iterator3.filter); // [object Object], w Chrome [object NodeFilter] (błędnie)
document.write("<br>");
document.write(iterator3.filter.SHOW_ALL); // undefinded, w Chrome 4294967295 (błędnie)
document.write("<br>");
document.write(iterator3.filter.acceptNode); // function (){return 1;}, w Chrome function acceptNode() { [native code] } (błędnie)
document.write("<br><br>");
// Tworzymy nowego iteratora węzłowego z konkretnym filtrem
function test(){};
var iterator4 = document.createNodeIterator(document, 1, test);
document.write(test == iterator4.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 NodeIterator { readonly attribute NodeFilter? filter; }