【问题标题】:How to optimize native JavaScript code when refactoring it from Jquery从 Jquery 重构时如何优化原生 JavaScript 代码
【发布时间】:2021-09-29 00:13:48
【问题描述】:

我需要将一些 Jquery 重写为本机 JavaScript 代码,但我遇到了一个我不太确定如何解决的问题。

这是我需要用原生 JS 重写的 Jquery 代码:

$('.class1').click(function () {
  setTimeout(() => {
    $('.class2').css('top', '252px');
    $('.class3').css('bottom', '0px');
  }, 200);
  $('.class2').css('z-index', '-1');
  $('.class1').css('z-index', '-1');
}); 

这是我用原生 JavaScrip 写的:

if (document.querySelector('.class1')){
document.querySelector('.class1').addEventListener('click', function () {
    setTimeout(() => {
        if (document.querySelector('.class2')) {
            document.querySelector('.class2').style.top = '252px';
        }
        if ( document.querySelector('.class3')) {
            document.querySelector('.class3').style.bottom = '0px';
        }
    }, 200);
    if (document.querySelector('.class2')) {
        document.querySelector('.class2').style.zIndex = '-1';
    }
    if ( document.querySelector('.class1')) {
        document.querySelector('.class1').style.zIndex = '-1';
    }
})
}

我希望人们可以向我解释如何解决两件事:

  1. 如果代码在整个站点上运行,是否有更优雅的方法来检查当前页面上的元素?
  2. 还有什么可以替代函数中的 if 语句的吗?
    在 Jquery 中,这些语句是一个接一个地执行的,但在我的情况下,我需要先检查一个元素,如果它存在,则对其进行处理。

【问题讨论】:

  • $(selector).css(...) 有两个优点:1. 如果没有匹配,则没有错误 2. css 规则适用于每个匹配的元素。 document.querySelector otoh 只返回第一个匹配,所以要重现 (2) 你需要 document.querySelectorAll(selector).forEach(el => el.style.top = '252px'); 这也解决了 (1)

标签: javascript jquery web


【解决方案1】:

您可以通过将querySelector 的结果存储在变量中来使代码更简洁。另请注意,jQuery 中的类选择器可以返回多个元素,因此它的原生等价物是 querySelectorAll()

因此,您需要遍历该集合中的所有元素,并根据需要添加事件处理程序或更新其样式。由于这个循环,您不需要显式检查元素是否存在,因为如果集合为空,forEach() 将不会执行。

话虽如此,试试这个:

let class1 = document.querySelectorAll('.class1');
let class2 = document.querySelectorAll('.class2');
let class3 = document.querySelectorAll('.class3');

class1.forEach(el => {
  el.addEventListener('click', e => {
    setTimeout(() => {
      class2.forEach(el => el.style.top = '252px');
      class3.forEach(el => el.style.top = '0px');
    }, 200);
    
    class1.forEach(el => el.style.zIndex = -1);
    class2.forEach(el => el.style.zIndex = -1);
  });
});

【讨论】:

  • 一个很小的其他空间节省程序,用这个const qa = selector => document.querySelectorAll(selector);减少
猜你喜欢
  • 2013-08-27
  • 2021-10-30
  • 2011-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多