1. 環境: browser_info:"platform:Win32;msie;version:8.0;ie",
navigator:"appCodeName:Mozilla;appName:Microsoft Internet Explorer;appMinorVersion:Release Candidate 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 のセレクターで、querySelectorAll の結果が下位の境界を取得する可能性があります。 * @returns
*/
functionネイティブQuery(refEl, sSelector) {
if (hasNativeQuery && /^((^|,)s*[.w-][.ws-> ~]*) $/.test(sSelector)) {
//如果浏览器自带有querySelectorAll 、そして、今回のクエリは単一のセレクターであり、セレクターを直接調整して
// 一部のデバイスはサポートされていません">~ "最初のシステム計算符
var oldId = refEl.id,
tempId、
arr = []、
els;
if (!oldId && refEl.parentNode) { //標準のquerySelectorAll 内のセレクターは、:scope ではなく、:root に対応しています。
try {
els = refEl.querySelectorAll('#' tempId ' ' sSelector);
} 最後に {
refEl.removeAttribute('id');
}
}
else{
els = refEl.querySelectorAll(sSelector);
}
for (var i = 0, elI; elI = els[i ];) arr.push(elI);
arr を返します;
}
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);
は、「代コード A」の代わりに「代コード B」を使用します。これは、このマシンに組み込まれ、変更が実行される可能性があります。 修正:
老老実装の変更コード A。OK 完了。
7. 拡張子:
「未定義を返すのではなく、下にある境界が常に表示されます」この坑道は好都合です。原因。友情@淘宝同学一下。