2016-12-17 53 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屬性。 –

相關問題