JavaScript-javascript怎么实现jquery的范围选择
jquery可以实现在dom的某个范围内选择,比如
$('#id1 #id2'),首先限定查找范围为id为id1的元素内部,然后再在这个范围内查找id为id2的元素,如果整个页面内有多处id为id2的元素,这样选择不会选择到其他元素去。
虽然用jquery做这样的选择很好实现,但是现在条件所限,必须脱离jqury,想要用原生javascript实现同样的功能,怎么做?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
function query(str) {
var tags = str.split(" ");
var dom = [];
var nodesToArray = function(nodes) {
var arr = [];
for(var i in nodes) {
arr.push(nodes[i]);
}
return arr;
}
for(var i = 0; i < tags.length; i ++) {
if(/#w+/i.test(tags[i])) {
dom.push(document.getElementById(tags[i].substring(1)));
}
else if(/.w+/i.test(tags[i])) {
if(dom.length == 0) {
var all = document.getElementsByTagName("*");
}
else if(dom[dom.length - 1] instanceof Array) {
var all = [];
for(var j in dom[dom.length - 1]) {
var nodes = dom[dom.length - 1][j].getElementsByTagName("*");
all = all.concat(nodesToArray(nodes));
}
}
else {
var all = dom[dom.length - 1].getElementsByTagName("*");
}
//selected elements
var selelm = [];
var reg = new RegExp("b" + tags[i].substring(1) + "b");
for(var k in all) {
if(all[k].nodeType != 1) continue;
if(reg.test(all[k].className)) {
selelm.push(all[k]);
}
}
dom.push(selelm);
}
else if(/w+/i.test(tags[i])) {
if(dom.length == 0) {
var allTags = document.getElementsByTagName(tags[i]);
allTags = nodesToArray(allTags);
}
else if(dom[dom.length - 1] instanceof Array) {
var allTags = [];
for(var j in dom[dom.length - 1]) {
var nodes = dom[dom.length - 1][j].getElementsByTagName(tags[i]);
allTags = allTags.concat(nodesToArray(nodes));
}
}
else {
var allTags = dom[dom.length - 1].getElementsByTagName(tags[i]);
allTags = nodesToArray(allTags);
}
dom.push(allTags);
}
}
if(dom[dom.length - 1].constructor != Array) return new Array(dom[dom.length - 1]);
return dom[dom.length - 1];
}
使用很简单,和jquery里一样,当然没有jquery那样强大,用法:
query("#top div")//选取id为top的所有div子元素
query(".p div")//选取所有class为p的所有div子元素
注意,返回的永远是数组,查找不到会返回空数组。
运行若有bug,可以共同修改
id本就不应该在页面中重复,出现这个问题说明很差劲。
var q = function (strId1, strId2) {
var id1 = document.getElementById(strId1), id1Chidlren = id1.getElementsByTagName('*'), i = 0, len = id1Chidlren.length, id2 = null;
for (; i < len; ++i) {
if (id1Chidlren[i].id === strId2) {
id2 = id1Chidlren[i];
break;
}
}
return id2;
};