2016-12-17 25 views
0

脚本老(1):如何在JavaScript中将标记属性onload&onerror?

document.write('<scr'+'ipt src="http://example.com/script.js?'+Math.random()+'" type="text/javascript" onerror="checkScriptLoaded2();" onload="scriptLoaded2=true;"></scr'+'ipt>'); 

脚本新(2):

var sNew = document.createElement("script"); 
sNew.async = true; 
sNew.src = "http://example.com/script.js?"+Math.random(); 
var s0 = document.getElementsByTagName('script')[0]; 
s0.parentNode.insertBefore(sNew, s0); 

我如何才能正常工作,把这个标签在脚本2。

onerror="checkScriptLoaded2();" onload="scriptLoaded2=true;" 

回答

0

这样。

创建属性并将其添加到脚本元素。

createAttribute()方法创建一个具有指定名称的属性,并将该属性作为一个Attr对象返回。

attribute.value属性用于设置属性的值。

element.setAttributeNode()方法用于将新创建的属性添加到元素。

function checkScriptLoaded2() 
 
{ 
 
    alert("Error in loading.") 
 
} 
 

 
var sNew = document.createElement("script"); 
 
sNew.async = true; 
 
sNew.src = "https://example.com/script.js?"+Math.random(); 
 

 

 
sNew.setAttribute('onerror', 'checkScriptLoaded2();') // Shorthand as suggested by Felix 
 

 
var att = document.createAttribute("onload"); // Elaborated way 
 
att.value = "scriptLoaded2=true;" 
 
sNew.setAttributeNode(att) 
 

 

 

 

 
var s0 = document.getElementsByTagName('script')[0]; 
 
s0.parentNode.insertBefore(sNew, s0);
<div>hello</div>

+0

为什么在使用DOM属性时使用HTML属性(尤其是因为您使用'async'和'src' DOM属性)? –

+0

@FelixKling这是实现的方式之一,但是如果你能提供你的答案的工作样本,会很高兴。 – Deep

+0

确定它是一种方式,但不是很常见。也许你至少可以解释更多关于'createAttribute'和'setAttributeNode'的信息。另一种(更简洁)的方式是使用'setAttribute('onerror','...')'顺便说一句。 –

0

像这样:

sNew.onerror = checkScriptLoaded2; 
sNew.onload = function() { 
    scriptLoaded2 = true; 
}; 

你可以learn more about this type of event handling on quirksmode.org。基本上,对于一个元素支持的大多数事件,就像你可以为其分配一个函数来处理它的on<eventname>属性。

查看MDN上的HTMLScriptElement documentation(尽管它没有列出事件处理程序)。


还要注意的是

var s0 = document.getElementsByTagName('script')[0]; 
s0.parentNode.insertBefore(sNew, s0); 

,如果已经有另一个现有<script>元素才有效。如果脚本不必出现在任何特定位置,那么执行MDN建议的更多的故障安全:

document.head.appendChild(sNew); 
+0

非常感谢您的建议反馈。我会投票,但不幸的是我没有足够的声望。 –

+0

这很好。我只能告诉你,你不应该使用'setAttribute *'方法。这倒退了一步。如果您有DOM元素,请使用DOM属性。 –

相关问题