为什么这段代码总是返回" no_conflict"?

时间:2016-11-14 22:34:49

标签: javascript jquery return

我写了一个方法如下:

detectNameConflict: function() {
    var existing_filenames = this.element.find('ul.existing_files > li');
    if (existing_filenames.length > 0) {
        var try_name = this.element.find('div.target_filename').text().trim();
        existing_filenames.each(function(index, el) {
            if ($(el).text() == try_name) {
                return "contain_conflict";
            }
        });
    } else {
      return "no_conflict";
    }
},

此代码不起作用,因为始终会返回" no_conflict",即使存在命名冲突。

注意:this.element来自jQueryUI小部件工厂。它指的是附加了小部件实例的DOM元素。

2 个答案:

答案 0 :(得分:1)

您可以将jQuery集合转换为数组,然后使用Javascript some()方法测试其中是否有任何匹配try_name

detectNameConflict: function() {
    var try_name = this.element.find('div.target_filename').text().trim();
    var existing_filenames = this.element.find('ul.existing_files > li').toArray();
    if (existing_filenames.some(function(el) {
        return $(el).text() == try_name;
    })) {
        return "contain_conflict";
    } else {
        return "no_conflict";
    }
}

答案 1 :(得分:-1)

lParam的返回语句退出谓词,而不是整个过程,因此每次检测到冲突后都会继续循环。您需要使用"contain_conflict"循环或基于异常的控制流(看作JavaScript缺少for)。

<强>更新

Barman在上面的评论中指出,您可以通过从谓词中返回goto来停止循环。更喜欢例外;当我写这个答案时,我不知道这个功能。

结束更新

for循环:

false

基于异常的流程:

detectNameConflict: function()
{
    var existing_filenames = this.element.find('ul.existing_files > li');
    if (existing_filenames.length > 0)
    {
        var try_name = this.element.find('div.target_filename').text().trim();
        for(var filename in existing_filenames)
        {
            if ($(filename).text() == try_name)
            {
                return "contain_conflict";
            }
         }
    }
    return "no_conflict";
}