当元素不存在时附加子项的控制台错误

Console error with append child when element doesn't exist

我在一个超时函数中有以下代码,当元素存在时它工作正常,但当它不存在时,它会抛出一个控制台错误(并因此破坏页面上的其他内容)

setTimeout(function() {
  // moves #dashboard_basket_btn into #dashboard_basket
  var dashboard_basket = document.querySelector('#dashboard_basket');
  var dashboard_basket_card = document.querySelector('#dashboard_basket_btn');
  dashboard_basket.appendChild(dashboard_basket_card);
  dashboard_basket_card.classList.add('show_important');
}, 2500);

当#dashboard_basket_btn 不存在时(它有时是动态加载的,并不总是在通常的页面加载中),appendChild 函数中引用 dashboard_basket_card 的部分表示参数 1 是不是类型:节点(猜测这意味着它不存在?)

如果函数运行时元素不存在,是否有一种聪明的方法来处理这个问题或让它不生气?

您可以将可选的链接运算符与逻辑与运算符结合使用。

dashboard_basket_card 
  && 
 dashboard_basket?.appendChild(dashboard_basket_card).classList.add('show_important');

先检查是否存在?

setTimeout(function(){
    // moves #dashboard_basket_btn into #dashboard_basket
if(document.querySelector('#dashboard_basket')!=undefined &&
document.querySelector('#dashboard_basket_btn')!=undefined){
var dashboard_basket = document.querySelector('#dashboard_basket');
    var dashboard_basket_card = document.querySelector('#dashboard_basket_btn');
    dashboard_basket.appendChild(dashboard_basket_card);
    dashboard_basket_card.classList.add('show_important');
 
}
 }, 2500);

只需输入一个 if 并检查两者是否存在

setTimeout(function() {
  var dashboard_basket = document.querySelector('#dashboard_basket');
  var dashboard_basket_card = document.querySelector('#dashboard_basket_btn');
  if (dashboard_basket && dashboard_basket_card) {
    dashboard_basket.appendChild(dashboard_basket_card);
    dashboard_basket_card.classList.add('show_important');
  }
}, 2500);

您可以使用 if() {} 语句并简单地检查元素是否存在。使用 !!(双重否定)可以将值转换为布尔值,例如将 undefined 转换为 false 或将(现有的)object 转换为 true

工作示例:运行看不到错误消息的片段

if ( !!document.querySelector('#dashboard_basket') && !!document.querySelector('#dashboard_basket_btn') ) {
  var dashboard_basket = document.querySelector('#dashboard_basket');
  var dashboard_basket_card = document.querySelector('#dashboard_basket_btn');
  dashboard_basket.appendChild(dashboard_basket_card);
  dashboard_basket_card.classList.add('show_important');
}

首先可以判断元素是否存在,例如

var dashboard_basket_card_exists = document.querySelector('#dashboard_basket_btn') !== null; //the value will be true if it exists or false, if it isn't.

var dashboard_basket_exists = document.querySelector('#dashboard_basket') !== null;

之后可以写一个正则的if语句,赞

if(dashboard_basket_card_exists && dashboard_basket_exists)
{
 var dashboard_basket = document.querySelector('#dashboard_basket');
 var dashboard_basket_card = document.querySelector('#dashboard_basket_btn');
 dashboard_basket.appendChild(dashboard_basket_card);
 dashboard_basket_card.classList.add('show_important');
}

这是解决此问题的一种方法。

JavaScript: querySelector Null vs querySelector

您也可以尝试以下行:

typeof(queried variable) === "undefined"