【问题标题】:jQuery load not updating the document in Internet ExplorerjQuery 加载不更新 Internet Explorer 中的文档
【发布时间】:2011-04-08 02:28:13
【问题描述】:

可怕的 IE 攻击再次发生。 :(

在过去的几天里,我一直在使用模式对话框为 Tiny MCE 开发图像选择和上传工具。在脚本中,jQuery 的 load() 函数被多次使用来加载外部 HTML 并将其插入到指定的 div 元素中。

一切都很顺利,即使在 IE 中,直到大约半小时前,当我启动 IE 检查更改时,所有的 load() 调用现在什么都不做。内容应该出现在文档中的位置(检查了开发人员工具),有一个空的 div。也没有报告错误。但是,我可以使用 html() 手动更新元素。

直到几个小时前,它在 IE 中一切正常……现在它什么也没做。我已经尝试使用完整地址(没有这样的运气),已经清除了浏览器缓存并尝试从 load() 调用的 php 文档中发送无缓存标题。会不会是某种缓存问题?

这是许多类似调用中的第一个示例:

//Create the dialog.
if ($('#imgPropDialog').length == 0) {
    $('body').append('<div id="imgPropDialog" class="jqmWindow"></div>');
    $('#imgPropDialog').load('system/admin/ajax/image_properties.php');
}

imgPropDialog div 已正确添加并出现在 IE 的文档中。但是 image_properties.php 的内容永远不会出现。在 Chrome 中运行良好(大概除了 IE 之外的所有其他浏览器)。

在我开始删除所有更改之前有什么想法吗? 谢谢

【问题讨论】:

    标签: jquery internet-explorer load


    【解决方案1】:

    快速解决方法,最后添加随机数作为参数,以确保每次新请求

    例如

    $('#divID').load(jspFrom + '?param1name=' + param1value+ 'param2name=' + param2value + '&random=' + Math.random();

    【讨论】:

      【解决方案2】:

      看来问题实际上是我在 image_properties.php 中的用户身份验证问题。对于我的用户身份验证,我创建了各种标头的“指纹”,以增加一点额外的安全性。其中之一是 HTTP_ACCEPT_LANGUAGE - 无论出于何种原因,Internet Explorer 中的 AJAX 请求(但不是常规页面加载)都在更改此特定标头,因此导致用户身份验证失败。

      安德的建议让我成功了。 :)

      【讨论】:

        【解决方案3】:

        您可以通过在 URL 中添加随机查询字符串来快速测试缓存是否是您的问题,如下所示:

        $('#imgPropDialog').load('system/admin/ajax/image_properties.php?_=1234');
        

        如果这样可以正常工作,那么缓存就是您的问题。 AJAX GET 请求(这是 .load() 使用的)由 IE 缓存。如果您想在每个请求的基础上停止缓存,则需要使用 $.ajax() 代替,cache 选项设置为 false。或者,您可以生成自己的随机查询字符串(这就是 jQuery cache: false 选项所做的一切)。

        或者,如果您想完全禁用 AJAX 缓存,请执行以下操作:

        $.ajaxSetup ({
            // Disable caching of AJAX responses */
            cache: false
        });
        

        看到这个问题:Stop jQuery .load response from being cached

        编辑

        其他建议:尝试这样的事情,看看会发生什么

        $.ajax({url: 'system/admin/ajax/image_properties.php', cache: false, success: function(data, textStatus) {
            alert($(data).html());
        }});
        

        希望该警报会告诉您返回的信息(如果有的话)。如果它没有弹出,要么是请求以某种方式失败,要么是 IE 以某种方式忽略了无缓存。

        【讨论】:

        • 刚刚尝试将 cache: false 添加到我的 ajaxSetup - 没有变化。还尝试使用带有缓存的ajax进行调用:false set - 那里也没有区别。我还在对数据的 ajax 调用中发出了警报,但没有显示任何内容。这符合 SimpleCoder 的建议,因此我将 image_properties.php 输出减少为带有粗体标签的简单字符串 - 也没有任何变化。
        • 将随机查询添加到 image_properties.php url 没有任何区别,但我怀疑这是缓存问题。我将 url 更改为包含 test 的测试 html 文件 - 它有效!将其设置回 image_properties.php,我将其设置为输出完全相同的 html 代码 - 再次没有响应。 ://
        • 令人困惑。我已经用一个额外的建议编辑了我的答案,看看这是否有帮助。
        • 我今天早上试过了,它似乎有助于解决这个问题。基本上 image_properties.php 的整个结果都包含在权限检查中(它是管理员的一部分)。更改 image_properties.php 以转储权限检查的结果(然后通过 ajax 调用中的警报显示)为 Chrome 提供“bool true”(正确 - 用户已经登录)和“bool false” Internet Explorer,即使登录已完成。因此,在 IE 的 ajax 调用期间似乎没有维护 PHP 会话。有什么建议吗?
        • 已修复。完全不相关,但是您的建议使我朝着正确的方向前进。我在我的会话中使用标题指纹来增加一个小的安全层,并且我被告知可以安全使用的一个标题(即:它不会在 IE 中的每个请求上更改)实际上导致指纹失败。删除了标题,它可以工作。 :)
        【解决方案4】:

        我在 IE 中将内容加载到 div 时遇到了类似的问题(虽然我没有使用 load(),只是使用了 get())。检查以确保您正在加载的页面内容在语法上是有效的。如果内容有问题,IE 有时根本不会呈现内容。在我的情况下,我试图加载的整个内容块没有呈现,因为我正在使用的元素上的 max-height CSS 属性。 IE 可能很懒惰,根本懒得修复内容。

        【讨论】:

        • 有道理,但我尝试将 image_properties.php 的输出减少到“test”,但它仍然可以。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-13
        • 1970-01-01
        • 1970-01-01
        • 2012-05-17
        • 2011-10-17
        相关资源
        最近更新 更多