是否可以通过 WebKit、FireBug 或 IE8 Developer Tool 等调试器来调试动态加载 JavaScript?

IT技术 javascript ajax
2021-02-21 04:04:10

我最近的问题,我已经创建了一些用于动态加载局部视图的 JavaScript 函数。因此,我无法调试任何动态加载 JavaScript。因为所有加载的 JavaScript 都将通过“eval”函数进行评估。

但是,我找到了一些创建新 JavaScript 的方法,通过使用以下脚本将脚本动态创建到当前文档的标题中。所有加载的脚本都将显示在 HTML DOM 中(您可以使用任何调试器找到它)。

var script = document.createElement('script')
script.setAttribute("type","text/javascript")
script.text = "alert('Test!');";

document.getElementsByTagName('head')[0].appendChild(script);

顺便说一下,大多数调试器(IE8 Developer Toolbar、Firebug 和 Google Chrome)不能在任何动态脚本中设置断点。因为可调试脚本必须在页面加载后第一次加载。

您有在动态脚本内容或文件中调试的想法吗?

更新 1 - 添加源代码进行测试

您可以使用以下 xhtml 文件来尝试调试 someVariable 值。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>    
    <title>Dynamic Loading Script Testing</title>
    <script type="text/javascript">
    function page_load()
    {       
        var script = document.createElement('script')
        script.setAttribute("id", "dynamicLoadingScript");
        script.setAttribute("type","text/javascript");
        script.text =   "var someVariable = 0;\n" +
                        "someVariable = window.outerWidth;\n" +
                        "alert(someVariable);";

        document.getElementsByTagName('head')[0].appendChild(script);
    }
    </script>
</head>
<body onload="page_load();">
</body>
</html>

从答案来看,我只是在 FireBug 中对其进行了测试。结果应如下图所示。

替代文本 http://d7cgnq.bay.livefilestore.com/y1pJGV27qEARXzZhsMMhPD5z0OxAtnkQK8eKeEXMAxuHjsuWeAq1aGl7sTISRNqVv3lw8ghyxE_GorlwGVSJDvTqbugPalym0gSJDvTql0d-fire

请查看页面加载后添加的“dynamicLoadingScript”脚本。

替代文本 http://d7cgnq.bay.livefilestore.com/y1pz_RwqjgeVqe2mAlUZha0PalpPdP0X5AiwJcQhYahERlnbPDdZpb-_d1e96Q-14raSDMJOBsdcV9jsi4B5yCUD3dbugghscript.

但是在 FireBug 的脚本选项卡中没有找到

更新 2 - 在动态加载脚本中创建调试断点

替代文字 http://d7cgnq.bay.livefilestore.com/y1peKdIMOztXss-pc8PlJEmaGov_0ShYnLsuDdK5OLETbCG0UpkX6Te29w0YW2pNKaD_0ANAiizh2GdGPAAp_1q0JWAETo4Debugger-VSpng/

替代文本 http://d7cgnq.bay.livefilestore.com/y1pUeHaHoTXj0WBl74fnTrXwdr_y7s7h8jNKfs​​lSONgshzZBpUddGHNBWA9cXRabo3HAl3QazeozrCABo7pNVQc1Acl-UXXbHFE/png

上面的两个图像都显示了插入“调试器”;某些脚本行中的语句可以在动态加载脚本中触发断点。但是,两个调试器都不会在断点处显示任何代码。因此,这样做是没有用的。

谢谢,

6个回答

同样也可以使用 chrome。Chrome 有一项功能,您可以指定解析器属性并使动态 JS 片段显示为文件,然后可以浏览到该文件并设置断点。

需要设置的属性是

//# sourceURL=dynamicScript.js

其中 dynamicScript.js 是应显示在脚本文件浏览器中的文件的名称。

更多信息在这里

Paul Irish 在他关于Tooling & The Webapp Development Stack 的精彩演讲中也简要地谈到了它

请注意,新语法是“//# sourceURL=dynamicScript.js”从@ 更改为#
2021-04-23 04:04:10
源地图上 chrome 开发人员工具部分的更新链接是 - developer.chrome.com/devtools/docs/...
2021-04-30 04:04:10
您也可以将此功能用于动态内联 javascript。但是,如果您在该脚本中有一些异常,您将不会在源列表中看到它。
2021-05-04 04:04:10
对我来说,js 文件显示在名为“(无域)”的组内的源列表中。可能值得一提,因为我一开始就错过了!
2021-05-05 04:04:10
如果有人在使用 MVC3/Razor 时遇到问题,请记住转义 @ 符号,例如 //@@ sourceURL=dynamicscript.js 仅供参考,上述内容也适用于 firebug。
2021-05-09 04:04:10

尝试添加一个“调试器”;动态添加的 javascript 中的语句。无论断点设置如何,这都会导致它在该行停止。

您用来添加脚本标签的确切代码是什么?我遇到了与 OP 相同的问题,这使得无法在 Chrome 中调试动态加载的 JS 文件。谢谢!
2021-05-10 04:04:10
我只能找到这个:code.google.com/p/fbug/issues/detail?id=1259顺便说一下,我使用附加到头部的脚本标记来动态加载脚本(但使用 src 属性),并且以这种方式添加的代码在所有浏览器上都可以调试,即使它没有与初始页面一起加载。
2021-05-11 04:04:10
var loaderNode = document.createElement("script"); loaderNode.setAttribute("type", "text/javascript"); loaderNode.setAttribute("src", url); document.getElementsByTagName("head")[0].appendChild(loaderNode);
2021-05-11 04:04:10

是的,(现在)可以使用 Google Chrome 调试动态加载的 JavaScript!

无需debugger;为动态加载的 JS 文件添加额外或任何其他属性。只需按照以下步骤进行调试:

方法一:

我的技术负责人刚刚展示了一种超级简单的方法来调试动态加载的 Javascript 方法。

  1. 打开 chrome 的控制台并写下方法的名称并按回车键。
    就我而言,GetAdvancedSearchConditonRowNew
    如果 JS 方法已加载,则它将显示该方法的定义。

在此处输入图片说明


  1. 点击方法的定义,就会打开整个JS文件进行调试:)

在此处输入图片说明


方法二:

例如,当我使用ajax调用单击按钮时,我正在加载 JS 文件

  1. network在谷歌浏览器开发工具中打开标签
  2. 单击加载一些 javascript 文件并调用一些 javascript 函数的控件(例如按钮)。
  3. 观察网络选项卡并查找该 JS 函数(在我的情况下是RetrieveAllTags?_=1451974716935
  4. 将鼠标悬停在它上面initiater,您将找到动态加载的 JS 文件(带有前缀VM*)。

在 chrome -1 中调试动态加载 JavaScript


  1. 单击该VM*文件以打开。
  2. 将调试器放在该文件中您想要的任何位置:D

在 chrome -1 中调试动态加载 JavaScript


为让谷歌如此迟钝而感到羞耻。1 / 耻辱 = Kudos(耻辱的反面)感谢你把它拿出来:)
2021-05-04 04:04:10

为此,我正在使用谷歌浏览器。

在脚本选项卡的 chrome 中,您可以启用“暂停所有异常”

在此处输入图片说明

然后放在你的代码行中的某个地方try{throw ''} catch(e){}Chrome 会在到达这一行时停止执行。

编辑:修改后的图像,所以我在说什么会更清楚。

对于在 Google Chrome 中进行开发,当 jQuery 或任何其他加载脚本将脚本附加到 DOM 时,您应该插入一些指示当前动态脚本名称的文本,就像我向 jQuery 团队报告的那样。但我没有时间做这件事。 bugs.jquery.com/ticket/8292
2021-04-23 04:04:10
@dineshygv,你可以......现在。但你不能在 3 年前。debugger那时不能在动态创建的脚本中工作。
2021-04-25 04:04:10
@Soul_Master,但使用我的方法您不需要插入文本。您插入动态脚本行,try{throw ''} catch(e){}然后启用“在所有异常时暂停”模式,Chrome 将在抛出异常时停止执行。我已经检查过很多次了。我加载了另一个图像。我在说什么就更清楚了。
2021-05-02 04:04:10
在 Chrome 中,您可以使用“ debugger; ”语句在调试器面板打开时在语句处中断。如果调试器面板关闭,Chrome 将简单地忽略这一点。
2021-05-08 04:04:10

我认为您可能需要为 eval'd 代码提供一个“名称”,如下所示:

http://blog.getfirebug.com/2009/08/11/give-your-eval-a-name-with-sourceurl/

如果你这样做了,我认为debugger“更新 2”中方法可能会奏效。

是的。我看到了。我已经向 jQuery 团队报告了这个错误很长时间了。bugs.jquery.com/ticket/8292
2021-04-20 04:04:10
警告!所描述的技术会导致 IE7 中的错误,因此不要将其留//@ sourceURL=blah在生产环境中。
2021-04-21 04:04:10
它可能会导致 ie 条件编译出现问题。例如:javascriptkit.com/javatutors/conditionalcompile.shtml
2021-05-03 04:04:10
这可能debugger是导致问题部分,而不是源注释(这肯定会被 JS 忽略)
2021-05-09 04:04:10