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 相关文章推荐
JQuery 风格的HTML文本转义
Jul 01 Javascript
Flexigrid在IE下不显示数据的有效处理方法
Sep 04 Javascript
JavaScript修改浏览器tab标题小技巧
Jan 06 Javascript
基于JavaScript实现熔岩灯效果导航菜单
Jan 04 Javascript
Node.js查找当前目录下文件夹实例代码
Mar 07 Javascript
js实现按座位号抽奖
Apr 05 Javascript
angular4自定义组件详解
Sep 28 Javascript
Vue.js在数组中插入重复数据的实现代码
Nov 17 Javascript
微信小程序人脸识别功能代码实例
May 07 Javascript
vue安装遇到的5个报错及解决方法
Jun 12 Javascript
解决layui laydate 时间控件一闪而过的问题
Sep 28 Javascript
Vue2.x-使用防抖以及节流的示例
Mar 02 Vue.js
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
音乐朗读剧《MARS RED》2021年TV动画化决定!
2020/03/06 日漫
PHP Session变量不能传送到下一页的解决方法
2009/11/27 PHP
奇怪的PHP引用效率问题分析
2012/03/23 PHP
PHP strip_tags()去除HTML、XML以及PHP的标签介绍
2014/02/18 PHP
php实现插入排序
2015/03/29 PHP
js类中获取外部函数名的方法
2007/08/19 Javascript
js校验表单后提交表单的三种方法总结
2014/02/28 Javascript
js实现文字垂直滚动和鼠标悬停效果
2015/12/31 Javascript
早该知道的7个JavaScript技巧
2016/06/21 Javascript
Bootstrap3制作搜索框样式的方法
2016/07/11 Javascript
快速实现jQuery多级菜单效果
2017/02/01 Javascript
浅谈js基础数据类型和引用类型,深浅拷贝问题,以及内存分配问题
2017/09/02 Javascript
关于vuejs中v-if和v-show的区别及v-show不起作用问题
2018/03/26 Javascript
深入浅析angular和vue还有jquery的区别
2018/08/13 jQuery
VueJS 组件参数名命名与组件属性转化问题
2018/12/03 Javascript
Vue.extend 编程式插入组件的实现
2019/11/18 Javascript
基于JavaScript实现控制下拉列表
2020/05/08 Javascript
让你30分钟快速掌握vue3教程
2020/10/26 Javascript
原生JS实现弹幕效果的简单操作指南
2020/11/10 Javascript
[01:00:13]完美世界DOTA2联赛 LBZS vs Forest 第一场 11.07
2020/11/09 DOTA
Python3连接MySQL(pymysql)模拟转账实现代码
2016/05/24 Python
Python 爬虫图片简单实现
2017/06/01 Python
利用python获取当前日期前后N天或N月日期的方法示例
2017/07/30 Python
Python读取系统文件夹内所有文件并统计数量的方法
2018/10/23 Python
python 与服务器的共享文件夹交互方法
2018/12/27 Python
django 扩展user用户字段inlines方式
2020/03/30 Python
python实例化对象的具体方法
2020/06/17 Python
解析Tensorflow之MNIST的使用
2020/06/30 Python
解决margin 外边距合并问题
2019/07/03 HTML / CSS
通过css3的filter滤镜改变png图片的颜色的示例代码
2020/05/06 HTML / CSS
工作自我评价分享
2013/12/01 职场文书
工厂车间标语
2014/06/19 职场文书
机械制造专业大学生自我鉴定
2014/09/19 职场文书
2016年小学优秀班主任事迹材料
2016/02/29 职场文书
golang操作rocketmq的示例代码
2022/04/06 Golang
SQL Server删除表中的重复数据
2022/05/25 SQL Server