开发者问题收集

当将选择器传递给 jQuery() 时,如果文档中不存在,如何捕获,以阻止进一步可能的错误或遗漏?

2017-08-11
306

鉴于

$(function() {
  $(".planChoice").on("click", function() {
    console.log(123)
  });
  
  console.log($(".planChoice").length)
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js">
</script>

jQuery 很高兴地允许将 .on() 链接到 jQuery() 调用,其中传递给 jQuery() 的选择器在 document 中不存在。其中 .addEventListener() 抛出 TypeError

Cannot read property 'addEventListenet' of null

$(function() {
  document.querySelector(".planChoice")
  .addEventListener("click", function() {
    console.log(123)
  });
  
  console.log(document.querySelector(".planChoice").length)
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js">
</script>

当在调用 jQuery() 时选择器或元素在 document 中不存在,或者 jQuery 方法链接到返回 jQuery 对象的 jQuery() 调用时,我们如何调整(改进) jQuery() 以抛出相同的 TypeError - 尽管在调用时不存在与 document 中的选择器字符串匹配的底层元素?

2个回答

如果您确实想抛出错误,可以编辑 jQuery() / $

$ = function (selector, context) {
    var el = new jQuery.fn.init(selector, context);
    if (el.length === 0) throw new Error('fail : "' + selector + '" Not Found');
    return el;
}

$('body'); // okay, returns element

$('nosuchthing'); // fail, throws error
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

另一种方法是仅返回 nullundefined 而不是空集合,然后让链接的下一个函数抛出错误

$ = function (selector, context) {
		var el = new jQuery.fn.init(selector, context);
    if (el.length === 0) return null;
    return el;
}

$('body').on('click', function() {}) // hunkydory
$('nosuchthing').on('click', function() {}) // can't read property "on" of "null"
adeneo
2017-08-11

如果您 确实 希望抛出错误,只需使用原始 javascript 而不是 jquery 函数。

Daron Spaulding
2017-08-11