簡體   English   中英

如何在Internet Explorer中暫停JavaScript執行?

[英]How to pause JavaScript execution in Internet Explorer?

我有以下場景:

  • 主頁
  • 嵌套頁面
  • 常見的JS文件(包含在兩個頁面中)

隨后將嵌套頁面加載到主頁面的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM