偶然的机会,我在JavaScript中直接用HTML元素的id属性来获取该元素,并设置该元素的其他属性值,竟然能够正确解析不报错!于是我去查阅相关资料,也有其他同行这么用。
虽然说这种用法不是标准用法,推荐使用 document.getElementById(id);document.getElementByName(name); ,但也是一种新发现,先记录下来,以备后用。
本文讲述了JavaScript通过元素id和name直接获取元素的方法,以及自己在实践过程中总结的注意事项。
具体分析如下:
我们知道一些第三方的js库对如何快速选取html中的元素做了一些简化,貌似十分高深莫测,其实也不然。而且js本身自带了对于特殊元素的简便选取的方法,下面就为大家简单介绍下。
在html中,一般最直接的辨别html元素使用的是name和id属性,两者有着细微的不同:id必须页面唯一,但name可以有重复。
在js中如果id名称不和内置属性或全局变量重名的话,该名称自动成为window对象的属性,而在一个html页面中的最顶层环境中有: this === window .
所以如果我们写一个如下的html元素代码:
1 <input type="button" id="btn_ok" value="Ok" onclick="..." />
就可以这样引用它:
1 //可以这样引用 2 btn_ok.onclick = function(){}; 3 //或者下面也是一样的 4 window.btn_ok.style = ...;
对于name属性来说,只有某些类型的html元素具有类似的方法,比如:form,img,iframe,applet,embed,object等。在这些元素中可以通过全局变量或者document的属性来访问特定name属性的元素;如果相同name属性的有多个元素,则返回一个NodeList的类似只读数组的对象,例如如下代码:
1 <div> 2 <img name="pic" src="#" alt="pic_0" /> 3 <img name="pic" src="#" alt="pic_1" /> 4 <img name="pic" src="#" alt="pic_2" /> 5 </div>
我们可以这样引用name为pic的元素:
1 //我们可以这样引用name为pic的元素: 2 for(x in pic) 3 console.log(pic[x].alt); 4 //或者是非"标准"语法each语句方式 5 for each(img in pic) 6 console.log(img.alt);
其他同行的观点:
①这个最初是 IE 里面的,后来 firefox chrome 好像也支持了。不建议使用,这个不是标准里面的,将来不一定支持。
②可以直接这样写的id.style.display="inline";使用id相当于直接成为了window对象的属性,使用window.id可以获取,但是不推荐这种写法,还是用getElementById或者querySelector好。
③getElementById getElementByTagName等方法都是DOM Core的组成部分,并不专属于js,支持DOM的任何一种程序设计语言都支持他们,比如XML编写出来的文档。还有HTML-DOM,比如onclick属性,他们在DOM Core出现很久之前就为人们所熟悉了。你举的这个例子就是属于HTML-DOM,比如,我们可以把下面的语句:document.getElementById('form')简化为 document.form,类似的element.getAttribute('src')简化为element.src.HTML-DOM通常更短,但是只能用来处理web文档。
我在实践过程中发现的问题:
①在HTML元素属性如onclick的JavaScript中直接用id获取元素没有问题;
②在<script></script>内的JavaScript中直接使用id获取元素:如果被引用HTML元素在form窗体标记内,解析用id获取的元素时报异常undefined;如果被引用HTML元素不在form窗体标记内,则解析没有问题。