IE + jQuery + Ajax + XHTML:HTML在.html()或.innerHTML之后被修剪
这是一个很简单的问题,所以我很抱歉如果我杀了它。
我最近启动了一个网站,该网站已经在我所有的浏览器平台(包括IE8(IE8标准模式,XHTML Strict))上的本地网络服务器上进行了广泛的测试。 直到该网站在专用网络服务器上运行,我才发现没有任何问题。
该网站使用jQuery.get()
change
事件中的表单input
元素,其中响应被嫁接到常见的<div id="results"></div>
。
尽管我已经阅读过关于IE和XMLHTTPRequest的缓存问题,但我的问题似乎发生在我的ajax回调开始执行之后。 我的回调(通过.get()
/ .load()
- 我试过)接收由我的服务器返回的HTML片段。 在任何浏览器中测试返回的内容都能准确显示出我期望的内容。
然而,只要我将HTML片段放入#results
的DOM树中,IE实际上会将我的标记中的前7或8个开始标记(以及大多数标记的子标记) #results
掉。 这是非常奇怪的。 我通过jQuery('#results')[0].innerHTML = content
设置HTML jQuery('#results')[0].innerHTML = content
,但是这次没有使用骰子,将其固定在网站的另一个区域。
响应示例:
<div>
<a href="#">some link</a>
<span>stuff, blah blah</span>
<a href="#">another link</a>
<ul>
<li id="item-2342">
<img src="#" />
<div class="info">
<h6> ..title.. </h6>
<a href="#">View</a>
<span rel="stats"> ..statistics.. </span>
</div>
</li>
<!-- ... and so on in a loop over items to create more <li> items ... -->
</ul>
</div>
从字面上通过<span rel="stats">
的开始标记进行所有事情的截断。 结果是IE浏览器显示我返回的AJAX内容,就好像它以文本节点开头: ..statistics.. </span>
。 (我尝试在下面的评论建议中删除rel="stats"
,改为将其改为CSS类,但结果相同。)
如果我通过浏览器的URL字段直接请求我的AJAX url,则返回的内容是完美的。
如果我使用alert()
来显示返回的AJAX内容,那么它是完美的。
如果我通过.html()
或.innerHTML
分配我的AJAX内容,它会立即被截断。
Sooo .... WTF? IE的(蹩脚的)调试器不显示脚本错误或任何性质的东西。 有没有人曾经处理过这类问题? 再次强调一点,在我的开发服务器(127.0.0.1)上,IE没有任何问题,并且似乎使用相同的“模式”(IE8标准)和其他一切。
编辑:这里是支持AJAX查找的Javascript:
jQuery('.ajax-panel').live('load', function(event, request_string){
var panel = jQuery(this).stop(true).fadeTo(100, 0.2).addClass('loading');
var form = jQuery(panel.attr('rel'));
jQuery.get(form.attr('action'), request_string ? request_string : form.serialize(), function(response){
// WTF?
// panel[0].innerHTML = response;
panel.empty().append(response);
// Carry on.
panel.removeClass('loading').stop(true).fadeTo(100, 1);
});
});
我有类似的问题发生,附加的HTML代码的一部分被剪切,但如果我创建了内部html的警报,或者强制滚动,它就出现了。
然后我看到一篇文章似乎表明IE8没有正确重画窗格。 http://ajaxian.com/archives/forcing-a-ui-redraw-from-javascript
我设法让它工作的唯一方法是向它添加一个类,等待,然后删除该类。 如果我没有等,它似乎跳过执行。
function Redraw(element) { if ($.browser.msie) { element.addClass("invisible"); setTimeout(function(){ element.removeClass("invisible"); },1); } }
如果你删除rel="stats"
会发生什么情况?
根据MSDN的说法, rel
属性不允许有stats
。
我可以证实这个问题。 我对原始提交者产生了类似的AJAX响应。 一些初始信息,然后通过数据循环来创建8个不同div的内容。 运行页面时,它会执行加载,但IE只会显示一些数据。 一个小改变解决了这个问题
我在每个div的页面上都有一个span(用于一组视频标记),这样如果文本太长,我可以截短文本,并将title属性的span用作hovertip。 如果标签跨度以这种方式格式化:
<div>Tags: <span title="Miller, Jackson, Brown">Miller, Jackson...</div>
它不起作用,而:
<div>Tags: Miller, Jackson, Brown</div>
工作得很好。 当然,我注意到我的错误,因为没有跨度结束标记。 解决这个问题也很有效,但我注意到的重要一点是IE似乎对AJAX格式错误,或者更确切地说,AHAH格式错误不能容忍。
在看过之后,我会保证返回字符串中存在一些稍微不正确的HTML。 我有完全相同的错误,由JavaScript返回的信息片断,你做了,并纠正错误修复了我。
链接地址: http://www.djcxy.com/p/88771.html上一篇: IE+jQuery+Ajax+XHTML: HTML getting clipped after .html() or .innerHTML