javascript - 将类添加到 HTML 标记 (<p>) 返回错误

标签 javascript html css dom

我正在尝试向 HTML 标记 ( <p></p> ) 添加一个类,但是当我运行代码时,它返回一个错误:

Uncaught TypeError: Cannot read property 'classList' of null

window.addEventListener('keydown', onKeydown);

const num_ok = [13, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 190];
const del_ = 46;
const back_ = 8;

function getElementByKeyCode(keyCode) {
  return document.querySelector(`[data-key = '${keyCode}']`); //tag <p></p>
}

function changeColor(keyCode, opts = {}) {
  const element = getElementByKeyCode(keyCode);

  if (opts.num || opts.ok) {
    element.classList.add('green'); //error when keydown
  } else if (opts.del) {
    element.classList.add('red'); //error when keydown
  } else if (opts.back) {
    element.classList.add('yellow'); //error when keydown
  }

  setTimeout(() => {
    deactive(element)
  }, 1000);
}

function deactive(element) {
  element.className = "num";
}

function onKeydown(event) {
  if (num_ok.includes(event.keyCode)) {
    changeColor(event, {
      num: true,
      ok: true
    });
  } else if (event.keyCode == del_) {
    changeColor(event, {
      del: true
    });
  } else if (event.keyCode == back_) {
    changeColor(event, {
      back: true
    });
  }
}
.num {
  color: #fff;
}
p.red {
  color: #e74c3c;
}
p.yellow {
  color: ffc300;
}
p.green {
  color: #2ecc71;
}
<div class="btns" id="n1">
  <p class="center normal num" data-key="49">1</p>
</div>

最佳答案

调用 changeColor() 时传递的是整个事件而不是 event.keyCode。我可以看到您只有 num1 击键所需的元素,但其余数字没有相同的元素。我猜这只是问题的简短版本。

window.addEventListener('keydown', onKeydown);

const num_ok = [13, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 190];
const del_ = 46;
const back_ = 8;

function getElementByKeyCode(keyCode) {
  return document.querySelector(`[data-key = '${keyCode}']`); //tag <p></p>
}

function changeColor(keyCode, opts = {}) {
  const element = getElementByKeyCode(keyCode);

  if (opts.num || opts.ok) {
    element.classList.add('green'); //error when keydown
  } else if (opts.del) {
    element.classList.add('red'); //error when keydown
  } else if (opts.back) {
    element.classList.add('yellow'); //error when keydown
  }

  setTimeout(() => {
    deactive(element)
  }, 1000);
}

function deactive(element) {
  element.className = "num";
}

function onKeydown(event) {
  if (num_ok.includes(event.keyCode)) {
    changeColor(event.keyCode, {
      num: true,
      ok: true
    });
  } else if (event.keyCode == del_) {
    changeColor(event, {
      del: true
    });
  } else if (event.keyCode == back_) {
    changeColor(event, {
      back: true
    });
  }
}
.num {
  color: #fff;
}
p.red {
  color: #e74c3c;
}
p.yellow {
  color: ffc300;
}
p.green {
  color: #2ecc71;
}
<div class="btns" id="n1">
  <p class="center normal num" data-key="49">1</p>
</div>

关于javascript - 将类添加到 HTML 标记 (<p>) 返回错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48038484/

相关文章:

html - 如何在 HTML/CSS 中隐藏软连字符 ()

html - 如何将 Bootstrap 的 clearfix 应用到我的代码中?

html - 在 html 选择器中使用线性渐变的问题

css - 如果在 IE 中查看时不触发 IE for css

javascript - jsTree 图标未出现

javascript - jQuery 在任何版本的 ie 中都不起作用?

javascript - google.ads.search.Ads() 的回调函数

css - 字体大小在特定媒体查询中没有改变

javascript - CSS 裁剪图像以适应屏幕宽度,同时保持图像的原始高度

javascript - 使用 react-autoBind 时 ReactJs setState 未定义