它是当前运行脚本的最后一个`script`元素吗?

Dag*_*bit 7 html javascript dom

假设script脚本运行时文档中的最后一个元素*是当前运行的脚本是否安全?

例如,我想创建一个脚本,可以将其放在页面正文的任何​​位置,并在同一个地方显示一个元素.我正在做这样的事情:

function getCurrentScriptElement() {
    var scripts = document.getElementsByTagName('script');
    return scripts[scripts.length - 1];
}

var script = getCurrentScriptElement();
var view = document.createElement('span');

/* Put stuff in our view... */

script.parentNode.insertBefore(view, script);
Run Code Online (Sandbox Code Playgroud)

假设脚本在文档正文中,这是"安全吗?" 该getCurrentScriptElement函数是否总是返回正在运行的脚本?如果没有,怎么办呢?

我想这样做而不将脚本绑定到特定的id属性或类似属性,我希望它只是位置.


我在这里创建了一个示例拉入此脚本.一个答案表明,其他脚本可能会创建一个像这样的例子会破坏的情况.是否可以在此示例中添加其他脚本来破坏它?


有人建议其他带有deferasync属性的脚本可能会破坏这一点.任何人都可以举例说明这样的脚本是如何工作的吗?

据我了解,defer意味着首先加载DOM,然后使用defer标记运行脚本.defer出现在另一个脚本元素上的属性如何影响getCurrentScriptElement?的行为?

async,据我所知,意味着开始获取该脚本并同时保持解析DOM,不要等待......但是当它到达我的脚本时它应该仍然停止并等待,对吧?

我不知道任何一个人如何影响它,任何人都能提供一个例子吗?


*出于此问题的目的,我只对外部脚本感兴趣.

**不是script整个文档中的最后一个script元素,而是运行时文档中的最后一个元素.该文档的其余部分尚未加载,对吧?

Alo*_*hci 5

这不是绝对的保证。看看这个 JSFiddle:http : //jsfiddle.net/jAsek/

<!DOCTYPE html>
<title>Test case</title>
<div>
    <p>At the start</p>
    <script id="first">
        var scr1 = document.createElement("script");
        scr1.setAttribute("id", "early");
        document.body.appendChild(scr1);
    </script>
    <p>After the first script</p>
    <script id="second">
        function getCurrentScriptElement() {
            var scripts = document.getElementsByTagName('script');
            return scripts[scripts.length - 1];
        }

        alert(getCurrentScriptElement().id);
    </script>
    <p>At the end</p>
</div>
Run Code Online (Sandbox Code Playgroud)

这里的警报报告了“早期”注入脚本的 id,而不是当前正在运行的脚本“second”的 id。

内部和外部脚本之间没有实际区别。

  • @GGG如何检查脚本节点的文本内容是否存在代码中存在的唯一字符串?如果不存在,请检查上一个脚本块,依此类推。 (2认同)