Я хочу расширить jQuery, чтобы я мог легко получить tagName первого элемента в объекте jQuery. Это то, что я придумал, но, похоже, это не работает:
$.fn.tagName = function() {
return this.each(function() {
return this.tagName;
});
}
alert($('#testElement').tagName());
Есть идеи, что не так?
Кстати, я хочу использовать это больше для тестирования, чем для производства.
redsquare, tagName не является атрибутом!



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Попробуйте вместо этого:
$.fn.tagName = function() {
return this.get(0).tagName;
}
alert($('#testElement').tagName());
Чтобы немного подробнее объяснить, почему ваш исходный пример не работал, метод each() всегда будет возвращать исходный объект jQuery (если сам объект jQuery не был изменен). Чтобы увидеть, что происходит в каждом из ваших кодов, вот некоторый псевдокод, который показывает, как работает метод each():
function each(action) {
for(var e in jQueryElements) {
action();
}
return jQueryObject;
}
На самом деле each() реализуется не так (вероятно, с большой долей вероятности), но чтобы показать, что возвращаемое значение вашей функции action() игнорируется.
Было бы неплохо преобразовать тег в нижний регистр. вернуть this.get (0) .tagName.toLowerCase ()
Зачем вообще создавать плагин? Кажется немного ненужным ...
alert( $('div')[0].tagName );
Вы можете добавить toLowerCase (), чтобы сделать его более согласованным (и совместимым с XHTML).
$.fn.tagName = function() {
return this.get(0).tagName.toLowerCase();
}
alert($('#testElement').tagName());
Это вернет тэг соответствующего элемента в нижнем регистре.
Например,
jQuery("#test_div").tagName();
вернет div (при условии, что этот элемент был div).
Если вы передаете коллекцию элементов, она возвращает массив всех тэгов, где каждая запись массива соответствует согласованному элементу.
например, если мы бежим
jQuery(".classname").tagName();
в следующем (X) HTML:
<div>
<p class = "classname">test text</p>
<div class = "anotherClass">
<ul>
<li class = "classname"><a href = "test">Test link</a></li>
</ul>
<p class = "classname">Some more text</p>
</div>
<div>
будет массив тэгов:
["p", "li", "p"]
Это функция - она в основном такая же, как и выше, но поддерживает несколько элементов, которые могут быть полезны или не полезны для вашего проекта.
jQuery.fn.tagName = function(){
if (1 === this.length){
return this[0].tagName.toLowerCase();
} else{
var tagNames = [];
this.each(function(i, el){
tagNames[i] = el.tagName.toLowerCase();
});
return tagNames;
}
};
может вернуть массив или элемент ... вызовет исключение, если один из выбранных элементов не имеет tagName ...
почему бы просто не использовать .attr ('tagName')