实现这种香草 javascript DOM 遍历的更好方法?
Better way to achieve this vanilla javascript DOM traversal?
我有一些 Marketo 自动生成的表格,这意味着我不得不根据提供的内容进行工作。当只有一个值的复选框时,我需要在父标签上添加一个class(有注释指出是哪个)。
有问题的复选框可以是任何字段,而不仅仅是特定的 "explicitOptin",所以我不能 select 基于它(至少最初不能)。我还必须确保我不会不小心 select 具有两个或更多值的复选框。
这是我想出的javascript:
var ckBox = document.querySelector('.mktoCheckboxList .mktoField:only-of-type').parentNode.previousSibling.previousSibling;
if (ckBox.className.indexOf('mktoSingleCheckbox') == -1) {
ckBox.className += ' mktoSingleCheckbox';
}
<form id="mktoForm_1690" novalidate="novalidate" class="mktoForm mkt*emphasized text*oHasWidth mktoLayoutLeft" data-styles-ready="true">
<div class="mktoFormRow">
<div class="mktoFormRow">
<div class="mktoFieldDescriptor mktoFormCol">
<div class="mktoOffset"></div>
<div class="mktoFieldWrap">
<label for="hazmatchooseallthatapply" class="mktoLabel mktoHasWidth">
<div class="mktoAsterix">*</div>Hazmat (choose all that apply):</label>
<div class="mktoGutter mktoHasWidth"></div>
<div class="mktoLogicalField mktoCheckboxList mktoHasWidth">
<input name="hazmatchooseallthatapply" id="mktoCheckbox_9480_0" type="checkbox" value="Hazardous Materials" class="mktoField">
<label for="mktoCheckbox_9480_0">Hazardous Materials</label>
<input name="hazmatchooseallthatapply" id="mktoCheckbox_9480_1" type="checkbox" value="Hazardous Waste" class="mktoField">
<label for="mktoCheckbox_9480_1">Hazardous Waste</label>
<input name="hazmatchooseallthatapply" id="mktoCheckbox_9480_2" type="checkbox" value="Fuel Tanker" class="mktoField">
<label for="mktoCheckbox_9480_2">Fuel Tanker</label>
</div>
<div class="mktoClear"></div>
</div>
<div class="mktoClear"></div>
</div>
<div class="mktoClear"></div>
</div>
<div class="mktoClear"></div>
</div>
<div class="mktoFormRow">
<div class="mktoFieldDescriptor mktoFormCol">
<div class="mktoOffset"></div>
<div class="mktoFieldWrap">
<!--This label directly below is the element that needs the new class-->
<label for="explicitOptin" class="mktoLabel mktoHasWidth mktoSingleCheckbox">
<div class="mktoAsterix">*</div>Yes, please sign me up to receive information from PrePass by email.</label>
<div class="mktoGutter mktoHasWidth"></div>
<div class="mktoLogicalField mktoCheckboxList mktoHasWidth mktoValid">
<!-- This is the single checkbox input that I am selecting with my javascript -->
<input name="explicitOptin" id="explicitOptin" type="checkbox" value="yes" class="mktoField">
<label for="explicitOptin"></label>
</div>
<div class="mktoClear"></div>
</div>
<div class="mktoClear"></div>
</div>
<div class="mktoClear"></div>
</div>
我觉得必须有比将 parentNode 和 previousSibling 方法串在一起更好的方法。
有什么建议吗?我在想一个可能的替代方法是使用我正在使用的 CSS select 或者,然后获取 ID 值并搜索具有该 ID 值的元素。也许只是将 parentNode 和 previousSiblings 串在一起是可行的方法...?
在撰写本文时,您的解决方案似乎是最佳选择,除了使用 element.classList
而不是 element.className
。
可选的重新格式化导致这个(长)单行:
document.querySelector('.mktoCheckboxList .mktoField:only-of-type')
.parentNode.previousSibling.previousSibling
.classList.add('mktoSingleCheckbox');
展望未来,浏览器将允许我们使用 HTMLInputElement.labels
API 来收集与 <input>
关联的标签。
# WOW!
document.querySelector('.mktoCheckboxList .mktoField:only-of-type').labels[0]
.classList.add('mktoSingleCheckbox');
不幸的是,目前浏览器对此 API 的支持非常有限,尝试手动获取关联标签可能 比您当前的方法更麻烦。
希望对您有所帮助!
我有一些 Marketo 自动生成的表格,这意味着我不得不根据提供的内容进行工作。当只有一个值的复选框时,我需要在父标签上添加一个class(有注释指出是哪个)。
有问题的复选框可以是任何字段,而不仅仅是特定的 "explicitOptin",所以我不能 select 基于它(至少最初不能)。我还必须确保我不会不小心 select 具有两个或更多值的复选框。
这是我想出的javascript:
var ckBox = document.querySelector('.mktoCheckboxList .mktoField:only-of-type').parentNode.previousSibling.previousSibling;
if (ckBox.className.indexOf('mktoSingleCheckbox') == -1) {
ckBox.className += ' mktoSingleCheckbox';
}
<form id="mktoForm_1690" novalidate="novalidate" class="mktoForm mkt*emphasized text*oHasWidth mktoLayoutLeft" data-styles-ready="true">
<div class="mktoFormRow">
<div class="mktoFormRow">
<div class="mktoFieldDescriptor mktoFormCol">
<div class="mktoOffset"></div>
<div class="mktoFieldWrap">
<label for="hazmatchooseallthatapply" class="mktoLabel mktoHasWidth">
<div class="mktoAsterix">*</div>Hazmat (choose all that apply):</label>
<div class="mktoGutter mktoHasWidth"></div>
<div class="mktoLogicalField mktoCheckboxList mktoHasWidth">
<input name="hazmatchooseallthatapply" id="mktoCheckbox_9480_0" type="checkbox" value="Hazardous Materials" class="mktoField">
<label for="mktoCheckbox_9480_0">Hazardous Materials</label>
<input name="hazmatchooseallthatapply" id="mktoCheckbox_9480_1" type="checkbox" value="Hazardous Waste" class="mktoField">
<label for="mktoCheckbox_9480_1">Hazardous Waste</label>
<input name="hazmatchooseallthatapply" id="mktoCheckbox_9480_2" type="checkbox" value="Fuel Tanker" class="mktoField">
<label for="mktoCheckbox_9480_2">Fuel Tanker</label>
</div>
<div class="mktoClear"></div>
</div>
<div class="mktoClear"></div>
</div>
<div class="mktoClear"></div>
</div>
<div class="mktoClear"></div>
</div>
<div class="mktoFormRow">
<div class="mktoFieldDescriptor mktoFormCol">
<div class="mktoOffset"></div>
<div class="mktoFieldWrap">
<!--This label directly below is the element that needs the new class-->
<label for="explicitOptin" class="mktoLabel mktoHasWidth mktoSingleCheckbox">
<div class="mktoAsterix">*</div>Yes, please sign me up to receive information from PrePass by email.</label>
<div class="mktoGutter mktoHasWidth"></div>
<div class="mktoLogicalField mktoCheckboxList mktoHasWidth mktoValid">
<!-- This is the single checkbox input that I am selecting with my javascript -->
<input name="explicitOptin" id="explicitOptin" type="checkbox" value="yes" class="mktoField">
<label for="explicitOptin"></label>
</div>
<div class="mktoClear"></div>
</div>
<div class="mktoClear"></div>
</div>
<div class="mktoClear"></div>
</div>
我觉得必须有比将 parentNode 和 previousSibling 方法串在一起更好的方法。
有什么建议吗?我在想一个可能的替代方法是使用我正在使用的 CSS select 或者,然后获取 ID 值并搜索具有该 ID 值的元素。也许只是将 parentNode 和 previousSiblings 串在一起是可行的方法...?
在撰写本文时,您的解决方案似乎是最佳选择,除了使用 element.classList
而不是 element.className
。
可选的重新格式化导致这个(长)单行:
document.querySelector('.mktoCheckboxList .mktoField:only-of-type')
.parentNode.previousSibling.previousSibling
.classList.add('mktoSingleCheckbox');
展望未来,浏览器将允许我们使用 HTMLInputElement.labels
API 来收集与 <input>
关联的标签。
# WOW!
document.querySelector('.mktoCheckboxList .mktoField:only-of-type').labels[0]
.classList.add('mktoSingleCheckbox');
不幸的是,目前浏览器对此 API 的支持非常有限,尝试手动获取关联标签可能 比您当前的方法更麻烦。
希望对您有所帮助!