如何在不包含包装器语法的情况下将函数注入脚本标记?

时间:2016-08-02 04:51:01

标签: javascript shared-worker

在这种奇怪的情况下,我需要将JS函数转换为字符串,然后将该字符串转换为动态生成的<script>标记(使用类型javascript/worker以便不执行) 。

我正在处理用户脚本,注入代码以在两个第三方站点之间创建共享Web工作者。关于用户脚本的事情是,您通常只想使用一个文件来实现脚本的功能,而Web工作者则喜欢为worker使用单独的JS文件。好there's a way around that using a 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,如下例所示:

  

请记住我要将函数附加到带有类型的脚本标记   javascript/worker代替text/javascript这样的功能   在它被转换为blob并用作a之前不会被执行   工作者的文件来源,但在这里我将使用   text/javascript所以你可以在执行时看到错误。

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>

enter image description here

  

这样你才能理解我在做什么,因为它可能令人困惑,   这样的函数会转换上面的函数   将未执行的脚本标记转换为Blob并使用它而不是   用于创建共享工作程序的外部文件:

var blob = new Blob([document.querySelector('#worker1').textContent], 
{ type: "text/javascript" });
var sharedWorker = new SharedWorker(window.URL.createObjectURL(blob));

那么,如何在不包含函数包装器语法(function (){)的情况下将函数内容注入脚本标记?

1 个答案:

答案 0 :(得分:0)

您可以使用字符串的方法执行此操作:

我认为这可以帮助您或类似的东西,删除函数名称。

function test(){
      console.log('TEST TEST');
}

    var fBody = test.toString()
    var index = fBody.indexOf('{');
    var functionBodyAsArray = fBody.substring(index + 1);
    functionBodyAsArray = functionBodyAsArray.substring(0, functionBodyAsArray.length - 1);

    console.log(functionBodyAsArray );