1

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

我正在尝试设置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。

谢谢!

4

2 回答 2

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/

于 2013-12-05T13:40:45.503 回答
1

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

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

基本上a ? b : c意味着如果 a 为真,则取 b,否则取 c。更多信息:有条件运算符

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

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

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

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

于 2013-12-05T13:58:08.553 回答