2013-09-05 2 views
1

Как упоминается в заголовке, я попытался переписать getElementByClassName как личное упражнение, но я столкнулся с каким-то неожиданным поведением с рекурсивным возвратом результатов.Попытка переписать getElementByClassName, запуская рекурсивную привязку

Document.prototype.getElementsByClassNameExercise = function(className, tempElement){ 
    var currentElement = (tempElement || document), 
    children = currentElement.childNodes, 
    results = [], 
    classes = []; 

    // Loop through children of said element 
    for(var i =0;i<children.length;i++){  
    if(children[i].className && children[i].className !== '') { 
     classes = children[i].className.split(' '); 

     // Important to note, forEach is not ie8 safe. 
     classes.forEach(function(singleClass){ 
     if(singleClass === className) { 
      results.push(children[i]); 
     } 
     }); 
    } 
    results.concat(Document.prototype.getElementsByClassNameExercise.call(this,  className, children[i])); 
    } 

    return results; 
} 

Я попытался это на моей странице, и это, кажется, успешно анализировать все элементы DOM и найти Classname ... но/results.concat (результаты) шаг возвращения, кажется, терпят неудачу. :/

Любые участники могут видеть то, что мне не хватает? :)

ответ

0

Ваша проблема

Вам не хватает многого.

concat() возвращает новый массив, как объяснен в MDN статьи:

Резюме

Возвращает новый массив состоит из массива вместе с другим массивом (ы) и/или значением (с).

Описание

[...] CONCAT не изменяет этого или любого из массивов, предоставленных в качестве аргументов, но вместо этого возвращает неполную копию, которая содержит копии одних и тех же элементов, объединенных из исходных массивов.

В случае сомнений, вы также всегда можете обратиться к ECMA-262 specs если MDN не хватает, раздел 15.4.4.4:

Когда метод CONCAT вызывается с нулём или более аргументов item1 , item2 и т. д., он возвращает массив, содержащий элементы массива объекта, за которым следуют элементы массива каждого аргумента в порядке.

Решение

Вам нужно-переназначить переменную результаты.

Изменить эту строку:

results.concat(Document.prototype.getElementsByClassNameExercise.call(this,  className, children[i])); 

к:

results = results.concat(Document.prototype.getElementsByClassNameExercise.call(this,  className, children[i])); 
+0

Вау, это было быстро! Я должен подождать еще 9 минут, чтобы установить флажок. Не могу поверить, что я пропустил это, спасибо! – TheIronDeveloper

+0

@ TheIronDeveloper: добро пожаловать, рад, что это помогло. В будущем, возможно, этот вопрос лучше подходит для [CodeReview.SE] (http://codereview.stackexchange.com/), так как вы действительно не искали объяснения конкретной проблемы или технической проблемы, но были пытаясь заставить кого-то просмотреть ваш код. – haylem

+0

Спасибо, что помогли мне и вежливо перенаправили меня. Я обязательно отправлю сообщения, связанные с кодом, в этом разделе. :) – TheIronDeveloper

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