对不存在的元素进行转义的常用方法是什么(如jQuery)
What is the usual approach to escape an element which is non existing (like jQuery does)
如果我有
var btn = document.getElementsByClassName('top_button')[0];
btn.addEventListener('click', function() { /* some here */ }));
类未定义我得到一个CCD_ 1。我想知道逃避这种情况的通常方法是什么。会是吗
var btn = document.getElementsByClassName('top_button')[0] || {};
还是我应该采取不同的做法?jQuery是如何做到这一点的,因为当我使用$('.top_button')
时,元素不在那里,它只返回一个对象。
感谢
如果你真的只想要第一个,那么我同意Praveen的观点,if
是最清晰、最简单的解决方案,尽管我通常在不同的地方做:
var btn = document.getElementsByClassName('top_button')[0];
if (btn) {
btn.addEventListener('click', function() { /* some here */ }));
}
如果您要求的索引中没有元素(就像JavaScript数组一样),那么getElementsByClassName
可靠地跨浏览器返回的集合将为您提供undefined
。
但我会使用querySelector
而不是getElementsByClassName
,因为你只想要第一个,不需要构建列表,而且querySelector
在所有现代浏览器上都有,IE8也有(而IE8缺少getElementsByClassName
)。
var btn = document.querySelector('.top_button');
if (btn) {
btn.addEventListener('click', function() { /* some here */ }));
}
TypeError
0接受任何CSS选择器(包括复杂的选择器)并返回第一个匹配元素或null
。它的表亲querySelectorAll
返回一个列表(如果没有匹配,则可以为空)。
如果您想将事件挂在所有匹配元素上,Quentin会为您提供服务。
jQuery是如何做到这一点的,因为当我使用$('.top_button')时,元素不在那里,它只返回一个对象。
jQuery对象是DOM元素集的包装器(通常,它们可以是其他东西的包装器,但在典型的使用中,它们是DOM元素)。因此,当你执行$('.top_button')
时,你会得到一个jQuery对象,它是一个集合的包装器,里面什么都没有。你可以对这个jQuery对象进行调用,比如.on
,它们不会失败(因为jQuery对象存在),但它们也不做任何事情(因为集合中没有元素可供它做任何事情)。
我不是建议这样做,但你也可以用querySelectorAll
自己做同样的事情。(jQuery比querySelectorAll
早了几年,最初John Resig为它构建了一个完整的选择器引擎。现代浏览器在类似jQuery的东西中没有必要这样做,除非你想添加自己的CSS选择器,比如jQuery的:has
。)
只是为了说明jQuery正在做什么(纯粹从概念上):
function DomQuery(selector) {
// Get the matching elements, as an array (the `slice` thing turns
// the collection returned by `querySelectorAll` into an array)
this.elements = Array.prototype.slice.call(document.querySelector(selector));
}
DomQuery.prototype.on = function(eventName, handler) {
this.elements.forEach(function(element) {
element.addEventListener(eventName, handler, false);
});
return this;
};
用法:
new DomQuery(".top_button").on("click", function() {
// do something
});
我们可以通过使new
可选:来使其更像jQuery
function domQuery(selector) {
// If not called via `new`, do that
if (!(this instanceof domQuery)) {
return new domQuery(selector);
}
// Get the matching elements, as an array (the `slice` thing turns
// the collection returned by `querySelectorAll` into an array)
this.elements = Array.prototype.slice.call(document.querySelector(selector));
}
domQuery.prototype.on = function(eventName, handler) {
this.elements.forEach(function(element) {
element.addEventListener(eventName, handler, false);
});
return this;
};
用法:
domQuery(".top_button").on("click", function() {
// do something
});
您可以使用一个简单的if
:
var btn = document.getElementsByClassName('top_button');
if (btn.length > 0) {
btn = btn[0];
btn.addEventListener('click', function() { /* some here */ }));
}
或者您也可以检查typeof
是否为"undefined"
。
正如@PraveenKumar的回答,您可以检查长度,但也可以检查是否未定义变量
if (typeof btn === "undefined") {
//do stuff here.
}
on
时,它会在该数组上循环,并将事件处理程序应用于其中的每个项。如果没有项,则标准的for循环将立即停止。
var btn = document.getElementsByClassName('top_button');
for (var i = 0; i < btn.length; i++) {
btn[i].addEventListener('click', function() { /* some here */ }));
}
- 将jQuery.ech()方法转换为本地JavaScript抽象的最佳方法是什么
- 基于窗口宽度jquery的函数的替代方法是什么
- jQuery中的状态管理是什么
- 这个jquery语法的功能是什么
- 未设置变量的赋值| jQuery的作用是什么
- 存储数据的最佳方式是什么,以便与jquery一起使用
- 逃离这些字符的目的是什么?[来自Javascript和JQuery书]
- 在jquery中,从同一对象的属性设置输入字段和标签的正确方法是什么
- 什么'这是使用jQuery将一些文本锚定到外部链接的最简单方法
- jQuery, Javascript : Javascript wrap in jQuery(), $() - 这是什么
- 跟踪 Jquery 和 CSS 标识符的最佳方法是什么?
- 让 jquery 为 ajax 添加的元素工作的最佳方法是什么?
- JQuery:这段代码是什么意思
- 使用jquery在表单上更改或获取特定行值的方法是什么
- 在self.setInterval中,jquery关键字self-referred指的是什么?jquery
- 这个插件要求回调字符串的格式是什么?(jquery ui multisearch)
- 在使用AJAX获取html内容后,向新元素添加监听器的正确方法是什么?(jQuery,Javascript)
- 使用PHP生成HTML的最佳方法是什么?JQuery
- 最有效的方法是什么(jquery代码段)
- 编写由JavaScript而不是纯HTML解析的链接的最佳方式是什么?(jQuery标签)