在这种奇怪的情况下,我需要将一个 JS 函数转换为一个字符串,然后将该字符串转换为一个动态生成的<script>
标签(它使用类型javascript/worker
以便不被执行)。
我正在编写用户脚本,注入代码以在两个第三方站点之间创建共享网络工作者。关于用户脚本的问题是您通常只想使用一个文件来实现脚本的功能,而 web 工作者喜欢为工作者使用单独的 JS 文件。那么有一种方法可以使用 Blob。但是,请记住,我只使用脚本文件,而不是用户脚本的 HTML 文件,所以我想将此部分(共享工作代码)作为函数存储在我的脚本中:
var worker = function() {
self.addEventListener('connect', function(e) {
var port = e.ports[0];
port.addEventListener('message', function(e) {
var message = e.data;
port.postMessage(message);
});
port.start();
});
};
然后使用toString()
它,这样我就可以将它注入到第三方页面中动态生成的脚本标签中,所以它最终会像这样结束,而脚本不会调用任何额外的文件:
<script id="worker1" type="javascript/worker">
self.addEventListener('connect', function(e) {
var port = e.ports[0];
port.addEventListener('message', function(e) {
var message = e.data;
port.postMessage(message);
});
port.start();
});
</script>
但是,使用该toString()
方法会导致function
包含单词,如下例所示:
请记住,我打算将函数附加到带有 type 的脚本标记,
javascript/worker
而不是text/javascript
这样,在将函数转换为 blob 并用作 worker 的文件源之前,该函数不会被执行,但在这里我将使用text/javascript
so您可以在执行时看到错误。
var worker = function() {
self.addEventListener('connect', function(e) {
var port = e.ports[0];
port.addEventListener('message', function(e) {
var message = e.data;
port.postMessage(message);
});
port.start();
});
};
var func = worker.toString();
var script = document.createElement("script");
script.type = "text/javascript";
script.id = "worker1";
$("head").append(script);
$('body').append(script);
$('#worker1').append(func);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
只是为了让您了解我在做什么,因为它可能会令人困惑,然后这样的函数会将上述未执行的脚本标记转换为 Blob 并使用它而不是外部文件来创建共享工作者:
var blob = new Blob([document.querySelector('#worker1').textContent], { type: "text/javascript" }); var sharedWorker = new SharedWorker(window.URL.createObjectURL(blob));
那么,如何在不包含函数包装语法(function (){
)的情况下将函数的内容注入脚本标签?