如何在Internet Explorer中暂停JavaScript执行?

时间:2012-05-17 01:00:24

标签: javascript internet-explorer debugging iframe browser

我有以下情况:

  • 主页
  • 嵌套页面
  • Common 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;来解决这个问题,但我希望能够通过IE中的开发工具设置断点,如果可能的话。)

7 个答案:

答案 0 :(得分:4)

我能找到最接近解决方案的方法是在主页面上的loadIFrame()函数中设置断点,然后“步入”直到加载嵌套页面的Common.js文件。在一个更复杂的示例中,您可以在新的Common.js文件中设置断点,它们将正常工作,直到下次加载iframe时,它们将再次丢失。

答案 1 :(得分:3)

我没有IE9进行测试,但您可以将common.js文件视为iframe页面的单独资产吗?我相信这就是为什么它可以在其他浏览器中运行,因为浏览器必须 标记或标记 这些文件。

示例是将?iframePage附加到iframe页面上common.js的末尾。至少在Firefox中显示加载为common.js?iframePage的资产。浏览器会忽略查询字符串之后的所有内容,但JavaScript会加载 完全 名称。

另一个示例是复制common.js并将其重命名为commonClone.js,然后将其用于iframe页面。

这两个示例都可能允许您在IE9中设置两次的断点,每个资产一个。

也就是说,没有什么可以阻止您创建 iframe唯一断点,这些断点独立于父网页正在使用的common.js文件。此方法,我们称之为并行断点,允许对JavaScript进行异步调试,因为 iframe页面父页面正在独立处理JavaScript,但可能是串联工作。

此方法的参考来自官方来源 MSDN Library:使用F12开发者工具调试JavaScript错误部分 Managing Breakpoints 它显示了如何在多个JavaScript文件上执行断点。

根据IE9开发者论坛的recent forum post,用于调试时防止重新加载JavaScript文件的解决方案是使用内联事件处理程序而不是 attachEvent < / strong>,如下例所示:

replace (or comment it out)

$(document).onload(function(){ mycustomonload functions});

with

<body onload="mycustomonload functions">

答案 2 :(得分:1)

如果您仅为兼容性测试而这样做,那么您是否尝试过将IETab plugin用于Chrome?

这可以模拟IE的渲染引擎,同时允许您使用Chrome调试器。

如果这还不够好,那么我认为你已陷入僵局,IE开发工具不够复杂。

答案 3 :(得分:1)

也许,如果你可以重构你的Html和JavaScript代码,你只能从父页面引用common.js,并使主页面和嵌套页面都使用相同的JavaScript函数。

这样一个断点就可以满足两种情况。

答案 4 :(得分:1)

要在IE中调试iframe,并且能够设置和保留断点,您可以在自己的选项卡/窗口中打开iframe地址。但是,如果iframe与其父级进行通信,则这是不可能/直接的。

答案 5 :(得分:1)

我希望你至少使用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://......");

,也会发生同样的情况

另外请记住,即使您在window(s)中加载了相同的文件,它也会在浏览器中加载两个不同的执行框架。您可以运行两个相同浏览器的浏览器实例,但它们不会在窗口中显示相同的页面。那么,有些东西是共享的,比如cookie,但这超出了本主题的范围。

答案 6 :(得分:0)

你可以使用setTimeout()暂停javascript特定时间......