添加一个<;脚本>;位于<;顶部的节点;车身>;来自中的javascript<;头>;

添加一个<;脚本>;位于<;顶部的节点;车身>;来自中的javascript<;头>;,javascript,html,Javascript,Html,我想插入一些javascript代码 这应该在运行中的其他javascript代码之前运行 当它们在中操作html时,它们位于中 通常,我会在打开标记之后将此javascript放入标记中。但我不是直接编写html。它是由一个程序为我生成的。(). 它的API允许在内部注入html,但不允许 我看不出有任何方法可以做到这一点,而不可能破坏你试图使用的工具,并做一些相当糟糕的事情。我想有更好的方法来解决你潜在的问题 我试着把我的js直接放在头上,然后我的js就不能在body上使用appendCh

我想插入一些javascript代码

  • 这应该在运行
    中的其他javascript代码之前运行

  • 当它们在
    中操作html时,它们位于

  • 通常,我会在打开
    标记之后将此javascript放入
    标记中。但我不是直接编写html。它是由一个程序为我生成的。(). 它的API允许在
    内部注入html,但不允许

    
    
    我看不出有任何方法可以做到这一点,而不可能破坏你试图使用的工具,并做一些相当糟糕的事情。我想有更好的方法来解决你潜在的问题

    我试着把我的js直接放在头上,然后我的js就不能在
    body
    上使用
    appendChild
    ,因为此时
    document.body
    是空的

    这是一个肮脏的想法,可能是个坏主意,但你可以强迫身体开始:

    document.write("<body>");
    

    我看不出有任何方法可以做到这一点,而不可能破坏你试图使用的工具,并做一些相当糟糕的事情。我想有更好的方法来解决你潜在的问题

    我试着把我的js直接放在头上,然后我的js就不能在
    body
    上使用
    appendChild
    ,因为此时
    document.body
    是空的

    这是一个肮脏的想法,可能是个坏主意,但你可以强迫身体开始:

    document.write("<body>");
    
    我试着把我的js直接放在头上,然后我的js就不能在body上使用
    appendChild
    ,因为此时
    document.body
    是空的

    救命啊
    您只需等待
    标记被解析:

    <!DOCTYPE html>
    <html>
    <head>
        <title>Test</title>
        <script>
    new MutationObserver(function(records, self)
    {
        for(var i = 0; i < records.length; ++i)
        {
            for(var j = 0; j < records[i].addedNodes.length; ++j)
            {
                if(records[i].addedNodes[j].nodeName == 'BODY')
                {
                    self.disconnect();
                    console.log('herp');
                    /*
                    At this point, the body exists, but nothing inside it has been parsed yet.
                    document.body might be available, but to be safe, you can use:
                    var body = records[i].addedNodes[j];
                    */
                }
            }
        }
    }).observe(document.documentElement,
    {
        childList: true,
    });
        </script>
    </head>
    <body>
        <script>console.log('derp');</script>
    </body>
    </html>
    
    (注意:上面的代码不能作为堆栈片段使用,因为所有内容都放在那里的
    标记中。)

    现在为了安全起见,我要添加一个检查,看看是否已经设置了
    document.body
    ,并且只有在没有设置的情况下才设置MutationObserver:

    <!DOCTYPE html>
    <html>
    <head>
        <title>Test</title>
        <script>
    function onBodyLoaded(body)
    {
        console.log('herp');
        /* Do whatever you want with "body" here. */
    }
    if(document.body)
    {
        onBodyLoaded(document.body)
    }
    else
    {
        new MutationObserver(function(records, self)
        {
            for(var i = 0; i < records.length; ++i)
            {
                for(var j = 0; j < records[i].addedNodes.length; ++j)
                {
                    if(records[i].addedNodes[j].nodeName == 'BODY')
                    {
                        self.disconnect();
                        onBodyLoaded(records[i].addedNodes[j]);
                    }
                }
            }
        }).observe(document.documentElement,
        {
            childList: true,
        });
    }
        </script>
    </head>
    <body>
        <script>console.log('derp');</script>
    </body>
    </html>
    

    请注意,IE 10及更早版本不支持
    MutationObserver
    。不过,IE 11和这十年来的任何其他浏览器都应该可以工作

    我试着把我的js直接放在头上,然后我的js就不能在body上使用
    appendChild
    ,因为此时
    document.body
    是空的

    救命啊
    您只需等待
    标记被解析:

    <!DOCTYPE html>
    <html>
    <head>
        <title>Test</title>
        <script>
    new MutationObserver(function(records, self)
    {
        for(var i = 0; i < records.length; ++i)
        {
            for(var j = 0; j < records[i].addedNodes.length; ++j)
            {
                if(records[i].addedNodes[j].nodeName == 'BODY')
                {
                    self.disconnect();
                    console.log('herp');
                    /*
                    At this point, the body exists, but nothing inside it has been parsed yet.
                    document.body might be available, but to be safe, you can use:
                    var body = records[i].addedNodes[j];
                    */
                }
            }
        }
    }).observe(document.documentElement,
    {
        childList: true,
    });
        </script>
    </head>
    <body>
        <script>console.log('derp');</script>
    </body>
    </html>
    
    (注意:上面的代码不能作为堆栈片段使用,因为所有内容都放在那里的
    标记中。)

    现在为了安全起见,我要添加一个检查,看看是否已经设置了
    document.body
    ,并且只有在没有设置的情况下才设置MutationObserver:

    <!DOCTYPE html>
    <html>
    <head>
        <title>Test</title>
        <script>
    function onBodyLoaded(body)
    {
        console.log('herp');
        /* Do whatever you want with "body" here. */
    }
    if(document.body)
    {
        onBodyLoaded(document.body)
    }
    else
    {
        new MutationObserver(function(records, self)
        {
            for(var i = 0; i < records.length; ++i)
            {
                for(var j = 0; j < records[i].addedNodes.length; ++j)
                {
                    if(records[i].addedNodes[j].nodeName == 'BODY')
                    {
                        self.disconnect();
                        onBodyLoaded(records[i].addedNodes[j]);
                    }
                }
            }
        }).observe(document.documentElement,
        {
            childList: true,
        });
    }
        </script>
    </head>
    <body>
        <script>console.log('derp');</script>
    </body>
    </html>
    



    请注意,IE 10及更早版本不支持
    MutationObserver
    。IE 11和这十年来的任何其他浏览器都应该可以工作。

    你的意思是你把脚本的加载放在那里,还是把带有函数的脚本标记放在那里?“我试着把我的js直接放在头上,然后我的js不能在body上使用appendChild,因为此时document.body是空的。”等等,您是在尝试将元素输出到主体,还是对其他代码正在写入主体的元素执行操作?请您解释一下,这样做的必要性是什么?T.J只是将元素输出到主体。您的意思是将脚本的加载放在那里,还是将脚本标记与函数放在一起?“我试着把我的js直接放在头上,然后我的js就不能在body上使用appendChild,因为此时document.body是空的。“等等,你是想把元素输出到主体中,还是对其他代码正在写入主体的元素执行操作?你能解释一下,这样做的必要性吗?T.J只是把元素输出到主体中。这太出乎意料了。@Quentin:是的,
    document.write
    和解析器之间的关系是交互式的,有点违反直觉,最好不要使用
    document.write
    :-)谢谢,我现在可以用这个了。最终会翻开故事书,提交一份更好的公关。这太出乎意料了。@Quentin:是的,
    document.write
    和解析器之间的关系是交互式的,有点违反直觉,最好不要使用
    document.write
    :-)谢谢,我现在可以用这个了。最终将分叉故事书并提交一份更好的PR。在Chrome和Firefox上获得了很好的结果:不幸的是,在IE11中,它不会运行observer回调,直到解析了正文的结尾并运行了其中的脚本。旁注:IE9和IE10都支持旧的突变事件(无论如何,足以完成上述操作),因此,只要付出足够的努力,人们甚至可以将这项技术推广到IE9。@T.J.Crowder感谢您提供的信息。由于缺少IE 9,无法进行测试,但看起来它应该可以完成IE 9和IE 10的工作。如果有时间的话,我可能会尝试稍后修复IE 11的行为。在Chrome和Firefox上获得了很好的效果:遗憾的是,在IE11上,它不会运行observer回调,直到解析了正文的结尾并运行了其中的脚本。旁注:IE9和IE10都支持旧的突变事件(无论如何,足以完成上述操作),因此,只要付出足够的努力,人们甚至可以将这项技术推广到IE9。@T.J.Crowder感谢您提供的信息。由于缺少IE 9,无法进行测试,但看起来它应该可以完成IE 9和IE 10的工作。如果有时间的话,我可能会尝试稍后修复IE 11的行为。
    function onBodyLoaded(body)
    {
        body.appendChild(document.createElement('script')).src = 'https://example.com/my.js';
    }
    
    function onBodyLoaded(body)
    {
        body.appendChild(document.createElement('script')).innerHTML = 'document.write("hi there")';
    }