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 相关文章推荐
Extjs列表详细信息窗口新建后自动加载解决方法
Apr 02 Javascript
基于prototype扩展的JavaScript常用函数库
Nov 30 Javascript
JavaScript中json对象和string对象之间相互转化
Dec 26 Javascript
jsp网页搜索结果中实现选中一行使其高亮
Feb 17 Javascript
jqGrid读取选择的多行的某个属性代码
May 18 Javascript
跟我学习javascript的全局变量
Nov 16 Javascript
js跨浏览器的事件侦听器和事件对象的使用方法
Dec 17 Javascript
JavaScript实现简单Tip提示框效果
Apr 20 Javascript
JavaScript输入框字数实时统计更新
Jun 17 Javascript
JavaScript实现简单的隐藏式侧边栏功能示例
Aug 31 Javascript
微信开发之微信jssdk录音功能开发示例
Oct 22 Javascript
js实现头像上传并且可预览提交
Dec 25 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中实现Javascript的escape()函数代码
2010/08/08 PHP
PHP遍历并打印指定目录下所有文件实例
2014/02/10 PHP
PHP register_shutdown_function()函数的使用示例
2015/06/23 PHP
php实现通过cookie换肤的方法
2015/07/13 PHP
PHP保存Base64图片base64_decode的问题整理
2019/11/04 PHP
JQuery对checkbox操作 (循环获取)
2011/05/20 Javascript
nodejs npm install全局安装和本地安装的区别
2014/06/05 NodeJs
最简单的JavaScript图片轮播代码(两种方法)
2015/12/18 Javascript
JS中常用的输出方式(五种)
2016/06/12 Javascript
浅析JavaScript中的array数组类型系统
2016/07/18 Javascript
JS实现的点击表头排序功能示例
2017/03/27 Javascript
Bootstrap Table使用整理(四)之工具栏
2017/06/09 Javascript
JavaScript 完成注册页面表单校验的实例
2017/08/19 Javascript
JS Testing Properties 判断属性是否在对象里的方法
2017/10/01 Javascript
Js经典案例的实例代码
2018/05/10 Javascript
在layui下对元素进行事件绑定的实例
2019/09/06 Javascript
JavaScript实现横版菜单栏
2020/03/17 Javascript
Python原始字符串(raw strings)用法实例
2014/10/13 Python
python操作 hbase 数据的方法
2016/12/18 Python
python中的tcp示例详解
2018/12/09 Python
numpy库与pandas库axis=0,axis= 1轴的用法详解
2019/05/27 Python
Python和Sublime整合过程图示
2019/12/25 Python
PyCharm2020.1.1与Python3.7.7的安装教程图文详解
2020/08/07 Python
基于Python实现全自动下载抖音视频
2020/11/06 Python
CSS3实现滚动条动画效果代码分享
2016/08/03 HTML / CSS
使用CSS3实现input多选框自定义样式的方法示例
2019/07/19 HTML / CSS
Html+Css+Jquery实现左侧滑动拉伸导航菜单栏的示例代码
2020/03/17 HTML / CSS
查找廉价航班和发现新目的地:Kiwi.com
2019/02/25 全球购物
教师师德教育的自我评价
2013/10/31 职场文书
反洗钱宣传活动总结
2014/08/26 职场文书
运动会广播稿200字(10篇)
2014/10/12 职场文书
2014年爱国卫生工作总结
2014/11/22 职场文书
三好学生个人总结
2015/02/15 职场文书
2015年政治教研组工作总结
2015/07/22 职场文书
浅谈redis整数集为什么不能降级
2021/07/25 Redis
nginx中proxy_pass各种用法详解
2021/11/07 Servers