IE中XSL文件无法读取浏览器缓存,始终请求服务器问题求助
解决Microsoft.XMLDOM加载XSL时跳过浏览器缓存的问题
这个问题我之前帮维护遗留系统的团队排查过,核心原因是Microsoft.XMLDOM对象默认会绕过浏览器缓存,强制发起全新请求——哪怕你已经在HTTP响应头里设置了正确的cache-control和expires,它也不遵循浏览器的缓存规则。下面是几个实测有效的解决方案,按稳妥程度排序:
方案1:内嵌XSL到页面(最适合静态XSL)
如果你的XSL内容不经常变动,直接把XSL代码内嵌到HTML页面里,彻底避免HTTP请求:
<!-- 内嵌XSL代码,用type="text/xsl"标识 --> <script type="text/xsl" id="embeddedXSL"> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 这里放你的XSL模板内容 --> <xsl:template match="/"> <!-- 你的转换逻辑 --> </xsl:template> </xsl:stylesheet> </script> <script> var xslDoc = new ActiveXObject("Microsoft.XMLDOM"); xslDoc.async = false; // 直接加载页面内的XSL字符串 xslDoc.loadXML(document.getElementById('embeddedXSL').text); // 执行转换 document.write(myXML.transformNode(xslDoc)); </script>
这种方式完全不需要依赖浏览器缓存,从根源上解决了重复请求的问题。
方案2:用XHR预加载XSL,复用浏览器缓存
XMLHttpRequest会遵循浏览器的缓存规则,所以我们可以先用XHR把XSL加载到浏览器缓存,再把拿到的字符串传给XMLDOM:
<script> // 先用XHR加载XSL,触发浏览器缓存 var xhr = new XMLHttpRequest(); xhr.open('GET', '/Some Path/myXSL.xsl', false); xhr.send(); var xslText = xhr.responseText; // 把字符串加载到XMLDOM var xslDoc = new ActiveXObject("Microsoft.XMLDOM"); xslDoc.async = false; xslDoc.loadXML(xslText); document.write(myXML.transformNode(xslDoc)); </script>
第一次请求会返回200并缓存XSL,后续请求XHR会直接读取缓存(返回304),XMLDOM只需要处理本地字符串,不会再发起新的HTTP请求。
方案3:修改XMLDOM的缓存属性(仅部分IE版本有效)
部分IE版本(比如IE8+)支持通过setProperty开启XMLDOM的缓存支持,让它遵循浏览器缓存规则:
<script> var xslDoc = new ActiveXObject("Microsoft.XMLDOM"); xslDoc.async = false; // 开启ServerHTTPRequest属性,让XMLDOM复用浏览器的HTTP客户端 xslDoc.setProperty("ServerHTTPRequest", false); xslDoc.load("/Some Path/myXSL.xsl"); document.write(myXML.transformNode(xslDoc)); </script>
注意:这个属性在IE6/7上无效,需要结合你的目标浏览器版本测试。
额外说明
为什么你设置了缓存头还是没用?因为Microsoft.XMLDOM的load方法默认使用独立的HTTP请求逻辑,它不会读取浏览器缓存,甚至会在请求头里带上Cache-Control: no-cache(可以抓包验证),所以服务器返回的缓存规则对它不起作用。
内容的提问来源于stack exchange,提问作者Suvi
相关产品推荐
相关产品推荐

