由于IE 11更新,我遇到了一个问题。一切都适用于IE 9,10,FF和Chrome。
我知道它来自xml节点(partdesc)值,因为值中的空格(CSP 100-130)。我尝试过使用双引号,我尝试更换单引号以确保它们是正确的。如果我更改XML数据以删除空间,IE 11不会抱怨。我检查了空间,以确保它是ascii 32,我试图以各种方式编码xml。除了删除空间之外,我没有尝试过这一点。
确切的未终止字符串常量错误(来自IE调试器)
SCRIPT1015:未终止的字符串常量
文件:SFCPacking,Line:1,Column:43
生成的HTML看起来很好,但是一旦发生未终止的字符串常量错误,click事件将无效。
结果HTML:
<a href="javascript:void(0);" onclick="showCreate('98522000000000000000000','CSP 105-140','7500','4167','9595')"> - create ticket - </a>
我从使用XSLT解析器转换的后端返回XML数据。解析器不会抛出任何错误,也不会抛出XML文档阅读器。
真的很感激任何帮助!
XML数据如下所示:
<?xml version="1.0"?>
<!DOCTYPE XMLUtilResults>
<XMLUtilResults>
<readonly>0</readonly>
<canapprove>1</canapprove>
<sfcsec>4</sfcsec>
<srsec>4</srsec>
<tsec>4</tsec>
<view>Open</view>
<packparts>
<part recid="IDX985110000000000000000009595">
<partno>98511000000000000000000</partno>
<partdesc>CSP 100-130</partdesc>
<availqty>3758</availqty>
<onhand>3758</onhand>
<invlocid>9595</invlocid>
<invloc>0005</invloc>
<invlocname>NACO Plant</invlocname>
<qtypacked/>
<sfcqty/>
<opendemand/>
<moq>7500</moq>
</part>
</packparts>
<success>1</success>
<OpenTickets>1</OpenTickets>
</XMLUtilResults>
发生错误的XSLT部分:
<a href="javascript:void(0)">
<xsl:attribute name="onclick">showCreate('<xsl:value-of select="partno"/>','<xsl:value-of select="partdesc"/>','<xsl:value-of select="moq"/>','<xsl:value-of select="availqty"/>','<xsl:value-of select="invlocid"/>')</xsl:attribute>
- create ticket -
</a>
用于转换XML的JavaScript(XSLT)
var xml = new ActiveXObject("MSXML2.DomDocument.3.0");
xml.async = false;
xml.setProperty("ProhibitDTD", false);
xml.load(xmlResp);
var xsl = new ActiveXObject("MSXML2.FreeThreadedDomDocument.3.0");
xsl.async = false;
xsl.load(xslFile);
xsl_template = new ActiveXObject("Msxml2.XSLTemplate")
xsl_template.stylesheet = xsl;
xslProc = xsl_template.createProcessor()
xslProc.input = xml
if(paramObj){
for(i=0;i<paramObj.pName.length;i++){
xslProc.addParameter(paramObj.pName[i], paramObj.pValue[i])
}
}
xslProc.transform()
document.getElementById(targetObj).innerHTML = xslProc.output
答案 0 :(得分:3)
在发送请求之前尝试使用responseText
或将responseType
设置为'msxml-document'
。
答案 1 :(得分:1)
这个问题来自于这样一个事实:当原始XML没有cr \ lf时,Microsoft的新XMLHTTPRequest(从IE10开始)在responseXML主体中添加任意cr \ lf(\ r \ n)。这刚刚开始在IE11中发生,因为IE11在检查window.ActiveXObject时似乎没有返回True。请注意:我们实例化对象的代码如下:
xhttp = (window.ActiveXObject) ? (new ActiveXObject("Msxml2.XMLHTTP")) : (new XMLHttpRequest())
IE10中的修复是继续使用较旧的Msxml2.XMLHTTP ActiveX对象,但由于IE11现在为window.ActiveXObject返回false,它正在使用XMLHTTPRequest。
将代码更改为try和catch语法很容易,但更大的问题是,一旦MS决定摆脱旧的ActiveX对象,XMLHttpRequest对象将继续在responseXML体中添加任意cr \ lf 。这会产生XSLT转换的问题。
答案 2 :(得分:0)
var ie = 0;
if (window.ActiveXObject || Object.getOwnPropertyDescriptor(window, "ActiveXObject")) {
ie = 1;
}
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = onReady;
xhr.open('get', '/test.xml', true);
if (ie) {
try { xhr.responseType = 'msxml-document'; } catch(e){} // \r\n fix
}
xhr.send(null);