从假装为外部脚本的字符串中注入Javascript代码

时间:2018-10-26 19:37:28

标签: javascript

向页面添加Javascript的通常方法是,以静态HTML或在服务器端生成的某种方式将Javascript添加到文档的<body><head>中。

我想生成动态Javascript,并以动态方式将其添加到文档中;即按需运行。例如,通过WebSocket传输的Javascript代码。

一个选择是创建一个脚本元素,将包含脚本内容的字符串添加到.text属性,最后将脚本添加到文档中,如下所示:

var scriptContent = 'console.log("dynamic script");';
var s = document.createElement('script');
s.text = scriptContent;
document.body.appendChild(s);

这可以工作,但是我担心的是,脚本使用与HTML文档相同的URL /来源执行。而如果是用s.src参数调用的单独文件,则在查看浏览器控制台时它将显示在其自己的URL下。

为什么这一切都有意义?使用浏览器控制台进行调试和检查时,通常会告诉您脚本的名称以及打印到控制台的消息的行/列。例如,当打开控制台时,可能会显示几条控制台消息,并在右侧显示原点和行/列信息:

<domainname>:1:1
separate_js_file.js:14:20 

这是我想要的行为,因为它可以轻松区分是什么脚本向控制台编写了一些内容。但是,如果将Javascript动态添加到页面,则所有这些都将在“主文档”下“发布”,通常通过域名打印,例如domain.com:1:1

我想要的是更改/假装/伪装脚本的来源,假装它是外部脚本。这样,并非所有打印到控制台的行都来自原点domain.com:<line>:<column>,而是被专门调用,如module1:<line>:<column>

这有可能吗?

1 个答案:

答案 0 :(得分:2)

我认为您可以在动态JS的末尾附加源映射。

//# sourceURL=http://example.com/path/to/your/sourcemap.map

当在Firefox中使用eval语句以及在chrome中插入了脚本标记和eval时,此方法有效。也可能是使Firefox也通过脚本标签理解它的一种方式。

有关详细信息,请参见https://developer.mozilla.org/en-US/docs/Tools/Debugger/How_to/Use_a_source_map

另请参见Can't see dynamically loaded code in Chrome Developer Tools 22