实现这种普通javascript DOM遍历的更好方法?

实现这种普通javascript DOM遍历的更好方法?,javascript,html,dom,css-selectors,dom-traversal,Javascript,Html,Dom,Css Selectors,Dom Traversal,我有一些来自Marketo的自动生成表单,这意味着我不得不围绕所提供的内容工作。当有一个复选框只有一个值时,我需要向父标签添加一个类(有一个注释指示哪一个) 有问题的复选框可以是任何字段,而不仅仅是明确的“explicitOptin”,因此我不能基于此进行选择(至少最初不是这样)。我还必须确保我不会意外地选择带有两个或多个值的复选框 下面是我提出的javascript: var ckBox=document.querySelector('.mktoCheckboxList.mktoField:仅

我有一些来自Marketo的自动生成表单,这意味着我不得不围绕所提供的内容工作。当有一个复选框只有一个值时,我需要向父标签添加一个类(有一个注释指示哪一个)

有问题的复选框可以是任何字段,而不仅仅是明确的“explicitOptin”,因此我不能基于此进行选择(至少最初不是这样)。我还必须确保我不会意外地选择带有两个或多个值的复选框

下面是我提出的javascript:

var ckBox=document.querySelector('.mktoCheckboxList.mktoField:仅属于类型')。parentNode.previousSibling.previousSibling;
if(ckBox.className.indexOf('mktoSingleCheckbox')=-1){
ckBox.className+=“mktoSingleCheckbox”;
}

*危险品(选择所有适用的):
危险物品
危险废物
油罐车
*是的,请让我注册以通过电子邮件接收来自PrePass的信息。

我觉得必须有一种更好的方法,而不仅仅是将parentNode和以前的兄弟方法串在一起


有什么建议吗?我在想一个可能的替代方法是使用我正在使用的CSS选择器,但然后获取ID值和具有该ID的for值的搜索元素。也许将parentNode和以前的兄弟姐妹串在一起是一种方法…?

在写这篇文章时,您的解决方案似乎是最好的选择,除了使用
element.classList
而不是
element.className

可选的重新格式化会导致此(长)单内衬:

document.querySelector('.mktoCheckboxList .mktoField:only-of-type')
  .parentNode.previousSibling.previousSibling
  .classList.add('mktoSingleCheckbox');
展望未来,浏览器将允许我们使用API收集与
关联的标签

不幸的是,目前浏览器对该API的支持非常有限,尝试手动获取相关标签可能比您当前的方法更麻烦


希望这有帮助

这种“选择”应该在什么时候发生?当复选框被选中/取消选中时?此选择在表单加载时发生,因为添加的类将标签定位到我需要的位置。在这种情况下,选择并不重要。可以在此处找到一个工作示例:。基本上,该类只是将标签移到复选框的右侧。您可以立即使用
ckBox.classList.add('mktoSingleCheckbox')
而不是整个
if
语句。关于.if的更多信息是必需的,因为此脚本是一个更大的表单相关脚本的一部分,每当表单发生问题时,该脚本都会运行。如果我没有它,同一个类会被一次又一次地添加。但我真的很感激你提到这一点!!!噢!我跟踪了你的链接。你是对的。非常感谢@ContinuousLoad!!!!!
#                                                                   WOW!
document.querySelector('.mktoCheckboxList .mktoField:only-of-type').labels[0]
  .classList.add('mktoSingleCheckbox');