IE8提示Invalid procedure call or argument 异常的解决方法


Posted in Javascript onSeptember 30, 2012

1. 环境:
browser_info:"platform:Win32;msie;version:8.0;ie",
navigator:"appCodeName:Mozilla;appName:Microsoft Internet Explorer;appMinorVersion:Release Candidate 1;cpuClass:x86;platform:Win32;systemLanguage:zh-cn;userLanguage:zh-cn;appVersion:4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident\u002F4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729);userAgent:Mozilla\u002F4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident\u002F4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729);onLine:true;cookieEnabled:true"
2. 错误代码:

<!DOCTYPE html><html><head></head> 
<body><div></div></body> 
<script> 
alert(document.body.querySelectorAll); 
var els = document.body.querySelectorAll('div'); 
alert(els[2]);// 2 > els.length-1 
</script> 
</html>

3. 原因分析:
以上代码中,els是一个querySelectorAll的结果。els[2]会抛异常,而不是返回undefined.

4. QWrap代码错误点:在QWrap的selector里,有可能会出现对querySelectorAll结果取下标超界。参见以下代码的红色部分

/* 
* nativeQuery(refEl,sSelector): 如果有原生的querySelectorAll,并且只是简单查询,则调用原生的query,否则返回null. 
* @param {Element} refEl 参考元素 
* @param {string} sSelector selector字符串 
* @returns 
*/ 
function nativeQuery(refEl, sSelector) { 
if (hasNativeQuery && /^((^|,)\s*[.\w-][.\w\s\->+~]*)+$/.test(sSelector)) { 
//如果浏览器自带有querySelectorAll,并且本次query的是简单selector,则直接调用selector以加速 
//部分浏览器不支持以">~+"开始的关系运算符 
var oldId = refEl.id, 
tempId, 
arr = [], 
els; 
if (!oldId && refEl.parentNode) { //标准的querySelectorAll中的selector是相对于:root的,而不是相对于:scope的 
tempId = refEl.id = '__QW_slt_' + nativeQueryStamp++; 
try { 
els = refEl.querySelectorAll('#' + tempId + ' ' + sSelector); 
} finally { 
refEl.removeAttribute('id'); 
} 
} 
else{ 
els = refEl.querySelectorAll(sSelector); 
} 
for (var i = 0, elI; elI = els[i++];) arr.push(elI); 
return arr; 
} 
return null; 
}

5. 反思:

代码A:for (var i = 0, len = els.length; i < len; i++) arr.push(els[i]);

代码B:for (var i = 0, elI; elI = els[i++];) arr.push(elI);
用“代码B”代替“代码A”是一种常见写法,可是,碰到这台机器,却?????????琢恕

6. 问题修复:
老老实实的改回代码A。OK了。

7. 延伸:
“下标超界抛异常,而不是返回undefined”这个坑好?住!!
貌似那同学的机器访问淘宝页面,也有类似异常抛出,不知是否是同样原因。友情@淘宝同学一下。

Javascript 相关文章推荐
javascript面向对象程序设计(一)
Jan 29 Javascript
AngularJS学习笔记之ng-options指令
Jun 16 Javascript
百度地图API之本地搜索与范围搜索
Jul 30 Javascript
JQUERY的AJAX请求缓存里的数据问题处理
Feb 23 Javascript
jQuery基于函数重载实现自定义Alert函数样式的方法
Jul 27 Javascript
微信小程序 Image API实例详解
Sep 30 Javascript
jQuery实现淡入淡出的模态框
Feb 09 Javascript
BootStrap+Mybatis框架下实现表单提交数据重复验证
Mar 23 Javascript
jQuery 中msgTips 顶部弹窗效果实现代码
Aug 14 jQuery
Node.js中sequelize时区的配置方法
Dec 10 Javascript
react结合bootstrap实现评论功能
May 30 Javascript
JavaScript浅层克隆与深度克隆示例详解
Sep 01 Javascript
js 手机号码合法性验证代码集合
Sep 29 #Javascript
JavaScript模板入门介绍
Sep 26 #Javascript
JavaScript快速检测浏览器对CSS3特性的支持情况
Sep 26 #Javascript
JavaScript 参数中的数组展开 [译]
Sep 21 #Javascript
JavaScript中将一个值转换为字符串的方法分析[译]
Sep 21 #Javascript
使用apply方法处理数组的三个技巧[译]
Sep 20 #Javascript
js DOM 元素ID就是全局变量
Sep 20 #Javascript
You might like
部署PHP项目应该注意的几点事项分享
2013/12/20 PHP
Yii开启片段缓存的方法
2016/03/28 PHP
论坛特效代码收集(落伍转发-不错)
2006/12/02 Javascript
用JQuery调用Session的实现代码
2010/10/29 Javascript
js Html结构转字符串形式显示代码
2011/11/15 Javascript
用js实现输入提示(自动完成)的实例代码
2013/06/14 Javascript
自制的文件上传JS控件可支持IE、chrome、firefox etc
2014/04/18 Javascript
jQuery实现提交按钮点击后变成正在处理字样并禁止点击的方法
2015/03/24 Javascript
nodejs 中模拟实现 emmiter 自定义事件
2016/02/22 NodeJs
jquery.form.js框架实现文件上传功能案例解析(springmvc)
2016/05/26 Javascript
15个非常实用的JavaScript代码片段
2016/12/18 Javascript
jQuery Pagination分页插件使用方法详解
2017/02/28 Javascript
关于JS模块化的知识点分享
2019/10/16 Javascript
6种JavaScript继承方式及优缺点(小结)
2020/02/06 Javascript
2020京东618叠蛋糕js脚本(亲测好用)
2020/06/02 Javascript
vue基础知识--axios合并请求和slot
2020/06/04 Javascript
vue-amap根据地址回显地图并mark的操作
2020/11/03 Javascript
微信小程序实现倒计时功能
2020/11/19 Javascript
python 定义给定初值或长度的list方法
2018/06/23 Python
python实现多人聊天室
2020/03/31 Python
Python实现的拉格朗日插值法示例
2019/01/08 Python
Python多线程处理实例详解【单进程/多进程】
2019/01/30 Python
python实现在函数中修改变量值的方法
2019/07/16 Python
Python hashlib模块加密过程解析
2019/11/05 Python
python列表的逆序遍历实现
2020/04/20 Python
python怎么对数字进行过滤
2020/07/05 Python
英国最大的女士服装零售商:Bonmarché
2017/08/17 全球购物
介绍一下write命令
2014/08/10 面试题
初中学生期末评语
2014/04/24 职场文书
就职演讲稿范文
2014/05/19 职场文书
先进员工获奖感言
2014/08/14 职场文书
经贸日语专业自荐信
2014/09/02 职场文书
2014年幼儿园教学工作总结
2014/12/04 职场文书
公司更名通知函
2015/04/24 职场文书
小学大队长竞选稿
2015/11/20 职场文书
MySQL面试题讲解之如何设置Hash索引
2021/11/01 MySQL