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 相关文章推荐
在IE中调用javascript打开Excel的代码(downmoon原作)
Apr 02 Javascript
网页和浏览器兼容性问题汇总(draft1)
Jun 01 Javascript
javascript 面向对象编程 聊聊对象的事
Sep 17 Javascript
根据身份证号自动输出相关信息(籍贯,出身日期,性别)
Nov 15 Javascript
js获取input长度并根据页面宽度设置其大小及居中对齐
Aug 22 Javascript
js简单实现标签云效果实例
Aug 06 Javascript
JS脚本实现动态给标签控件添加事件的方法
Jun 02 Javascript
AngularJS select加载数据选中默认值的方法
Feb 28 Javascript
Node.js之删除文件夹(含递归删除)代码实例
Sep 09 Javascript
对Layer UI 模块化的用法详解
Sep 26 Javascript
解决ele ui 表格表头太长问题的实现
Nov 13 Javascript
js实现验证码功能
Jul 24 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 应用程序安全防范技术研究
2009/09/25 PHP
PHP array_push 数组函数
2009/12/26 PHP
适用于抽奖程序、随机广告的PHP概率算法实例
2014/04/09 PHP
destoon实现公司新闻详细页添加评论功能的方法
2014/07/15 PHP
Laravel中的Blade模板引擎示例详解
2017/10/10 PHP
TP5(thinkPHP框架)实现后台清除缓存功能示例
2019/05/29 PHP
jQuery之$(document).ready()使用介绍
2012/04/05 Javascript
分享一道笔试题[有n个直线最多可以把一个平面分成多少个部分]
2012/10/12 Javascript
node+express+ejs制作简单页面上手指南
2014/11/26 Javascript
JavaScript实现的链表数据结构实例
2015/04/02 Javascript
JavaScript生成二维码图片小结
2015/12/27 Javascript
bootstrap为水平排列的表单和内联表单设置可选的图标
2017/02/15 Javascript
jQuery插件FusionCharts绘制的2D双柱状图效果示例【附demo源码】
2017/05/13 jQuery
Ionic3 UI组件之Gallery Modal详解
2017/06/07 Javascript
深究AngularJS如何获取input的焦点(自定义指令)
2017/06/12 Javascript
分析JavaScript数组操作难点
2017/12/18 Javascript
Ionic学习日记实现验证码倒计时
2018/02/08 Javascript
记录一篇关于redux-saga的基本使用过程
2018/08/18 Javascript
手动下载Chrome并解决puppeteer无法使用问题
2018/11/12 Javascript
vue实现两个区域滚动条同步滚动
2020/12/13 Vue.js
[01:06]DOTA2小知识课堂 Ep.01 TP出门不要忘记帮队友灌瓶哦
2019/12/05 DOTA
[37:21]完美世界DOTA2联赛PWL S2 Inki vs Magma 第二场 11.22
2020/11/24 DOTA
线程和进程的区别及Python代码实例
2015/02/04 Python
python连接字符串的方法小结
2015/07/13 Python
关于python3.9安装wordcloud出错的问题及解决办法
2020/11/02 Python
运动鞋中的劳斯莱斯:索康尼(SAUCONY)
2017/08/09 全球购物
Capitol Lighting的1800lighting.com:住宅和商业照明
2019/04/10 全球购物
const char*, char const*, char*const的区别是什么
2014/07/09 面试题
护士辞职信模板
2014/01/20 职场文书
《泉水》教学反思
2014/04/11 职场文书
超市开业庆典策划方案
2014/05/14 职场文书
党的群众路线教育实践活动整改落实情况报告
2014/10/28 职场文书
简单的离婚协议书范本
2014/11/16 职场文书
夫妻忠诚协议范文
2014/11/16 职场文书
财务负责人岗位职责
2015/02/03 职场文书
MySQL 数据表操作
2022/05/04 MySQL