我写了一个方法如下:
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元素。
答案 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";
}