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="" />
你能解釋清楚你得到的是什麼行爲,你希望所有的JavaScript和哪一個?爲什麼你提到'eval',爲什麼有代碼使用'eval'註釋掉? –
我只在Firefox中獲得alert()。我沒有期望,因爲所有使用AJAX加載的腳本都需要'eval()'來運行。這段代碼中沒有'eval()'。 – Chameleon
HTML5規範http://www.w3.org/TR/html5/scripting-1.html#scriptTagXSLT有一些非規範性文本,它們明確地區分'transformToFragment'創建的'script'元素與否則創建的'script'元素。根據該部分,我認爲當片段插入到瀏覽器窗口的文檔中時,Mozilla正確執行由XSLT創建的腳本代碼。它與AJAX或XMLHtttpRequest無關。 –