在重构此代码之前,只需进行实际检查。据我所知,它来自一个有能力的人。这是一个示例:
// remove line at the latest list
if($(".extra-space").length > 0) {
$(".extra-space li:last").addClass("noborder");
}
// select all
if($(".extra-select-all").length > 0) {
$(".extra-select-all").click(function() {
if($(this).attr("checked") == true) $(".extra-select-item").attr("checked","checked");
else $(".extra-select-item").removeAttr("checked");
});
}
有没有人知道这种模式背后的基本原理,还是只是无知if
封装器是不必要的?
// remove line at the latest list
$(".extra-space li:last").addClass("noborder");
// select all
$(".extra-select-all").click(function() {
if($(this).attr("checked") == true) $(".extra-select-item").attr("checked","checked");
else $(".extra-select-item").removeAttr("checked");
});
答案 0 :(得分:5)
从编程上讲它是有道理的,因为这些元素不可能存在并且返回的数组的长度可能为0
,但由于jQuery适用于设计人员和非程序员,因此它会自动处理对不存在的元素的调用,这意味着你并不需要那些检查,因为jQuery尽可能是虚拟证明。
$('microsoft').addClass('sucks')
完全有效,因为返回的jquery obj有一个继承的addClass
方法,无论是否有元素,该方法都会执行。
注意:我只谈到纯粹的jQuery方法。如果执行的方法是自定义插件或甚至是另一个答案中指定的UI插件,则行为可能与核心不同,在这种情况下,检查.length
就个人而言,我总是会检查.length
因为这意味着如果重构发生在后面的话会减少歧义和猜测工作,如果神秘的错误开始出现,我的错误检查将节省调试时间。< / p>
答案 1 :(得分:1)
我说你是对的。不需要检查。
答案 2 :(得分:1)
昨天我会说这些测试完全没用,但我今天遇到了一个错误,迫使我给出不同的答案。
在许多情况下,就像在其他答案中所说的那样,编写jQuery来处理空集上的调用方法。但通常是:
$('#myDatePicker').datepicker('getDate');
如果页面中不存在带有#datePicker id的元素,将引发错误(确实引发javascript错误,不返回null
)。因此,我必须添加一个与您要删除的测试完全相同的测试。
我认为开销很小,所以为什么要修改有效的东西,将来可能会有bug呢?
PS:我正在谈论的日期选择器是来自jQuery ui包的那个,而不是在一个阴暗的网站上找到的一些随机插件;)
编辑:在某人问之前,例如:
$('#myDatePicker').datepicker('option', 'minDate', new Date());
工作得很好,问题只出在getDate上。
答案 3 :(得分:0)
我认为在jQuery中编写此代码的开发人员可能只是从另一个框架(如MooTools)切换而不知道jQuery提供的便利程度。 示例:整个点击处理程序可以缩短为
$(".extra-select-all").click(function() {
$(".extra-select-item").attr("checked",$(this).attr("checked"));
});
虽然我可能会将$(".extra-select-item")
缓存在一个闭包范围变量中。
(
function()
{
var $extraSelect = $(".extra-select-item");
$(".extra-select-all")
.click(
function()
{
$extraSelect.attr("checked", $(this).attr("checked"));
}
);
}
)();
`
答案 4 :(得分:0)
你这样做的问题是你强迫浏览器在行中两次查找同样的东西。
if($(".extra-space").length > 0) { //Look up the elements and check length
$(".extra-space li:last").addClass("noborder"); //Look up the same elements again and than look up the next part and add class
}
更好的方法是
var elems = $(".extra-space") //Look up the elements
if(elems.length > 0) { //check length
elems.find("li:last").addClass("noborder"); //find the element from the cached group and add class
}
但如果真的不关心你是否有匹配,那么jQuery会为你检查。所以你可以做到
$(".extra-space li:last").addClass("noborder");
答案 5 :(得分:0)
IMO我认为这不是开始在你的JS中放置一百万条if语句的理由。 @Krtek - 如果您的应用程序依赖于日期而没有先检查日期是否可用,则应用程序中可能存在一些潜在的严重缺陷...这属于应用程序的设计和逻辑类别,应该进行处理与初始化插件的过程不同。
如果没有元素存在,jQuery示例不包含if语句并且浏览器不会引发任何错误。 $(“#myElement”)可以返回从0到*匹配元素的数量 - 正如我经常说的那样 - 并且空列表仍然是一个列表... jQuery库能够以相同的方式处理0个匹配的结果能够处理许多匹配的结果。