2016-05-21 2 views
1

HTML:Зачем возвращать getElementsBy ** не работает?

<ul id="ul-id"> 
<li>Text Content</li> 
<li>Text Content</li> 
<li>Text Content</li> 
<li>Text Content</li> 
</ul> 


Javascript:

function getId(idname) {return document.getElementById(idname);} // with document at first
function getTag(tagname) {return getElementsByTagName(tagname);} // witout document at first


Результаты:
Когда я называю его:

getId("ul-id").innerHTML // this code is working fine
getId("ul-id").getTag("li").length // not working
document.getElementById("ul-id").getTag("li").length // this also not working

Можете ли вы сказать мне причину и как это исправить?^_^

+3

Там нет 'метода getTag' ... – Rayon

+0

нет' функции getElementsByTagName'. это должно быть ['document.getElementsByTagName'] (https://developer.mozilla.org/en-US/docs/Web/API/Document/getElementsByTagName) –

+7

@Tyr, __Disagree: (__ – Rayon

ответ

3

Если вы действительно хотите добавить пользовательский метод на элементы в DOM, вам необходимо расширить Element прототип, чтобы добавить метод.

В этом случае метод цепочек работают следующим образом:

function getId(idname) { 
 
    return document.getElementById(idname); 
 
} 
 

 
Element.prototype.getTags = function getNestedElements(tagName) { 
 
    return this.getElementsByTagName(tagName); 
 
}; 
 

 

 
Element.prototype.getTag = function getNestedElements(tagName) { 
 
    return this.getTag(tagName)[0]; 
 
}; 
 

 

 
document.write(
 
    getId('ul-id').getTags('li').length 
 
);
<ul id="ul-id"> 
 
    <li>Text Content</li> 
 
    <li>Text Content</li> 
 
    <li>Text Content</li> 
 
    <li>Text Content</li> 
 
</ul>

+0

Я предполагаю, что это просто создаст избыточность методов. Поскольку 'Element.getElementsByTagName' proto есть, то зачем писать наши собственные? Я предпочел бы предложить 'querySelectorAll' как лучший альтернативу для всего этого ... – Rayon

+2

@Rayon Именно поэтому я начал ответ с помощью инструкции * if *. –

+0

@Rayon Я тоже большой поклонник 'querySelectorAll', но он немного медленнее, чем цепочки методов getElement *. –

2

Попробуйте это:

var a = document.getElementById('ul-id'); 
var b = a.getElementsByTagName('li').length; 
console.log(b); 
+0

Хорошее небольшое объяснение поможет будущим пользователям :) – Rayon

+0

Да, было бы полезно будущим пользователям :) – frnt

3

Вы не можете вызвать getTag на getId. Вы можете решить эту проблему, делая этот вид обходного:

function getTag(context, tagname) { 
    return context.getElementsByTagName(tagname); 
} 

Вот fiddle.

+0

хороший ответ, но нужно внести некоторые изменения ... например 'getTag ('ul-id', 'li');' будет не работа. нужно проверить, является ли «контекст» объектом или строкой, или, даже, ничего ... что было бы хорошо завершено полезной функцией :-) +1 –

+0

Yeap. Я показывал только не окончательное решение. Лучше всего построить объект, если вы можете связать такие методы, как 'myLib.getId (« ul-id »). GetTag (« li »)'. Но в конце дня вы будете строить чистую замену jQuery. – Everettss

0

getId и getTag - это просто функции. Вы не можете просто связать это. Попробуйте использовать DOM apis напрямую.

document.getElementById("ul-id").getElementsByTagName("li").length 
Смежные вопросы