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