動(dòng)態(tài)彈出浮層,跨域加載一個(gè) iframe 頁面,發(fā)現(xiàn) IE6 下無法正常顯示。見圖所示:
最初懷疑是 innerHTML
方式創(chuàng)建 iframe 節(jié)點(diǎn)導(dǎo)致的:
document.getElementById('a').innerHTML = '<iframe width="500" height="100" src="http://www.mangguo.org/"></iframe>';
但這樣操作實(shí)際測(cè)試 IE6 是可以正常顯示 iframe 頁面的。百度之,發(fā)現(xiàn)同類問題有,但大多都是拷貝復(fù)制,沒一個(gè)靠譜的。
做了幾個(gè)簡(jiǎn)單的測(cè)試發(fā)現(xiàn),通過 innerHTML 方式創(chuàng)建 iframe 節(jié)點(diǎn),通過 createElement 創(chuàng)建節(jié)點(diǎn)再設(shè)置 src 屬性這兩種情況均不存在 IE6 顯示空白的情況:
那么也就剩下一種可能,通過事件觸發(fā)動(dòng)態(tài)創(chuàng)建 iframe 節(jié)點(diǎn)才會(huì)導(dǎo)致這種狀況,于是又有以下幾個(gè)測(cè)試:
情況一,觸發(fā)源是 a 標(biāo)簽
document.getElementById('c_btn1').onclick = function () { document.getElementById('c1').innerHTML = '<iframe src="http://www.mangguo.org/" width="500" height="100"></iframe>';}
情況二,觸發(fā)源是 a 標(biāo)簽,但沒有 href 屬性
document.getElementById('c_btn2').onclick = function () { document.getElementById('c2').innerHTML = '<iframe src="http://www.mangguo.org/" width="500" height="100"></iframe>';}
情況三,觸發(fā)源是 button 標(biāo)簽:
document.getElementById('c_btn3').onclick = function () { document.getElementById('c3').innerHTML = '<iframe src="http://www.mangguo.org/" width="500" height="100"></iframe>';}
這三種情況下除了第一種 IE6 無法成功加載 iframe,導(dǎo)致 iframe 區(qū)塊顯示空白外,其余情況均正常。也就是說,問題的根源在于點(diǎn)擊 a 標(biāo)簽觸發(fā)加載行為。并不在于使用 innerHTML
方法。通過以下例子(標(biāo)簽 a 觸發(fā)同時(shí)使用 createElement 創(chuàng)建節(jié)點(diǎn))可以驗(yàn)證這一點(diǎn)的正確:
document.getElementById('d_btn').onclick = function () { var el = document.createElement('iframe'); el.width = '500'; el.height = '100'; el.src = 'http://www.mangguo.org/'; document.getElementById('d').appendChild(el);}
結(jié)論:通過 a 標(biāo)簽觸發(fā)加載 iframe 頁面的行為會(huì)導(dǎo)致 IE6 下 iframe 頁面空白。
解決方案:創(chuàng)建 DOM 后,再對(duì)該 iframe 的 src 進(jìn)行一次重置:
iframeEl.src = iframeEl.src;
或者干脆就不要用 a 標(biāo)簽了。詳細(xì)請(qǐng)參考 demo:
提示:可修改后代碼再運(yùn)行!
芒果小站的原文DEMO:ie6_iframe_bug.html