我有以下情况:
随后将嵌套页面加载到主页面的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中的开发工具设置断点,如果可能的话。)
答案 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特定时间......