1. 环境: browser_info:"platform:Win32;msie;version:8.0;ie",
navigator:"appCodeName:Mozilla;appName:Microsoft Internet Explorer;appMinorVersion:릴리스 후보 1;cpuClass:x86; 플랫폼:Win32;systemLanguage:zh-cn;userLanguage:zh-cn;appVersion:4.0(호환; MSIE 8.0; Windows NT 5.1; Tridentu002F4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729);userAgent:Mozillau002F4.0(호환; MSIE 8.0; Windows NT 5.1; Tridentu002F4.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. 错误代码:
<스크립트>
alert(document.body.querySelectorAll);
var els = document.body.querySelectorAll('div');
alert(els[2]);// 2 > els.length-1
3. 원본 분할:
以上代码中, els是一个querySelectorAll의 유형.els[2]会抛异常, 而不是返回은 정의되지 않았습니다.
4. QWrap代码错误点: QWrap의 선택기 위치에 있으며, 여기에는 많은 쿼리SelectorAll结果取下标超界가 있습니다. 🎜>复제조대码
代码如下: /* * NativeQuery(refEl,sSelector): 如果有原生querySelectorAll,并且只是简单查询,则调用原生的query ,否则返回null. * @param {Element} refEl 参考元素
* @param {string} sSelector 선택기字符串
* @returns
*/
function NativeQuery(refEl, sSelector) {
if (hasNativeQuery && /^((^|,)s*[.w-][.ws-> ~]*) $/.test(sSelector)) {
//如果浏览器自带有querySelectorAll ,并且本次query是简单selector,则直接调用selector以加速
//part浏览器不支持以">~ "开始的关系运算符
var oldId = refEl. 이드,
tempId,
arr = [],
els;
if (!oldId && refEl.parentNode) { //标准적querySelectorAll中적selector是상对于:root적, 而不是상对于:scope적
tempId = refEl.id = '__QW_slt_' NativeQueryStamp ;
시도해 보세요 {
els = refEl.querySelectorAll('#' tempId ' ' sSelector);
} 마침내 {
refEl.removeAttribute('id');
}
}
else{
els = refEl.querySelectorAll(sSelector);
}
for (var i = 0, elI; elI = els[i ];) arr.push(elI);
반납 도착;
}
null을 반환합니다.
}
5. 反思:
代码A:for (var i = 0, len = els.length; i 代码B: for (var i = 0, elI; elI = els[i ];) arr.push(elI); 用“代码 b”代替“代码 a”是一种常见写法 是一种常见写法, 可是, 碰到这台机器 碰到这台机器, 却冏冏冏冏冏冏冏冏冏了。 6. 问题修复:
老老实实的改回代码A。OK了。
7. 延伸: “下标超界抛异常,而不是返回undefine”这个坑好冏。。似异常抛出 ,不知是否是同样原因。友情@淘宝同文下。