Сегодняшнее Techy Treasure — это еще один основной продукт для меня, нечто простое, но я использую его практически во всех написанных мной сценариях. Это метод для получения ссылок на элементы — либо отдельные элементы, либо коллекции элементов, на которые ссылается имя тега и которые могут быть отфильтрованы по совпадению атрибутов.
У большинства библиотек JavaScript есть такая функция, часто называемая $
(доллар). И хотя все они работают немного по-разному, все они делают одно и то же. Так что, если вы новичок в JavaScript, и вам интересно, что находится внутри этих вездесущих долларовых функций, вот вам немного анатомии!
Как и во всех методах, о которых я писал в этом столбце, я демонстрирую это здесь как глобальную функцию, чтобы сделать примеры более простыми; но на практике вам лучше определить его как метод пользовательского объекта :
function get(find, context, conditions) { if(find.indexOf('#') != -1) { return document.getElementById(find.split('#')[1]); } else { if(typeof context == 'undefined') { context = document; } var nodes = [], tmp = context.getElementsByTagName(find); for(var i=0; i<tmp.length; i++) { nodes.push(tmp[i]); } if(typeof conditions == 'undefined') { return nodes; } var filtered = []; for(i=0; i<nodes.length; i++) { var add = true; for(var c in conditions) { if(!conditions.hasOwnProperty(c)) { continue; } var attr = c == 'class' ? nodes[i].className : nodes[i].getAttribute(c); if(attr == null || attr == '' || new RegExp('(' + conditions
+ ')', '') .test (attr) == false)
{
добавить = ложь;
}
}
если (добавить == правда)
{
filtered.push (узлы [I]);
}
}
возврат фильтруется;
}
}Метод
get()
делает три вещи. Во-первых, он может получить один элемент, сокращение дляgetElementById
:var content = get('#content');
Во-вторых, он может получить коллекцию элементов, сокращение для
getElementsByTagName
:var paragraphs = get('p');
Но в-третьих, и что самое интересное, я думаю, он может фильтровать коллекцию элементов по совпадениям атрибутов. Эту функцию составляет метод
getElementsByAttributeMatch()
, где несколько атрибутов могут быть сопоставлены в одном выражении:var codeblocks = get('code', document, { 'class':'javascript' });
Этот третий пример извлекает коллекцию элементов
<code>
которые имеют имя класса «javascript»; или, если быть более точным, элементы, в которых значение атрибутаclass
содержит строку «javascript».На самом деле параметр value каждой пары ключ / значение оценивается как регулярное выражение, поэтому вы можете сделать что-то вроде этого:
var codeblocks = get('code', document, { 'class':'j(ava)?script|php' });
В этих примерах вы заметите, что перед объектом условия есть второй аргумент, который определяет контекст поиска. Вы можете передать другую ссылку на документ, чтобы получить коллекцию в этом контексте (например, страницу внутри
iframe
), или вы можете передать ссылку на элемент, чтобы получить коллекцию дочерних элементов в определенном элементе (например, все элементы списка). в списке).Наконец, то, что возвращает этот метод, также зависит от того, что вы запрашиваете. Для одного элемента он вернет либо этот элемент, либо
null
; для коллекции элементов (независимо от того, отфильтрованы ли они по условиям атрибута или нет) он вернет массив элементов (истинный массив JavaScript, а не коллекцию DOM ), и, если не найдено подходящих элементов, этот массив будет пустым.