如何根据JavaScript中哪个nodeList不为空来设置变量?

时间:2013-12-05 13:32:04

标签: javascript operators nodelist selectors-api

我想知道是否有更好的方法可以做到这一点:

我正在尝试将target设置为"[data-update]"div.ui-content,以便在元素中找到。

最初我想做这样的事情:

target = el.querySelectorAll("[data-update]") || el.querySelectorAll("div.ui-content");

但是这不起作用,因为第一个表达式将始终被定义,即使它是一个空的nodeList []

所以现在我有了这个,这有效,但我对此并不满意:

target = container.querySelectorAll("[data-update]")

if (target.length === 0) {
  target = container.querySelectorAll("div.ui-content");
}

if (target.length === 0) {
  util.errorHandler({"error": "updatePageSection: No target found"});
} else {
  // do stuff
}

问题
有更简单的方法吗?仅限纯JavaScript。

谢谢!

2 个答案:

答案 0 :(得分:1)

你可以这样做:

target = ( el.querySelectorAll("[data-update]").length>0 && 
           el.querySelectorAll("[data-update]") ) || 
         ( el.querySelectorAll("div.ui-content").length> 0 && 
           el.querySelectorAll("div.ui-content") );

但它绝对不可读,而且DOM调用太多。但“一线”。 小提琴:http://jsfiddle.net/3X2Nd/

答案 1 :(得分:1)

使用条件运算符,并检查选择的长度:

target = el.querySelectorAll("[data-update]").length
     ? el.querySelectorAll("[data-update]")
     : el.querySelectorAll("div.ui-content");

基本上a ? b : c表示如果a为真,则取b,否则取c 。更多信息:Contional operator

此外,如果您不想重复第一个选择,可以添加一个额外的步骤:

target = el.querySelectorAll("[data-update]");
target = target.length ? target : el.querySelectorAll("div.ui-content");

第一个你看到这种语法的方法真的很奇怪。但你很快就会习惯它。

注意:在JavaScript中,零被视为false。并且非零数字被视为真实。