如何使用JavaScript查找同一html类的三个实例中的两个?
我有三个如何使用JavaScript查找同一html类的三个实例中的两个?,javascript,html,Javascript,Html,我有三个元素具有相同的“child”类。假设我不能向添加任何其他类。如何使用JavaScript只找到其中两个div元素(第二个和第三个)?(下面的代码只是为了更好地理解我的意思-请注意,具有相同类的元素不是兄弟元素) DOM定义了一个函数,返回一个对象: 在您的例子中,这将返回3个带有“child”类名的div元素。然后,您可以使用以下语法访问此列表中的给定元素,例如: var secondElem = elementsWithChildClass[1]; var thirdElem = e
元素具有相同的“child”类。假设我不能向
添加任何其他类。如何使用JavaScript只找到其中两个div
元素(第二个和第三个)?(下面的代码只是为了更好地理解我的意思-请注意,具有相同类的
元素不是兄弟元素)
DOM定义了一个函数,返回一个对象:
在您的例子中,这将返回3个带有“child”类名的div
元素。然后,您可以使用以下语法访问此列表中的给定元素,例如:
var secondElem = elementsWithChildClass[1];
var thirdElem = elementsWithChildClass[2];
在您的情况下,这两个对象都将是实例(继承自)
注意:HTMLCollection对象的索引是从零开始的,这意味着使用[0]
访问第一个元素,使用[1]
访问第二个元素,依此类推
DOM定义了一个函数,该函数返回一个对象:
在您的例子中,这将返回3个带有“child”类名的div
元素。然后,您可以使用以下语法访问此列表中的给定元素,例如:
var secondElem = elementsWithChildClass[1];
var thirdElem = elementsWithChildClass[2];
在您的情况下,这两个对象都将是实例(继承自)
注意:HTMLCollection对象的索引是从零开始的,这意味着使用[0]
访问第一个元素,使用[1]
访问第二个元素,依此类推
修改后的问题:如何使用
class=“child”
获取最后两个元素,而不是查看它们与JavaScript嵌套的级别(第二级和第三级)
您不需要jQuery来完成这项工作。
一个至少可以一直到ES3的答案可能是这样的。在这种情况下,提供一个parentId
允许您将三个.child
类作为目标组,而不是让JavaScript收集所有.child
类
function get2ndAnd3rdClassNodes(parentId, targetClass)
{
var targets = [];
var nodes = document.getElementById(parentId).getElementsByClassName(targetClass);
for(var i = 1, length = nodes.length; i < length; ++i)
{
target[i - 1] = nodes[i];
}
nodes = null;
return targets;
}
有时,将DOM访问与处理DOM返回值的代码分离是有利的。在这种情况下,函数可以处理节点,而不是从id(和目标类名)开始.getElementsByClassName()
返回节点列表,它是一个类似数组的对象,但仍然是一个对象。为了使用JavaScript数组方法,实际上需要将其强制转换为数组
function get2ndAnd3rdClassNodes(nodes, targetClass)
{
nodes = nodes.getElementsByClassName(targetClass);
return Array.prototype.splice.call(nodes, 1, 2);
}
或者,在一行中:
function get2ndAnd3rdClassNodes(nodes, targetClass)
{
return Array.prototype.splice.call(nodes.getElementsByClassName(targetClass), 1, 2);
}
最后,如果您希望能够以灵活的方式确定要去除多少元素:
function spliceClassNodes(nodes, targetClass, startIndex, nodesNeeded)
{
var minNodes = startIndex + nodesNeeded;
try
{
if(nodes.length < minNodes)
{
throw new RangeError('Only ' + nodes.length + ' received. Needed ' + minNodes + ' to process this nodeList correctly.');
}
return Array.prototype.splice.call(nodes.getElementsByClassName(targetClass), startIndex, nodesNeeded);
}
catch(e)
{
if(e instanceof RangeError)
{
//Handle the problem.
}
}
return;
}
请随意将其添加到原型中。修改后的问题:如何使用
class=“child”
获取最后两个元素,而不是查看它们与JavaScript嵌套的级别(第二级和第三级)
var slice = function(elements, start, end) {
var sliced = Array.prototype.slice.call(elements, start, end);
return sliced;
};
var totalChildElem = document.getElementsByClassName("child");
if (totalChildElem.length)
{
var myChildElem = slice(totalChildElem,1);
}
您不需要jQuery来完成这项工作。
一个至少可以一直到ES3的答案可能是这样的。在这种情况下,提供一个parentId
允许您将三个.child
类作为目标组,而不是让JavaScript收集所有.child
类
function get2ndAnd3rdClassNodes(parentId, targetClass)
{
var targets = [];
var nodes = document.getElementById(parentId).getElementsByClassName(targetClass);
for(var i = 1, length = nodes.length; i < length; ++i)
{
target[i - 1] = nodes[i];
}
nodes = null;
return targets;
}
有时,将DOM访问与处理DOM返回值的代码分离是有利的。在这种情况下,函数可以处理节点,而不是从id(和目标类名)开始.getElementsByClassName()
返回节点列表,它是一个类似数组的对象,但仍然是一个对象。为了使用JavaScript数组方法,实际上需要将其强制转换为数组
function get2ndAnd3rdClassNodes(nodes, targetClass)
{
nodes = nodes.getElementsByClassName(targetClass);
return Array.prototype.splice.call(nodes, 1, 2);
}
或者,在一行中:
function get2ndAnd3rdClassNodes(nodes, targetClass)
{
return Array.prototype.splice.call(nodes.getElementsByClassName(targetClass), 1, 2);
}
最后,如果您希望能够以灵活的方式确定要去除多少元素:
function spliceClassNodes(nodes, targetClass, startIndex, nodesNeeded)
{
var minNodes = startIndex + nodesNeeded;
try
{
if(nodes.length < minNodes)
{
throw new RangeError('Only ' + nodes.length + ' received. Needed ' + minNodes + ' to process this nodeList correctly.');
}
return Array.prototype.splice.call(nodes.getElementsByClassName(targetClass), startIndex, nodesNeeded);
}
catch(e)
{
if(e instanceof RangeError)
{
//Handle the problem.
}
}
return;
}
可以随意将其添加到原型中。使用选择器和数组魔法:
var els=array.from(document.querySelector('.child')).splice(1)
$(.child”).not(“:eq(0)”);如果你可以使用一些稳定的东西(使用jQuery)@Bergi-slice也可以,但是两者都可以,因为OP对原始数组不感兴趣。对于那些吹捧jQuery的人:它没有被标记或要求,并且比POJS更重要,这取决于浏览器。@JohnWeisz没有回答第一个问题“这个被剪掉的代码在页面上只出现一次吗”,我不确定你的评论的价值。当然,.getElementsByClassName()
可以在任何DOM元素上使用。这在这里不是问题。问题是,如果上面的代码片段在页面上只出现一次,那么每次索引1和索引2都将指向相同的两个元素。谢谢您的输入。@JohnWeisz更正:问题是,如果上述代码段在页面上出现多次,则每次索引1和2都将指向相同的两个元素。感谢您的输入。使用选择器和数组魔法:var els=array.from(document.querySelector('.child')).splice(1)
$(.child”).not(“:eq(0)”);如果你可以使用一些稳定的东西(使用jQuery)@Bergi-slice也可以,但是两者都可以,因为OP对原始数组不感兴趣。对于那些吹捧jQuery的人:它没有被标记或要求,并且比POJS更重要,这取决于浏览器。@JohnWeisz没有回答第一个问题“这个被剪掉的代码在页面上只出现一次吗”,我不确定你的评论的价值。当然,.getElementsByClassName()
可以在任何DOM元素上使用。这在这里不是问题。问题是,如果上面的代码片段在页面上只出现一次,那么每次索引1和索引2都将指向相同的两个元素。谢谢您的输入。@JohnWeisz更正:问题是,如果上述代码段在页面上出现多次,则每次索引1和2都将指向相同的两个元素。谢谢你的意见。这有可重用的好处。您可以将其添加到原型中。这具有可重用的优点。您可以将其添加到原型中。这是一个很好的尝试,但有一个逻辑错误<代码>var TotalChild
var slice = function(elements, start, end) {
var sliced = Array.prototype.slice.call(elements, start, end);
return sliced;
};
var totalChildElem = document.getElementsByClassName("child");
if (totalChildElem.length)
{
var myChildElem = slice(totalChildElem,1);
}