2010-01-15 2 views
0

Я пытаюсь получить некоторые элементы с именем класса «special». Я нашел следующий скрипт онлайн, но он возвращает только пустой массив.getElementsByClassName & IE

Кто-нибудь видит, что не так?

getElementsByClassName = function (node, classname){ 
var a = [], 
    re = new RegExp('\b' + classname + '\b'), 
    els = node.getElementsByTagName("*"), 
    l = els.length, 
    i; 

for (i = 0; i < l; i += 1) { 
    if (re.test(els[i].className)) { 
     a.push(els[i]); 
    } 
} 
console.log(a) 
return a; 
} 

var wrap = document.getElementById('wrap'); 
getElementsByClassName(wrap, 'special') 

обертка содержит 22 детей, последний из которых является <p class="special">Lorem</p>, и в поджигатель я получаю весь путь вниз, чтобы найти узел с именем класса, но затем он прыгает a.push. Я потерялся!

редактировать: в порядке, так что делает работу сейчас, он все равно будет интересно, хотя бы знать, почему console.log (а) возвращает пустой массив

+0

что им пытаются сделать, это: если (wrap.getElementsByClassName («ар»).длина) { do .. } он отлично работает, если FF, но не в том, потому что он не поддерживает getElementsByClassName – patad

+1

«ar a = new Array();» line ... не должно быть «var a = new Array();» или еще лучше, "var a = [];" – scunliffe

+0

Запрещено использование jQuery или Sizzle? –

ответ

3

ре = новый RegExp ('\ Ь' + имя_класса + '\ Ь'),

\b в строковый литерал является забой характер. Они имели в виду:

var re= new RegExp('\\b' + classname + '\\b'); 

Однако это еще не так, потому что:

  1. он не будет работать для любых названий класса, которые содержат не-ASCII или не алфавитно-цифровые символы, как бы поставить слово границы в неправильном месте;

  2. имена классов могут содержать символы, имеющие особое значение в регулярном выражении, например .; их нужно будет избежать.

Вы можете найти альтернативную реализацию, которая должна соответствовать стандартной document.getElementsByClassName интерфейс лучше this question.

+0

Хороший вопрос о различных персонажах. =) – BYK

+1

Ур совершенно прав, хороший момент! Я не буду использовать это снова, тогда но atm i KNOW точно, что имя класса будет «особенным», и больше ничего, поэтому я думаю, что он работает в этом конкретном случае. – patad

1

Может быть, я ошибаюсь, но я не думаю, что re.test(els[i].className) будет включать в себя границы слова \b, поэтому регулярное выражение не выполняется.

То есть вы просто передаете «специальные» без какого-либо пробела или кавычек или других пограничных символов вокруг него.

+0

... так что попробуйте без \ b вообще ... О, или, может быть, на самом деле вам нужно '\\ b' + classname + '\\ b'. Теперь я просто стреляю в темноту. – Jay

+0

когда я debugg и использовать \\ Ь + Classname \\ Ь, я получаю: п =/\ bspecial \ б/ – patad

5
re = new RegExp('\b' + classname + '\b') 

Должно быть

re = new RegExp('\\b' + classname + '\\b') 

Кроме того, вы должны использовать "вар" в начале переменной declerations.

+0

прямо сейчас я чувствую себя как придурок , что на самом деле в этот раз, но не в первый раз хммм Я думаю, что, возможно, я немного смутился, когда увидел re =/\ bspecial \ b/при отладке хорошо спасибо за это! – patad

+0

Не чувствуйте себя плохо, это нормальная ошибка =) Также вы должны проверить точки bobince, упомянутые в его/ее ответе. На самом деле вы можете сделать этот «принятым ответом», так как он имеет гораздо больше информации, чем моя =) – BYK

+0

Вы били меня на 5 минут! – bobince

0

Я думаю, что вам нужно сделать, это что-то вроде:

els = document.all ? node.all : node.getElementsByTagName("*") 

Я забыл, какие версии IE не нравится node.getElementsByTagName («*»), но я знаю, что это будет сбой в некоторых версиях. Он будет буквально искать узлы с tagNames звездочек!

Фактический код, который я использовал для этого в прошлом выглядит следующим образом:

function getElementsByTagName(node, tag) { 
    tag = tag || '*'; 
    var els = node.getElementsByTagName(tag); 
    if(!els.length && (tag == '*' && node.all)) els = node.all; 
} 
+0

спасибо за это , но вы ищете тэг справа, i был после имени класса .. – patad

+0

Ошибка 'getElementsByTagName (" * ")' была исправлена ​​в IE6. – bobince

Смежные вопросы