[英]How to pause JavaScript execution in Internet Explorer?
我有以下場景:
隨后將嵌套頁面加載到主頁面的iframe中。 兩個頁面在頁面加載時從公共JS文件調用函數。
現場演示:
http://www.ecmazing.com/misc/pause-execution/mainpage.html
http://www.ecmazing.com/misc/pause-execution/nestedpage.html
http://www.ecmazing.com/misc/pause-execution/common.js
常見的JS文件包含一個全局函數,它將H1元素繪制為紅色。 我想在該函數的開頭暫停執行,以便在H1元素仍為黑色時暫停執行。
這是微不足道的。 只需加載頁面,打開瀏覽器的開發工具,選擇common.js文件,並在函數的第一行設置斷點。 現在, 重新加載頁面。 斷點將持續重新加載,執行將暫停。
現在,在Chrome和Firefox(Firebug)中,上面設置的斷點(對於主頁面)也適用於嵌套頁面。 兩個頁面都使用相同的JS文件,並且在該文件中設置斷點將自動應用於這兩個頁面。 不幸的是,這條規則不適用於IE。
更糟糕的是,即使我隨后設置了斷點,然后僅重新加載iframe ,斷點也不會持續存在。
所以,我不知道如何在IE中暫停執行嵌套頁面。 可以嗎? (我正在通過手動設置debugger;
處理這個問題debugger;
在函數的開頭,但我希望能夠通過IE中的開發工具設置斷點,如果可能的話。)
我能找到最接近解決方案的方法是在主頁面上的loadIFrame()函數中設置斷點,然后“插入”直到加載嵌套頁面的Common.js文件。 在一個更復雜的示例中,您可以在新的Common.js文件中設置斷點,它們可以正常工作,直到下次加載iframe時,它們都會再次丟失。
我沒有IE9進行測試,但也許您可以將common.js
文件視為iframe頁面的單獨資產? 我相信這就是它在其他瀏覽器中工作的原因,因為這些文件必須由瀏覽器標記或標記 。
一個例子是將?iframePage
附加到iframe頁面上的common.js
的末尾。 至少在Firefox中顯示一個加載為common.js?iframePage
的資產。 瀏覽器會忽略查詢字符串之后的所有內容,但JavaScript會加載該確切名稱。
另一個例子是制作common.js
的副本並將其重命名為commonClone.js
,然后將其用於iframe頁面。
這兩個示例都可能允許您在IE9中設置兩次斷點,每個資產一次。
也就是說,沒有什么能阻止你創建iframe只有斷頁 ,這些斷點獨立於父頁面正在使用的common.js
文件。這個方法,我們稱之為並行斷點 ,允許從iframe頁面開始對JavaScript進行異步調試。 父頁面正在獨立處理JavaScript,但可能正在協同工作。
此方法的參考來自官方源 MSDN Library: 使用F12開發人員工具調試JavaScript錯誤部分管理斷點 ,顯示如何在多個JavaScript文件上執行斷點。
根據IE9開發者論壇最近的一篇論壇帖子 ,防止在用於調試時重新加載JavaScript文件的解決方案是使用內聯事件處理程序而不是attachEvent ,如下例所示:
replace (or comment it out)
$(document).onload(function(){ mycustomonload functions});
with
<body onload="mycustomonload functions">
如果您僅為兼容性測試而這樣做,那么您是否嘗試過使用IETab插件進行Chrome?
這可以模擬IE的渲染引擎,同時允許您使用Chrome調試器。
如果這還不夠好,那么我認為你已經陷入僵局,IE開發工具就不夠復雜了。
也許,如果你可以重構你的Html和JavaScript代碼,你只能從父頁面引用common.js
,並使主頁面和嵌套頁面都使用相同的JavaScript函數。
這樣一個斷點就可以滿足兩種情況。
要在IE中調試iframe,並能夠設置和保留斷點,您可以在自己的選項卡/窗口中打開iframe地址。 但是,如果iframe與其父級進行通信,則這是不可能/直接的。
我希望你至少使用IE Debuggy Bar。 使用此代碼更新您的common.js文件
function func () {
if(typeof window.parent.debug !== "undefined"){
window.parent.debug();
}
document.getElementsByTagName( 'h1')[0].style.color = 'red';
}
function debug(){
var a = "break here";
}
將斷點設為var a = "break here";
主頁加載后 當您點擊Load Iframe按鈕時,js將在該行停止。 使用調用堆棧導航到以前的javascript指令(行),該指令應位於nestedpage.html中的common.js文件中。 現在設置另一個斷點,無論你想要什么,並在調試器中點擊繼續,或使用STEP功能
==更新===
順便說一句,回答你的問題,為什么斷點不能堅持在iframe中,這樣想。 每次單擊“加載IFrame”按鈕時, window
對象的舊實例將被放置在內存中,並使用新的common.js實例創建所有斷點和new。 如果你要調用windows.open("http://......");
也會發生同樣的情況windows.open("http://......");
另外請記住,即使您在兩個window(s)
加載了相同的文件,它也會在瀏覽器中加載兩個不同的執行框架。 您可以運行兩個相同瀏覽器的瀏覽器實例,但它們不會在窗口中顯示相同的頁面。 Tho,有些東西是共享的,比如cookie,但這超出了本主題的范圍。
您可以使用setTimeout()暫停javascript進行特定時間...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.