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 相关文章推荐
JS中批量给元素绑定事件过程中的相关问题使用闭包解决
Apr 15 Javascript
jQuery 隐藏和显示 input 默认值示例
Jun 03 Javascript
JavaScript实现点击自动选择TextArea文本的方法
Jul 02 Javascript
浅谈移动端之js touch事件 手势滑动事件
Nov 07 Javascript
JS获取指定月份的天数两种实现方法
Jun 22 Javascript
详解webpack引入第三方库的方式以及注意事项
Jan 15 Javascript
Vue infinite update loop的问题解决
Apr 23 Javascript
浅谈Express.js解析Post数据类型的正确姿势
May 30 Javascript
javascript实现一款好看的秒表计时器
Sep 05 Javascript
如何使用 vue-cli 创建模板项目
Nov 19 Vue.js
js定时器出现第一次延迟的原因及解决方法
Jan 04 Javascript
JavaScript 定时器详情
Nov 11 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类与对象中的private访问控制的疑问
2012/11/01 PHP
Yii2实现log输出到file及database的方法
2016/11/12 PHP
我见过最全的个人js加解密功能页面
2007/12/12 Javascript
使用jquery给input和textarea设定ie中的focus
2008/05/29 Javascript
window.onload和$(function(){})的区别介绍
2013/10/30 Javascript
jquery 字符串切割函数substring的用法说明
2014/02/11 Javascript
JavaScript设计模式之单件模式介绍
2014/12/28 Javascript
PHP中CURL的几个经典应用实例
2015/01/23 Javascript
javascript实现超炫的向上滑行菜单实例
2015/08/03 Javascript
jquery form表单获取内容以及绑定数据
2016/02/24 Javascript
JavaScript实现图片自动加载的瀑布流效果
2016/04/11 Javascript
详解PHP中pathinfo()函数导致的安全问题
2017/01/05 Javascript
js canvas实现擦除效果示例代码
2017/04/26 Javascript
springmvc接收jquery提交的数组数据代码分享
2017/10/28 jQuery
vue element项目引入icon图标的方法
2018/06/06 Javascript
JS实现的视频弹幕效果示例
2018/08/17 Javascript
详解关于微信setData回调函数中的坑
2019/02/18 Javascript
[06:16]第十四期-国士无双绝地翻盘之撼地神牛
2014/06/24 DOTA
[03:34]2014DOTA2西雅图国际邀请赛 淘汰赛7月15日TOPPLAY
2014/07/15 DOTA
[00:14]PWL:老朋友Mushi拍VLOG与中国玩家问好
2020/11/04 DOTA
Python爬虫利用cookie实现模拟登陆实例详解
2017/01/12 Python
python 第三方库的安装及pip的使用详解
2017/05/11 Python
python2.7实现爬虫网页数据
2018/05/25 Python
python最长回文串算法
2018/06/04 Python
Python中is和==的区别详解
2018/11/15 Python
opencv设置采集视频分辨率方式
2019/12/10 Python
Python模块的定义,模块的导入,__name__用法实例分析
2020/01/07 Python
python3中的logging记录日志实现过程及封装成类的操作
2020/05/12 Python
Python 2.6.6升级到Python2.7.15的详细步骤
2020/12/14 Python
基于zepto的插件之移动端无缝向上滚动并上下触摸滑动实例代码
2016/12/20 HTML / CSS
美国开幕式潮店:Opening Ceremony
2018/02/10 全球购物
Farfetch美国:奢侈品牌时尚购物平台
2019/05/02 全球购物
在校硕士自我鉴定
2014/01/23 职场文书
大学四年个人的自我评价
2014/02/26 职场文书
辞职信标准格式
2015/02/27 职场文书
HAM-2000摩机图
2021/04/22 无线电