javascript - 如何用纯 javaScript 替换 .prevAll() 和 .addBack()

标签 javascript html

我在 jQuery 中有这个函数:

$(document).on('mouseover', '.star', function () {
  $(this).prevAll().addBack().addClass('full');
});

$(document).on('mouseout', '.star', function () {
  $(this).removeClass('full');
});

我想用原生 javaScript 创建类似的函数。 内容是动态呈现的。

如何在 mouseovermouseout 上定位同级元素,如何从所有元素中仅删除一个元素(即被单击的元素)中的类。

这是我尝试过的:

document.addEventListener("mouseout", function(e) {
  for (var target = e.target; target && target != this; target = target.parentNode) {
    if (target.matches('.star')) {
      target.classList.remove('full');
    }
  }
}, false);

document.addEventListener("mouseover", function(e) {
  for (var target = e.target; target && target != this; target = target.parentNode) {
    if (target.matches('.star')) {
      target.classList.add('full');
      // This one removes the class for ALL .star elements.
    }
  }
}, false);

HTML:

<div data-vote="1" class="star">Star</div>
<div data-vote="2" class="star">Star</div>
<div data-vote="3" class="star">Star</div>
<div data-vote="4" class="star">Star</div>
<div data-vote="5" class="star">Star</div>

Jsfiddle with what I have tried .

Jsfiddle with jQuery - 现有解决方案 - 我正在尝试将其复制到 native JavaScript 中。

最佳答案

您可以尝试这种方法:

document.addEventListener("mouseout", function({ target }) {
    if (target.matches('.star')) {
      target.classList.remove('full');
    }
}, false);

document.addEventListener("mouseover", function({ target }) {
    if (target.matches('.star')) {
      addClassToPrevSiblings(target, 'full');
    }
}, false);

function addClassToPrevSiblings(elem, classToAdd) {
  while (elem) {
    if (elem.nodeType === 1) {
      elem.classList.add(classToAdd);
    }
    elem = elem.previousSibling;
  }
}

对于这两个事件,我只是检查它们的目标是否是星元素。当它是一个 mouseout 事件时,我循环遍历 previous siblings和元素本身添加 full 类。

Here是 jsFiddle 上的工作示例。

关于javascript - 如何用纯 javaScript 替换 .prevAll() 和 .addBack(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57834089/

相关文章:

javascript - Firebase Web - currentUser 返回 null

javascript - 捕获表格中的多个td元素

jquery - Bootstrap 选项卡在“下一个”和“上一个”按钮上移动

php str_replace 在 CSS 文件中使用自定义 {tags}

html - 覆盖 Outlook 中电子邮件标题图像的默认边距/填充

javascript - 如何更改 DIV 的位置,更改其顺序

php - jquery ajax更新mysql表

javascript - 从背景大小 :cover/contain 中检索计算值

javascript - 如何翻转 Div 的内容

javascript - 使用 gulp 整合 CSS