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 -
<!-- ... 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 );
这对我很有用。