批量处理标签属性中document.getElementsByName()的替代方案
背景
今天在逛知乎时候,看到一个JavaScript方面的问题:

最近在学习JavaScript DOM,就好奇地查阅资料,以及请教学长,得到下面解答:
http://www.w3help.org/zh-cn/causes/SD9012
http://www.w3help.org/zh-cn/causes/SD9001
document.getElementsByName(elementName) 方法是 HTMLDocument 接口提供的方法,该方法传入的参数应该是目标元素的 name 属性的值:
目标元素的 name 是一个大小写敏感的字符串,仅 BUTTON, TEXTAREA, APPLET, SELECT, FORM, FRAME, IFRAME, IMG, A, INPUT, OBJECT, MAP, PARAM, META 元素允许有 name 属性1,并且 name 属性可以不是唯一的。
在IE 中,只有这些标签有 'name' 属性时,可以使用 document.getElementsByName(elementName) 方法获取他们创建的 DOM 元素,但在其他浏览器中,有 'name' 属性的其他标签也可以用这种方法获取。即
使用 document.getElementsByName 方法获取页面内的元素时,在 IE6 IE7 IE8 中的 name 是大小写不敏感的。
源代码
var reliableGetByName = true;
// IE6/7/8(Q)有id和name混淆的问题, IE6/7/8有不能获取非form和不区分大小写的问题
(function () {
var div = document.createElement('div');
var expando = 'selector-' + new Date().getTime();
document.body.appendChild(div).name = expando;
reliableGetByName = !document.getElementsByName(expando.toUpperCase()).length;
document.body.removeChild(div);
div = null;
})();
function getElemensByName(name, context) {
context = context || document;
var seeds;
// 只有document有这个方法
if (reliableGetByName && context.getElementsByName) {
seeds = context.getElementsByName(name);
}
else {
seeds = context.getElementsByTagName('*');
}
var results = [];
var elem;
for (var i = 0, len = seeds.length; i !== len && (elem = seeds[i]) != null; i++) {
if (elem && elem.nodeType === 1 && elem.getAttribute('name') === name) {
results.push(elem);
}
}
return results;
}
具体思路
1.判断浏览器是否支持getElementsByName函数
先生成一个div,给div加一个name = 随机串,如果可以找到,就说明是IE9+;找不到就是IE8-,还有一种方法是利用IE6/7/8不区分大小写判断的。
var reliableGetByName = true;
// IE6/7/8(Q)有id和name混淆的问题, IE6/7/8有不能获取非form和不区分大小写的问题
(function () {
var div = document.createElement('div');
var expando = 'selector-' + new Date().getTime();
document.body.appendChild(div).name = expando;
reliableGetByName = !document.getElementsByName(expando.toUpperCase()).length;
document.body.removeChild(div);
div = null;
})();
2.在context中找name为name的所有元素,返回一个数组
function getElemensByName(name, context) {
context = context || document;
var seeds;
if (reliableGetByName && context.getElementsByName) {
seeds = context.getElementsByName(name);
}
else {
seeds = context.getElementsByTagName('*');
}
3.判断elem存在,elem.nodeType=== 1 是元素,然后elem.name 是给的name
var results = [];
var elem;
for (var i = 0, len = seeds.length; i !== len && (elem = seeds[i]) != null; i++) {
if (elem && elem.nodeType === 1 && elem.getAttribute('name') === name) {
results.push(elem);
}
}
return results;
}
分析
以上代码可以解决四个问题:
1、IE67混淆id和name
2、IE678不能获取非表单元素
3、IE678忽略大小写
4、只有document.getElementByName而没有elem.getElementByName的问题
批量处理标签属性中document.getElementsByName()的替代方案的更多相关文章
- vue.js如何在标签属性中插入变量参数
html的标签的属性,比如id.class.href需要动态传递参数,拼接字符串,查了一些资料,并没有找到合适的解决方法,琢磨了一上午,终于试出了方法: v-bind:属性=" '字符串'+ ...
- jsp页面从标签属性中获取值
你还可以在"data-*" 属性里使用json语法,例如 <div id="awesome-json" data-awesome='{"game ...
- DOM中document对象的常用属性方法
每个载入浏览器的 HTML 文档都会成为 Document 对象. Document 对象使我们可以从脚本中对 HTML 页面中的所有元素进行访问. 属性 1 document.anchors 返 ...
- js基础之DOM中document对象的常用属性方法
-----引入 每个载入浏览器的 HTML 文档都会成为 Document 对象. Document 对象使我们可以从脚本中对 HTML 页面中的所有元素进行访问. 属性 1 document.an ...
- html页面中插入html的标签,JS控制标签属性
html页面中插入html的标签 方法1: 使用标签: <textara> </textara>标签 方法2: 使用JS: document.getElementById(&q ...
- PHP通用的XSS攻击过滤函数,Discuz系统中 防止XSS漏洞攻击,过滤HTML危险标签属性的PHP函数
XSS攻击在最近很是流行,往往在某段代码里一不小心就会被人放上XSS攻击的代码,看到国外有人写上了函数,咱也偷偷懒,悄悄的贴上来... 原文如下: The goal of this function ...
- javascript中document对象的属性和方法
document.documentElement; document.firstChild;document.childNodes[0];// 取得对<html>的引用document.b ...
- 如何自定义JSTL标签与SpringMVC 标签的属性中套JSTL标签报错的解决方法
如何自定义JSTL标签 1.创建一个类,从SimpleTagSupport继承 A) 通过继承可以获得当前JSP页面上的对象,如JspContext I) 实际上可以强转为PageContext II ...
- 关于在JS中设置标签属性
Attribute 该属性主要是用来在标签行内样式,添加.删除.获取属性.且适用于自定义属性. setAttribute("属性名",属性值“”):这个是用来设置标签属性的: re ...
随机推荐
- 解决Mac版微信小程序开发工具打开后无法显示二维码
问题描述: 正常情况下,打开微信小程序开发工具后,首页提示扫描二维码进行登陆,但是如果不显示二维码,当然无法登陆. 解决方案: 无法显示二维码肯定是程序运行哪里出错了,我们直接点击桌面图标是无法排查错 ...
- 基于DEV控件库的webservice打印.repx模板
本文使用的DEV版本为10.1版本 首先需要添加Dll引用 DevExpress.Data.v10.1 DevExpress.XtraPrinting.v10.1 DevExpress.XtraRep ...
- 泛型List<T>转存为XML文档
经常会有这情况,在程序处理结果为泛型List<T>,但为了能把这些集合输出XML文档.Insus.NET就因此问题,演示一个范例.在程序中,创建一个类: List<T>的集合手 ...
- 怎样创建XML文档
在程序中,我们怎样创建一个XML文档.下面演示中,Insus.NET在程序创建一个和http://www.cnblogs.com/insus/p/3274220.html 一模一样的XML文档. 可以 ...
- spark(1) - ubuntu 下 spark 安装
简单步骤: 前提:hadoop 环境搭建(我的是伪分布式) 1.官网下载spark 2.spark部署(单机模式): (1)解压 (2)移动文件到自定义目录下(同时修改文件名-原来的名字太长) (3) ...
- multiset的应用
multiset 和set差不多 ,但是可以存储多个一样的元素
- Thinkphp手把手练习
一.搭建thinkphp开发环境 准备条件:thinkphp框架 1.在Apache的www目录下新建文件夹,命名为thinkphp,可以将THinkPHP框架放在该目录中. 2.在thinkphp目 ...
- There is no row in position 0
更改程序池 管道模式 ---->经典 常见设置问题: 32位启用
- zookeeper客户端使用第三方(Curator)封装的Api操作节点
1.为什么使用Curator? Curator本身是Netflix公司开源的zookeeper客户端: Curator 提供了各种应用场景的实现封装: curator-framework 提供了f ...
- Django 11 form表单(状态保持session、form表单及注册实现)
Django 11 form表单(状态保持session.form表单及注册实现) 一.状态保持 session 状态保持 #1.http协议是无状态的:每次请求都是一次新的请求,不会记得之前通信的状 ...