这些jQuery元素测试完全不必要吗?

时间:2011-02-28 21:34:31

标签: jquery

在重构此代码之前,只需进行实际检查。据我所知,它来自一个有能力的人。这是一个示例:

// 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");
});

6 个答案:

答案 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个匹配的结果能够处理许多匹配的结果。