4

这是一个很难用一句话概括的问题,所以如果我杀了它,我很抱歉。

我最近启动了一个站点,该站点已在我的本地 Web 服务器上在所有我想要的浏览器平台上进行了广泛的测试,包括 IE8(IE8 标准模式,XHTML Strict)。在该站点在专用 Web 服务器上上线之前,我完全没有遇到任何问题。

该网站jQuery.get()change事件中input使用表单元素,其中响应被移植到一个常见的<div id="results"></div>.

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

然而,一旦我将 HTML 片段放入 DOM 树中#results,IE 实际上会从我的标记中剪掉前 7 个或 8 个开始标记(以及大多数这些标记的子标记)。这是非常奇怪的。我通过设置 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()如果我通过or分配我的 AJAX 内容.innerHTML,它会立即被截断。

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);
    });
});
4

6 回答 6

2

我遇到了类似的问题,其中附加的部分 html 代码被剪切,但是如果我创建了内部 html 的警报,或者强制滚动,它就会出现。

然后我看到一篇文章似乎表明 IE8 没有正确重绘窗格。 http://ajaxian.com/archives/forcing-a-ui-redraw-from-javascript

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

函数重绘(元素)
{
 如果($.browser.msie)
 {
  element.addClass("不可见");
  设置超时(函数(){
    element.removeClass("不可见");
   },1);
 }
}
于 2010-07-12T22:03:42.703 回答
1

如果删除会发生什么rel="stats"

根据MSDN ,该rel属性不允许包含在其中。stats

于 2010-06-08T16:51:25.740 回答
1

我可以确认问题。我对原始提交者生成了类似的 AJAX 响应。一些初始信息,然后循环遍历数据以创建 8 个不同 div 的内容。运行页面时,它会进行加载,但 IE 只会显示部分数据。一个小改动解决了这个问题。

我在每个 div 内的页面上有一个跨度(用于一组视频标签),因此如果文本太长,我可以截断文本,并将具有标题属性的跨度用作悬停提示。如果标签跨度以这种方式格式化:

<div>Tags: <span title="Miller, Jackson, Brown">Miller, Jackson...</div>

它不起作用,而:

<div>Tags: Miller, Jackson, Brown</div>

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

在看到这个之后,我会保证在返回字符串中有一些稍微不正确的 HTML。我遇到了与您所做的完全相同的错误,即 javascript 返回的信息片段,并且更正错误为我修复了它。

于 2010-08-18T21:12:03.290 回答
0

将所有方法更改为 POST。默认值为 GET。

jQuery.ajax({
    url: form.attr('action'), 
    success: function(){
        panel.empty().append(response);

        // Carry on.
        panel.removeClass('loading').stop(true).fadeTo(100, 1);
    }
});

应该这样做......我知道我在你的函数中遗漏了一些东西,但这就是它的要点。

于 2011-04-19T16:27:29.120 回答
0

这是一个疯狂的猜测,但它曾经帮助我解决 IE 问题:

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

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

是IE。你永远不会知道。

于 2010-06-08T16:56:47.020 回答
0

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

从:

<?php 
$this->load->helper('stdclass_helper');
?>

<div id="expense_entry" class="element_record" style="padding:20px;" 

至:

<?php 
$this->load->helper('stdclass_helper');
?>
<div id="expense_entry" class="element_record" style="padding:20px;" 

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

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

"



<div id="expense_entry" class="element_record" style="padding:20px;" saveHandler="Accounting.Expenses.saveExpense">
<!-- BEGIN EXPENSE ENTRY FORM -->
<?php 
$this->load->helper('stdclass_helper');
?>
"

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

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

更新:作为一个彻底的人,因为我已经在 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 );

这对我很有效。

于 2013-01-30T20:11:30.487 回答