IE + jQuery + Ajax + XHTML:在.html()或.innerHTML之后剪辑HTML

这是一个非常难以置于简短句子中的问题,所以如果我杀了它,我会道歉。

我最近推出了一个网站,该网站已经在我所需的所有浏览器平台上进行了广泛的测试,包括IE8(IE8标准模式,XHTML Strict)。 在网站在专用的Web服务器上运行之前,我没有遇到任何问题。

该站点对表单的input元素的change事件使用jQuery.get() ,其中响应被移植到公共

尽管我已经阅读了IE和XMLHTTPRequest的缓存问题,但我的问题似乎发生在我的ajax回调开始执行之后。 我的回调(通过.get() /。 .load() – 我已经尝试过)接收我的服务器返回的HTML片段。 在任何浏览器中测试返回的内容都会准确显示我对内容的期望。

但是,只要我将HTML片段放入https://stackoverflow.com/questions/2999377/iejqueryajaxxhtml-html-getting-clipped-after-html-or-innerhtml/#results的DOM树中,IE就会实际https://stackoverflow.com/questions/2999377/iejqueryajaxxhtml-html-getting-clipped-after-html-or-innerhtml/#results出我标记的前7或8个开始标记(以及大多数标记的子标记)。 这是奇怪的奇怪。 我通过jQuery('https://stackoverflow.com/questions/2999377/iejqueryajaxxhtml-html-getting-clipped-after-html-or-innerhtml/#results')[0].innerHTML = content设置HTML内容,将其修复到网站的另一个区域,但这次没有骰子。

响应示例:

 
some link stuff, blah blah another link
  • ..title..
    View ..statistics..
  • <!-- ... and so on in a loop over items to create more
  • items ... -->

从字面上看, 的开头标记的所有内容都会被截断。 结果是IE显示我返回的AJAX内容,好像它是从文本节点开始的: ..statistics.. 。 (我尝试在下面的评论建议中删除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

我设法让它工作的唯一方法是向它添加一个类,等待,然后删除该类。 如果我不等,它似乎跳过执行。

 函数重绘(元素)
 {
  if($ .browser.msie)
  {
   element.addClass( “不可见”);
  的setTimeout(函数(){
     element.removeClass( “不可见”);
    },1);
  }
 }

如果你删除rel="stats"会怎么样?

根据MSDN ,不允许rel属性包含stats

我可以证实这个问题。 我已经为原始提交者生成了类似的AJAX响应。 一些初始信息,然后循环通过数据创建8个不同div的内容。 在运行页面时,它会执行加载,但IE只会显示一些数据。 一个小的改变解决了这个。

我在每个div中的页面上有一个跨度(对于一组video标签),因此如果文本太长,我可以截断文本,并使用带有title属性的span作为hovertip。 如果标记span以这种方式格式化:

 
Tags: Miller, Jackson...

它不起作用,而:

 
Tags: Miller, Jackson, Brown

工作得很好。 当然,我注意到我的错误是没有跨度结束标记。 解决这个问题也很有效,但我注意到的重要一点是,IE似乎非常不能容忍AJAX上的格式错误,或者更确切地说,AHAH。

在看过这个之后,我会保证返回字符串中有一些格式错误的HTML。 我有完全相同的错误,javascript返回的信息片段,你做了,并纠正错误修复它为我。

这是一个疯狂的猜测,但它帮助我一次IE问题:

而不是$('your_container').html( your_content ) ,尝试完全清空容器对象,然后使用append() 。 所以:

 $('your_container').empty().append( your_content ); 

这是IE。 你永远都不会知道。

将所有METHODS更改为POST。 默认为GET。

 jQuery.ajax({ url: form.attr('action'), success: function(){ panel.empty().append(response); // Carry on. panel.removeClass('loading').stop(true).fadeTo(100, 1); } }); 

应该这样做……我知道我错过了你的function中的一些东西,但这是它的主旨。

我有完全相同的问题。 我正在使用jQuery的.html()来插入来自服务器的响应。 响应文本的开头是从一些php开始,然后是换行符,然后是一些HTML。 只是删除换行符导致截断停止。

从:

 load->helper('stdclass_helper'); ?> 

至:

 load->helper('stdclass_helper'); ?> 

经过几次实验,我能够将问题的原因分离到文件开头的换行符。

例如,截断发生在开始文件(添加引号以显示换行符):

 " 
load->helper('stdclass_helper'); ?> "

通过删除第一个换行符,截断消失了。

这是在Windows 7上使用jquery-1.6.4.min.js和IE 9(在IE 8仿真模式下)(使用VMWare虚拟Windows机器)

更新:作为一个彻底的人,因为我已经使用jquery .html()函数的包装器来查找和注册自定义元素,我继续通过修剪任何字符串数据来处理IE问题。 这很好用:

 // Override jQuery's html() method, so that we can register any special elements in new html. (function( $, oldHtmlMethod ){ // Override the core html method in the jQuery object. $.fn.html = function(data){ // Execute the original HTML method using the // augmented arguments collection. //trim whitespace that could cause IE to truncate returned content **if(typeof data == 'string'){ data = data.trim(); }** var results = oldHtmlMethod.apply( this, arguments ); return results; }; })( jQuery, jQuery.fn.html ); 

这对我很有用。