1. 程式人生 > >指令碼中出現 window.open() access is denied

指令碼中出現 window.open() access is denied

也許這個狀況有的朋友已經知道了,但我還是把自己的分析思路寫下來給其他的朋友參考。
昨天把blog頁面另存在,在本地除錯和改blog面板。
簡介:
我想在onload頁面載入完時用指令碼控制,把Run HTML code, CopyCode, SaveCode這三個按扭動態的新增到css類名為code_textarea的多行文字框裡。
狀況描述:
在非伺服器端(即沒有在本地伺服器下除錯)按扭已經全部出現在多行文字框下,但在除錯指令碼時(點選Run HTML code),出現拒絕訪問...伺服器下除錯正常。
分析:
檢視程式碼,發現是這裡指令碼出錯,程式碼如下:
function fnRunHtmlCode(obj)
{
//try {
//if (typeof(obj)=="string") obj=document.getElementById(obj);
var wnd = window.open('', "_blank", '');
wnd.document.open('text/html', 'replace');
wnd.document.writeln(obj.value);
wnd.document.close();
//} catch(ex) { alert(ex.message) };
};
用Mozilla開啟,執行正則,並且指令碼沒有任何錯誤。弄了將半個小時,我把其餘的程式碼都刪了,在Mozilla中把動態生成的div和button程式碼copy出來察看,把在IE上動態載入的button拷貝到dw裡看,沒有異常。包括把上面的function放在另外一個頁面上執行,依然是正常,並把這個function單獨改成了window.open('','','')還是拒絕訪問。
既然是拒絕訪問,一般情況下肯定是跨域了,但本地除錯,沒有加其它的程式碼呀,怎麼跨域?百思不得其解。
於是想先放上blog再說了。奇怪的是放上伺服器又可以了,於是我把本地的頁面放到本地伺服器下執行,也是正常。這回就更蹊蹺了。說是IE bug?不成立,因為伺服器可以執行。程式碼問題?不成立,因為在其它頁面正常,而且沒有涉及到其它的程式碼。只是funtion,說明肯定是下載的這頁有問題,難道CSDN blog輸出的HTML頁有document.domain類似的程式碼嗎?
分步除錯成功:
把原先所有的程式碼不需要的地方全部去掉(包括Html)。最終簡化如下:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <!-- saved from url=(0053)http://blog.csdn.net/BlueDestiny/category/184440.aspx --> <HTML xmlns="http://www.w3.org/1999/xhtml"><HEAD><TITLE>never-online 's Tech Blog In CSDN - JS & DHTML</TITLE> <META content="MSHTML 6.00.2800.1400" name=GENERATOR> <META http-equiv=Content-Type content="text/html; charset=utf-8"> <script type="text/javascript"> function addEvent(o,w,f) { if (document.all) { o.attachEvent('on'+w, f); } else { o.addEventListener(w, f, false); } } function fnRunHtmlCode(obj) { var wnd = window.open('', '', ''); }; function fnReadyToRunHTMLcode() { insertRunHtmlBtn(document.getElementById("demo")); function insertRunHtmlBtn(obj) { var wrapper = document.createElement("DIV"); wrapper.style.margin="10px 0 10px 0"; var runBtn = document.createElement("INPUT"); runBtn.type = "button"; runBtn.value = "Run HTML Code"; addEvent(runBtn, "click", function() { fnRunHtmlCode(obj) }); obj.parentNode.insertBefore(wrapper, obj.nextSibling); wrapper.appendChild(runBtn); } //} catch (ex) {} } onload = fnReadyToRunHTMLcode; </script> <div class="postText"> <textarea class="code_textarea" id="demo"> </textarea> </div> </body> </html>
[Ctrl+A 全選 提示:你可先修改部分程式碼,再按執行]

執行依然如故。
於是再把DTD去掉。
<HTML xmlns="http://www.w3.org/1999/xhtml"><HEAD><TITLE>never-online 's Tech Blog In CSDN - JS & DHTML</TITLE> <META content="MSHTML 6.00.2800.1400" name=GENERATOR> <META http-equiv=Content-Type content="text/html; charset=utf-8"> <script type="text/javascript"> function addEvent(o,w,f) { if (document.all) { o.attachEvent('on'+w, f); } else { o.addEventListener(w, f, false); } } function fnRunHtmlCode(obj) { var wnd = window.open('', "_blank", ''); wnd.document.open('text/html', 'replace'); wnd.document.writeln(obj.value); wnd.document.close(); }; function fnReadyToRunHTMLcode() { insertRunHtmlBtn(document.getElementById("demo")); function insertRunHtmlBtn(obj) { var wrapper = document.createElement("DIV"); wrapper.style.margin="10px 0 10px 0"; var runBtn = document.createElement("INPUT"); runBtn.type = "button"; runBtn.value = "Run HTML Code"; addEvent(runBtn, "click", function() { fnRunHtmlCode(obj) }); obj.parentNode.insertBefore(wrapper, obj.nextSibling); wrapper.appendChild(runBtn); } //} catch (ex) {} } onload = fnReadyToRunHTMLcode; </script> <div class="postText"> <textarea class="code_textarea" id="demo"> </textarea>
[Ctrl+A 全選 提示:你可先修改部分程式碼,再按執行]

執行正常~~~知道原因所在了。
<!-- saved from url=(0053)http://blog.csdn.net/BlueDestiny/category/184440.aspx -->
這句害我找了半天的原因,總算刨它出來了,證明這句另存為的程式碼在IE下是會有跨域存在的,而Mozilla對這句沒有任何反應。
後記:
對於另存為出現的註釋程式碼
<!-- saved from url=....-->
放在HTML任何部分,在本地非伺服器端除錯都會有拒絕訪問的錯誤,而Mozilla不會。如:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML xmlns="http://www.w3.org/1999/xhtml">
<head></head>
<body>
<!-- saved from url=(0053)http://blog.csdn.net/BlueDestiny/category/184440.aspx -->
<input type="button" value="run" onclick="window.open('','','')"/>
</body>
</html>