一道JS面试题目引发的思考
2010-05-19 20:58
597 查看
今看到一道有意思的题目,引发很多未知的东西,页面上有html代码如下:
<body>
<form id="form1" runat="server">
<div id="Div1"></div>
<div id="Div2"></div>
<div id="Div3"></div>
<div id="Div4"></div>
<div id="Div5"></div>
<div id="Div3">这是重复的DIV元素</div>
</form>
</body>
找出html中重复id的元素。如果是我来解答那应该就是先得到所有的元素document.getElementsByTagName("*"),然后一个一个去匹配数组中有没有重复的,这样应该是两个for循环。- _-|||
现在摘录网上比较牛B的解法。
方法一:巧用document.getElementById
document.getElementById根据id获取DOM对象时,如果有多个同名id,获取的是第一个该id的DOM对象,获取所有标签后,逆序遍历判断该DOM元素o与document.getElementById(o.id)是不是同一个DOM元素,是就继续,不是就说明id重复了。
利用对象中的hasOwnProperty()方法
var el = document.getElementsByTagName("*");
//声明一个对象
var obj = {};
for (var i = 0; i < el.length; i++) {
if (el[i].id != "") {
//obj对象中是否已经有该属性
if (obj.hasOwnProperty(el[i].id)) {
return alert("有重复" + el[i].id)
}
//没有就给该对象添加这么一个属性,赋值为空
else {
obj[el[i].id] = '';
}
}
}
另外补充知识:
JavaScript中ActiveXObject对象是启用并返回 Automation 对象的引用。通过它可以访问windows的本地文件系统和应用程序,比如:有的时候我们需要得到用户的机器名,用户名,得到某个文件的信息,或者读写注册表,或者启动计算器、outlook等应用程序。
var WshNetwork = new ActiveXObject("WScript.Network");
var pnsys = new ActiveXObject("WScript.shell");
var fs = new ActiveXObject("scripting.filesystemobject"); //文件信息相关
new ActiveXObject("Scripting.Dictionary");//字典对象
它的集合中每一项包含两个属性一个是键值,一个是值,即(key,value),其中value可以是任何类型的对象或数值。
示例代码:
var obj = new ActiveXObject("Scripting.Dictionary"); //创建对象
obj.Add("hello", null); //增加新项
obj.Item("hello") = "Chiweiyao"; //给新增添的项赋值
obj.Add("world", null);
obj.Item("world") = "Greate";
var keys = obj.Keys().toArray(); //将obj对象的键值转换成数组
for (var i = 0; i < keys.length; i++) {
if (obj.Exists(keys[i])) {//判断对象集合中是否存在指定键值的项
obj.Item(keys[i]) = null;
obj.Remove(keys[i]); //删除指定键值项
}
}
最常用的貌似是AJAX中的ActiveXObject("Microsoft.XMLHTTP");
最杯具的是ActiveXObject只有IE支持,如果要FF支持有两个方法:
1、使用IETab插件,在Firefox下调用IE浏览器内核
2、使用npActivexPlugin插件
<body>
<form id="form1" runat="server">
<div id="Div1"></div>
<div id="Div2"></div>
<div id="Div3"></div>
<div id="Div4"></div>
<div id="Div5"></div>
<div id="Div3">这是重复的DIV元素</div>
</form>
</body>
找出html中重复id的元素。如果是我来解答那应该就是先得到所有的元素document.getElementsByTagName("*"),然后一个一个去匹配数组中有没有重复的,这样应该是两个for循环。- _-|||
现在摘录网上比较牛B的解法。
方法一:巧用document.getElementById
document.getElementById根据id获取DOM对象时,如果有多个同名id,获取的是第一个该id的DOM对象,获取所有标签后,逆序遍历判断该DOM元素o与document.getElementById(o.id)是不是同一个DOM元素,是就继续,不是就说明id重复了。
利用对象中的hasOwnProperty()方法
var el = document.getElementsByTagName("*");
//声明一个对象
var obj = {};
for (var i = 0; i < el.length; i++) {
if (el[i].id != "") {
//obj对象中是否已经有该属性
if (obj.hasOwnProperty(el[i].id)) {
return alert("有重复" + el[i].id)
}
//没有就给该对象添加这么一个属性,赋值为空
else {
obj[el[i].id] = '';
}
}
}
另外补充知识:
JavaScript中ActiveXObject对象是启用并返回 Automation 对象的引用。通过它可以访问windows的本地文件系统和应用程序,比如:有的时候我们需要得到用户的机器名,用户名,得到某个文件的信息,或者读写注册表,或者启动计算器、outlook等应用程序。
var WshNetwork = new ActiveXObject("WScript.Network");
var pnsys = new ActiveXObject("WScript.shell");
var fs = new ActiveXObject("scripting.filesystemobject"); //文件信息相关
new ActiveXObject("Scripting.Dictionary");//字典对象
它的集合中每一项包含两个属性一个是键值,一个是值,即(key,value),其中value可以是任何类型的对象或数值。
示例代码:
var obj = new ActiveXObject("Scripting.Dictionary"); //创建对象
obj.Add("hello", null); //增加新项
obj.Item("hello") = "Chiweiyao"; //给新增添的项赋值
obj.Add("world", null);
obj.Item("world") = "Greate";
var keys = obj.Keys().toArray(); //将obj对象的键值转换成数组
for (var i = 0; i < keys.length; i++) {
if (obj.Exists(keys[i])) {//判断对象集合中是否存在指定键值的项
obj.Item(keys[i]) = null;
obj.Remove(keys[i]); //删除指定键值项
}
}
最常用的貌似是AJAX中的ActiveXObject("Microsoft.XMLHTTP");
最杯具的是ActiveXObject只有IE支持,如果要FF支持有两个方法:
1、使用IETab插件,在Firefox下调用IE浏览器内核
2、使用npActivexPlugin插件
相关文章推荐
- 一道面试题目引发的思考
- 一道面试题目引发的思考
- 一道面试题目引发的思考
- 一道原生js题目引发的思考(鼠标停留区块计时)
- 一道面试题目引发的思考
- 一道面试题引发的对 JS 类型转换的思考
- 一道经典面试引发的思考:从输入URL到页面加载的过程
- 一道笔试题目引发的思考
- 一道js的面试题目
- ssd上一道题目引发的思考
- 一道简单的题目引发的思考
- 阿里巴巴Web前端面试的一道JS题目,求解答!!!
- 一道简单的题目引发的思考
- C++ 一道简单的题目引发的思考
- 一道socket题目引发的思考
- i++与++i一道简单的题目引发的思考
- 一道简单的题目引发的思考
- 一道 JS 面试题引发的思考
- 一道简单的题目引发的思考
- 一道题目引发的多角度思考