admin管理员组文章数量:1391990
I need to acces to all elements after certain element to change some attributes. I know there is nextAll() but I can't use jquery.
Specifically I need to change the label text and the name attribute from the input.
<div class="row respuesta">
<div class="form-group col-md-12">
<label>Respuesta 1:</label>
<div class="input-group">
<input class="form-control" name="respuesta1" onblur="probarInputVacio(event)" type="text"/>
<span class="input-group-btn"></span>
<span class="input-group-btn"></span>
<span class="input-group-btn"></span>
</div>
</div>
</div>
<div class="row respuesta">
<div class="form-group col-md-12">
<label>Respuesta 2:</label>
<div class="input-group">
<input class="form-control" name="respuesta2" onblur="probarInputVacio(event)" type="text"/>
<span class="input-group-btn"></span>
<span class="input-group-btn"></span>
<span class="input-group-btn"></span>
</div>
</div>
</div>
<div class="row respuesta">
<div class="form-group col-md-12">
<label>Respuesta 3:</label>
<div class="input-group">
<input class="form-control" name="respuesta3" onblur="probarInputVacio(event)" type="text"/>
<span class="input-group-btn"></span>
<span class="input-group-btn"></span>
<span class="input-group-btn"></span>
</div>
</div>
</div>
Thanks for the help.
I need to acces to all elements after certain element to change some attributes. I know there is nextAll() but I can't use jquery.
Specifically I need to change the label text and the name attribute from the input.
<div class="row respuesta">
<div class="form-group col-md-12">
<label>Respuesta 1:</label>
<div class="input-group">
<input class="form-control" name="respuesta1" onblur="probarInputVacio(event)" type="text"/>
<span class="input-group-btn"></span>
<span class="input-group-btn"></span>
<span class="input-group-btn"></span>
</div>
</div>
</div>
<div class="row respuesta">
<div class="form-group col-md-12">
<label>Respuesta 2:</label>
<div class="input-group">
<input class="form-control" name="respuesta2" onblur="probarInputVacio(event)" type="text"/>
<span class="input-group-btn"></span>
<span class="input-group-btn"></span>
<span class="input-group-btn"></span>
</div>
</div>
</div>
<div class="row respuesta">
<div class="form-group col-md-12">
<label>Respuesta 3:</label>
<div class="input-group">
<input class="form-control" name="respuesta3" onblur="probarInputVacio(event)" type="text"/>
<span class="input-group-btn"></span>
<span class="input-group-btn"></span>
<span class="input-group-btn"></span>
</div>
</div>
</div>
Thanks for the help.
Share Improve this question edited Dec 14, 2017 at 18:08 mhodges 11.1k2 gold badges31 silver badges48 bronze badges asked Dec 14, 2017 at 16:50 mgemge 651 silver badge9 bronze badges 11- best idea yet has been adding all elements after certain element recursively by .nextSibling in an array – mge Commented Dec 14, 2017 at 16:53
-
Can you not use
.querySelectorAll()
and only take the elements in the resultingNodeList
after the element in question? – mhodges Commented Dec 14, 2017 at 16:55 - queryselector yes. how would that be? – mge Commented Dec 14, 2017 at 16:57
- 1 Well, we haven't seen any of your code, so I would have no idea what selectors to use, nor how to target the element you want as your starting point. – mhodges Commented Dec 14, 2017 at 16:58
- 5 Please post the relevant HTML so we can understand what you mean with all elements after element. Also how do you identify the element after which to select the rest ? – Gabriele Petrioli Commented Dec 14, 2017 at 16:59
3 Answers
Reset to default 8If you can get the index
of the element after which to start, you can simply use (assuming elements are siblings) the general sibling binator (~)
let index = 3; // somehow get the index
let nextsiblings = document.querySelectorAll(`.mon-class:nth-child(${index}) ~ *`)
same way if you can exactly identify the element with a css selector (other than index)
let initialSelector= '#id'; // could also be a unique class like .active
let nextsiblings = document.querySelectorAll(`${initialSelector} ~ *`);
Adding another one where you only have a reference to the node after which to start.
// node is the one after which to start
let siblingsAndSelf = Array.from(node.parentNode.children);
let index = siblingsAndSelf.indexOf(node);
let nextAll = siblingsAndSelf.slice(index+1);
Based on this code you have provided, this may help point you in the right direction.
This function takes:
- A collection of elements
- A single element as a starting point, from which all subsequent elements will be operated on
- A callback function that can do whatever you want to do to the elements that are after the element you pass in as the 2nd argument.
var containers = document.querySelectorAll(".respuesta");
var response2Container = Array.prototype.find.call(containers, function (container) {
return container.querySelector("input[name='respuesta2']") !== null;
});
function applyAfterElement(elems, afterElem, fn) {
var after = false;
for (let i = 0; i < elems.length; i++) {
let elem = elems[i];
if (after) {
fn(elem, i);
}
else if (elem === afterElem) {
after = true;
}
}
}
applyAfterElement(containers, response2Container, function (elem, orgIndex) {
var label = elem.querySelector("label");
var input = elem.querySelector("input");
label.innerText = "Updated Respuesta Label:";
input.setAttribute("name", "updated" + input.name);
});
<div class="row respuesta">
<div class="form-group col-md-12">
<label>Respuesta 1:</label>
<div class="input-group">
<input class="form-control" name="respuesta1" onblur="probarInputVacio(event)" type="text" />
<span class="input-group-btn"></span>
<span class="input-group-btn"></span>
<span class="input-group-btn"></span>
</div>
</div>
</div>
<div class="row respuesta">
<div class="form-group col-md-12">
<label>Respuesta 2:</label>
<div class="input-group">
<input class="form-control" name="respuesta2" onblur="probarInputVacio(event)" type="text" />
<span class="input-group-btn"></span>
<span class="input-group-btn"></span>
<span class="input-group-btn"></span>
</div>
</div>
</div>
<div class="row respuesta">
<div class="form-group col-md-12">
<label>Respuesta 3:</label>
<div class="input-group">
<input class="form-control" name="respuesta3" onblur="probarInputVacio(event)" type="text" />
<span class="input-group-btn"></span>
<span class="input-group-btn"></span>
<span class="input-group-btn"></span>
</div>
</div>
</div>
<div class="row respuesta">
<div class="form-group col-md-12">
<label>Respuesta 4:</label>
<div class="input-group">
<input class="form-control" name="respuesta4" onblur="probarInputVacio(event)" type="text" />
<span class="input-group-btn"></span>
<span class="input-group-btn"></span>
<span class="input-group-btn"></span>
</div>
</div>
</div>
This is what I have finally done, even looking a bit dirty. (cant indent correctly that element indented wrong)
function borrarUnaRespuesta(event){
numRes--;
var aBorrar = event.currentTarget.parentNode.parentNode.parentNode.parentNode;
var proximoLabel = aBorrar.firstChild.firstChild.textContent;
var proximoNameAtt = aBorrar.firstChild.firstChild.nextSibling.firstChild.getAttribute("name");
var elementoPosterior = aBorrar.nextSibling;
aBorrar.parentNode.removeChild(aBorrar);
recolocarRespuestas(elementoPosterior,proximoLabel,proximoNameAtt);
}
//coloco bien las respuestas despues de borrar una en concreto
function recolocarRespuestas(elementoPosterior,proximoLabel,proximoNameAtt){
var anteriorLabel = "";
var anteriorNameAtt = "";
while(elementoPosterior.nodeName != "INPUT"){
anteriorLabel = elementoPosterior.firstChild.firstChild.textContent;
elementoPosterior.firstChild.firstChild.textContent = proximoLabel;
anteriorNameAtt = elementoPosterior.firstChild.firstChild.nextSibling.firstChild.getAttribute("name");
elementoPosterior.firstChild.firstChild.nextSibling.firstChild.setAttribute("name",proximoNameAtt);
proximoNameAtt = anteriorNameAtt;
proximoLabel = anteriorLabel;
elementoPosterior = elementoPosterior.nextSibling;
}
//this just places correctly the answers
checkNumRespuestas();
}
本文标签: htmlHow can I select all elements after a particular element with JavaScriptStack Overflow
版权声明:本文标题:html - How can I select all elements after a particular element with JavaScript? - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1744663503a2618390.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论