2015-04-25 21 views
1

我編寫了一個應用程序,其中AJAX加載了一個內部有<script>的XSLT。裝有AJAX的XSLT,包含<script>只在Firefox中觸發

奇怪的是,腳本運行在Firefox沒有eval()。腳本不在Opera或Chrome中運行。 所以,我簡化了代碼,並將其發佈到此處。

它是一個Firefox的錯誤?

是否有跨瀏覽器的解決方法? (在Firefox上不運行eval()的解決方法,僅適用於xslt的腳本,但在Chrome上運行eval(),對於使用AJAX加載的每個腳本(無論是XSLT還是XHTML)運行Opera。

的index.xhtml

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head><script src="app.js" /></head> 
<body onload="locationHashChanged();" /> 
</html> 

app.js

function get(file) { 
    var request = new XMLHttpRequest(); 
    request.open("GET", file, false); 
    request.send(); 
    return request.responseXML; 
} 

function insert(where, root) { 
    //var scripts = root.getElementsByTagName('script'); 
    where.parentNode.replaceChild(root, where); 
    //for(var z = 0; z != scripts.length; z++) eval(scripts[z]); 
} 

function locationHashChanged() { 
    var xml = get('apps.xml'); 
    var xslt = get('xslt.xsl'); 
    var xsltProcessor = new XSLTProcessor(); 
    xsltProcessor.importStylesheet(xslt); 
    insert(document.body, xsltProcessor.transformToFragment(xml, document).firstChild); 
}; 

xslt.xsl

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:strip-space elements="*" /> 

<xsl:template match="//*[@path='']"> 
<body xmlns="http://www.w3.org/1999/xhtml"> 
<script>alert('Only in Firefox');</script> 
</body> 
</xsl:template> 

</xsl:stylesheet> 

apps.xml

<?xml version="1.0" encoding="UTF-8"?> 
<menu name="" path="" /> 
+0

你能解釋清楚你得到的是什麼行爲,你希望所有的JavaScript和哪一個?爲什麼你提到'eval',爲什麼有代碼使用'eval'註釋掉? –

+0

我只在Firefox中獲得alert()。我沒有期望,因爲所有使用AJAX加載的腳本都需要'eval()'來運行。這段代碼中沒有'eval()'。 – Chameleon

+1

HTML5規範http://www.w3.org/TR/html5/scripting-1.html#scriptTagXSLT有一些非規範性文本,它們明確地區分'transformToFragment'創建的'script'元素與否則創建的'script'元素。根據該部分,我認爲當片段插入到瀏覽器窗口的文檔中時,Mozilla正確執行由XSLT創建的腳本代碼。它與AJAX或XMLHtttpRequest無關。 –

回答

0

這將有助於把警報在CDATA標籤?所以

<script type="text/javascript"> 
    <![CDATA[alert('Only in Firefox');]]> 
</script> 

我已經開始這樣做了,我包括XSLT模板

相關問題