批量处理标签属性中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 ...
随机推荐
- .net core 基于NPOI 的excel导入导出类,支持自定义导出哪些字段,和判断导入是否有失败的记录
#region 从Excel导入 //用法 //var cellHeader = new Dictionary<string, string>(); //cellHeader.Add(&q ...
- P与NP问题详解
P,NP,NPC问题,这或许是众多OIer最大的误区之一. 本文就为大家详细讲解如上三个问题. 前序: 你会经常看到网上出现“这怎么做,这不是NP问题吗”.“这个只有搜了,这已经被证明是NP问题了”之 ...
- JS随机数生成算法
------------------------------------------ 知乎上边淘到的知识,又学到了~ http://www.zhihu.com/question/22818104 -- ...
- hdu1798(圆的位置关系)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1798 题意:给出两个圆的圆心坐标与半径,求他们相交部分的大小 思路:有三种情况: 1. 两圆相离,ar ...
- ipad中icon与launchimage的size
图标(AppIcon)与启动图(LaunchImage)是开发iOS应用程序必不可少的内容,但是在网络上对于这部分的内容讲解的并不详细,所以花些时间写了这篇文章,希望有需要的朋友可以随时查看 想知道A ...
- 树状数组【bzoj1782】: [Usaco2010 Feb]slowdown 慢慢游
[bzoj1782]: [Usaco2010 Feb]slowdown 慢慢游 Description 每天Farmer John的N头奶牛(1 <= N <= 100000,编号1-N) ...
- idea 新建maven项目没有src及其子目录问题
注意在这一步中,填写maven的本地地址还有手动修改settings地址非常重要!!! 如果你是第一次配置maven,少配置任何一个将导致你以后建立的mvn项目全部没有src目录!!! 解决办法就是卸 ...
- vue学习二:
vue的常用标签: 1.<router-link to=''>主要实现跳转链接功能,属性to='/'即是跳转到path为'/'的路径. 2.v-bind动态绑定指令,格式为:v-bind: ...
- msf连接PostgreSQL数据库
一.启动PostgreSQL服务######################################################################?root@root:~# ...
- react 部分语法补充
jsx语法 todolist.js import React, { Component,Fragment } from 'react'; import './style.css' class Todo ...