批量处理标签属性中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 ...
随机推荐
- 使用metasploit进行栈溢出攻击-1
攻击是在bt5下面进行,目标程序是在ubuntu虚拟机上运行. 首先,需要搞明白什么是栈溢出攻击,详细内容请阅读 http://blog.csdn.net/cnctloveyu/article/det ...
- Java开发环境的搭建-JDK的安装
一.下载 JDK是个免费的东东,所以不要去百度啥破解版了,直接去官网下载最新版本吧,比较安全, 下载地址 如下图所示 - 点击上图中的圈中部分,之后会下图的部分. 根据你的电脑系统是64位,还是32位 ...
- 洛谷P2709 BZOJ 3781 小B的询问 (莫队)
题目描述 小B有一个序列,包含N个1~K之间的整数.他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数字i在[L..R]中的重 ...
- java插入图片到数据库(可以批量)
package sundun.zfpt.gg.web; import java.io.File; import java.io.FileInputStream; import java.sql.Con ...
- springboot添加第三方的jar或本地jar
原文链接:https://www.cnblogs.com/fengli9998/p/8044923.html 由对接支付引入第三方的jar时冒出的问题,如何在springboot项目中来引入第三方的j ...
- 出现epoll failed: Bad file descriptor的原因
今天遇到了这个问题,之前找了半天原来是IO事件的socket描述符在epoll_ctl()处理之前关闭了. if(epoll_ctl(epollFd, EPOLL_CTL_DEL, ev->fd ...
- 常用linux基础命令(持续更新...)
删除 空目录 rmdir非空目录 rm -rf 目录名字-r 就是向下递归,不管有多少级目录,一并删除-f 就是直接强行删除,不作任何提示的意思 删除文件命令rm -f 文件名将会强行删除文件,且无提 ...
- 5分钟构建无服务图片鉴黄web应用(基于FunctionGraph)
函数工作流(FunctionGraph,FGS)是一项基于事件驱动的函数托管计算服务,托管函数具备以毫秒级弹性伸缩.免运维.高可靠的方式运行.即使在一些复杂的web应用场景中,函数工作流也能发挥出令人 ...
- error : Could not load UI satellite dll 'TrackerUI.dll'. Make sure it exists in an LCID subdirectory of 'C:\Program Files (x86)\MSBuild\12.0\bin\'.
原因 VS2013 + QT环境部署好后, 又安装了VS2015\ 解决方案: 在另一台电脑里重装VS2013, 并将 C:\Program Files (x86)\MSBuild\12.0\B ...
- python统计字符串中字符个数
str = "xxx" result = {} for i in set(str):#set将字符串转为集合对象,用于去重,减少计算量 result[i] = str.count( ...