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 EasyUI API 中文文档 - NumberSpinner数值微调器使用介绍
Oct 21 Javascript
js或者jquery判断图片是否加载完成实现代码
Mar 20 Javascript
原生js实现给指定元素的后面追加内容
Apr 10 Javascript
js小数运算出现多位小数如何解决
Oct 08 Javascript
JS组件Bootstrap ContextMenu右键菜单使用方法
Apr 17 Javascript
AngularJS $injector 依赖注入详解
Sep 14 Javascript
使用JQuery选择HTML遍历函数的方法
Sep 17 Javascript
js实现简单的计算器功能
Jan 16 Javascript
Vue.js实现多条件筛选、搜索、排序及分页的表格功能
Nov 24 Javascript
angular4模块中给标签添加背景图的实现方法
Sep 15 Javascript
ES6顶层对象、global对象实例分析
Jun 14 Javascript
js+springMVC 提交数组数据到后台的实例
Sep 21 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和MySql来与ODBC数据连接
2006/10/09 PHP
PHP中ini_set和ini_get函数的用法小结
2014/02/18 PHP
ThinkPHP页面跳转success与error方法概述
2014/06/25 PHP
yii实现创建验证码实例解析
2014/07/31 PHP
PHP图像识别技术原理与实现
2016/10/27 PHP
jQuery 使用手册(一)
2009/09/23 Javascript
js 学习笔记(三)
2009/12/29 Javascript
Google AJAX 搜索 API实现代码
2010/11/17 Javascript
javascript实用小函数使用介绍
2013/11/11 Javascript
jquery $(document).ready()和window.onload的区别浅析
2015/02/04 Javascript
javascript变量声明实例分析
2015/04/25 Javascript
jsonp跨域请求数据实现手机号码查询实例分析
2015/12/12 Javascript
javascript作用域、作用域链(菜鸟必看)
2016/06/16 Javascript
Angular.Js的自动化测试详解
2016/12/09 Javascript
JQuery选中select组件被选中的值方法
2018/03/08 jQuery
JS封装的模仿qq右下角消息弹窗功能示例
2018/08/22 Javascript
解决Vue 项目打包后favicon无法正常显示的问题
2018/09/01 Javascript
vue插件draggable实现拖拽移动图片顺序
2018/12/01 Javascript
react MPA 多页配置详解
2019/10/18 Javascript
Vue中rem与postcss-pxtorem的应用详解
2019/11/20 Javascript
详解vue中v-bind:style效果的自定义指令
2020/01/21 Javascript
JavaScript 实现下雪特效的示例代码
2020/09/09 Javascript
js 压缩图片的示例(只缩小体积,不更改图片尺寸)
2020/10/21 Javascript
python实现泊松图像融合
2018/07/26 Python
python 使用值来排序一个字典的方法
2018/11/16 Python
python实现单链表的方法示例
2019/09/03 Python
python 一维二维插值实例
2020/04/22 Python
用HTML5 Canvas API中的clearRect()方法实现橡皮擦功能
2016/03/15 HTML / CSS
StubHub澳大利亚:购买或出售您的门票
2019/08/01 全球购物
廉洁教育学习材料
2014/05/19 职场文书
金融系应届毕业生求职信
2014/05/26 职场文书
班子四风对照检查材料
2014/08/21 职场文书
党员组织生活会发言材料
2014/10/17 职场文书
协议书范文
2015/01/27 职场文书
中国古代史学名著《战国策》概述
2019/08/09 职场文书
element多个表单校验的实现
2021/05/27 Javascript