更改解释脚本标记的默认浏览器行为

时间:2014-01-23 16:01:49

标签: javascript jquery

我们都知道<script src="/something.js"></script>的作用。该文件将加载到页面中并运行脚本。

有没有办法覆盖解释<script>元素的默认行为?

我想要相同的语法(<script src='...'></script>)只能从something.js获取代码(可能通过XHR / jQuery ajax)并将其传递给foo (...) {...}函数。然后我会关心我将用它做什么。

澄清问题:

我可以使用以下方法轻松创建伪<script>标记替换

<div data-script-src="/1.js"></div>
<div data-script-src="/2.js"></div>
<div data-script-src="/3.js"></div>
<div data-script-src="/4.js"></div>

然后在js方面我会这样做:

var $scripts = $("[data-script-src]")
  , scriptContents = [];
(function loadInOrder (i) {
    if (!$scripts[i]) { alert("Loaded"); }
    $.ajax($($scripts[i]).attr("data-script-src"), function (data) {
        scriptContents[i] = data;
        loadInOrder(++i); 
    });
})(0);

但如何将div[data-script]替换为<script>?例如,如何强制浏览器加载具有属性<script>的{​​{1}}代码?

2 个答案:

答案 0 :(得分:2)

我不确定,如果这会回答您的问题,但没有更多数据,我可以建议:

创建自己的PHP文件,它将作为一种门。然后

<?php
    $file = file_get_contents(your_url);
    $file = str_replace('<script', '<myscript', $file);
    $file = str_replace('</script>', '</myscript>', $file);
    echo $file;
?>

然后根据需要添加您的真实脚本类型,该脚本将搜索 myscript 标记并运行Javascript代码...

您也可以使用div元素(如果脚本在主体中加载,您需要验证):

substitute: '<script' -> '<div data-id="my-script" '
substitute: '<script' -> '</div>'

如果您需要更多帮助,请写信。请不要贬低,因为问题对我来说有点模糊:)。

PS。我不知道这些是您的网站还是来自互联网的网站,您希望覆盖默认行为。所以要小心你的“file_getting_contents”因为,这将直接回应你的浏览器... :)。

答案 1 :(得分:2)

我认为你最好的选择是使用onbeforescriptexecute。此事件在脚本执行之前触发,因此您可以将type属性修改为text/javascript以外的其他属性(从而告诉浏览器不要执行内容)。这仍将加载来自服务器的数据。

不幸的是,onbeforescriptexecute仅在FF / Opera中受支持。

示例:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title></title>
        <script>
            document.addEventListener("beforescriptexecute", function (e) {
                console.log(e.target.innerHTML || e.target.src);
            }, true);
        </script>
        <script>
            console.log("12");
        </script>
        <script src="http://code.jquery.com/jquery-1.10.2.min.js"></script>
    </head>
    <body>
       Hi 
    </body>
</html>

控制台输出将是:

'console.log("12")'
'http://code.jquery.com/jquery-1.10.2.min.js'