【问题标题】:Ajax and JSON response bug in Internet Explorer (works in all other browsers)Internet Explorer 中的 Ajax 和 JSON 响应错误(适用于所有其他浏览器)
【发布时间】:2010-08-31 21:31:28
【问题描述】:

出于某种原因,IE 要求我们下载文件而不是作为 ajax 运行。这适用于除 IE 之外的所有浏览器。我尝试弄乱它没有运气返回的标题。

该函数获取表单数据,然后发布它,响应是一个可以是页面上要更新的任意数量项目的数组。

它不应该是文件,它应该只是一个 json 响应。

PHP

header('Content-type: application/json');

$error = "The Email and Password you entered could not be resolved.";
$elements[0]['target'] = '.error_report';
$elements[0]['action'] = 'inside';
$elements[0]['data'] = '<p>'.$error.'</p>';
$this->output->set_output(
  json_encode(array("elements" => $elements))
);

Javascript

$(document).ready(function () {
    jQuery.ajaxSetup({
        cache: false,
        dataType: 'json',
        error: function () {
            alert("Request was not successful. Please try again shortly.");
        }
    });

    $(document).ajaxSuccess(function (e, xhr, settings) {
        var response = xhr.responseText;
        if (settings.dataType != 'json') {
            return;
        };

        try {
            response = jQuery.parseJSON(response);
        } catch (e) {
            alert(e);
            return;
        }

        if (response.elements instanceof Array) {
            var reqs = ['target', 'action'];
            var valid = true;
            for (var i=0;i<response.elements.length;i++) {
                var cur = response.elements[i];
                var sel;

                for (var j=0;j<reqs.length;j++) {
                    if (typeof cur[reqs[j]] !== "string") {
                        valid = false;
                        break;
                    };
                };

                if (!valid) {
                    continue;
                };

                sel = $(cur.target);
                switch (cur.action) {
                    case "inside":
                        sel.html(cur.data);
                    break;
                    case "instead":
                        sel.replaceWith(cur.data);
                    break;
                    case "remove":
                        sel.remove();
                    break;
                    case "refreshPage":
                        window.location.reload();
                    default:
                        if (typeof sel[cur.action] === "function") {
                            sel[cur.action](cur.data);
                        }; // else continue
                    break;
                };
            };
        };


            // Dispatch the AJAX request, and save it to the data object so that
            // is can be referenced and cancelled if need be.

            self.data('ajaxify.xhr', jQuery.ajax({
                url: this.action,
                type: 'post',
                dataType: options.dataType,
                data: (beforeSubmitIsJquery ? beforeSubmitResult.serialize()
                                            : self.serialize()),
                success: function (/**/) {
                    cleanup();

                    options.onSuccess.apply(that, arguments);
                },
                error: function (/**/) {
                    cleanup();

                    options.onError.apply(that, arguments);
                },
                complete: function (/**/) {
                    options.onComplete.apply(that, arguments);
                }
            }));

【问题讨论】:

  • 您根本不需要内容类型。是什么触发了ajax请求?活动?
  • 好吧,我问是因为您描述的行为具有由事件处理程序启动 ajax 请求随后“本机”浏览器表单引起的双重发布的所有特征提交发生。如果我是你,我会三重确保你的事件处理程序要么返回“false”,要么调用“preventDefault”,或者两者兼而有之:-)
  • 作为一个临时实验,您可以尝试将&lt;button type="button"&gt; 添加到您的表单,然后将您的处理程序连接到该表单。 “按钮”类型的按钮不会提交表单,所以如果它在您使用该测试按钮进行操作时有效,那么您有证据表明您在当前代码中没有以某种方式取消该事件。跨度>
  • 由于IE忽略了preventDefault,尝试在preventDefault之后使用return false; ...
  • 加油,@drachenstern,替我向什里夫波特说“嗨”

标签: php javascript jquery internet-explorer json


【解决方案1】:

好吧,我问是因为您描述的行为具有双重发布的所有特征,这是由事件处理程序启动 ajax 请求然后发生“本机”浏览器表单提交引起的。如果我是你,我会三重确保你的事件处理程序要么返回“false”,要么调用“preventDefault”,或者两者兼而有之:-) – Pointy 1 小时前

我的后续:由于 IE 忽略了 preventDefault,尝试使用 return false;在 preventDefault ...

供将来参考其他开发人员:公共库倾向于这样做的方式是,它们通常会使用两种方法(preventDefault() 和 return false;)编写一个块,因为这会告诉每个主要浏览器停止工作事件,他们根据该事件收听。这对于旧版 IE 浏览器更为重要。

无论如何,很高兴我们能提供帮助。

【讨论】:

  • 如果您能提供帮助,只是遇到了一个问题:基本上我们通过从提交按钮中删除 type="submit" 然后在 javascript 中将其设置为 live("click" 而不是 live( “提交”(显然在 IE 中被破坏了?)
  • 天哪,对不起,我下班后你抓住了我……我早上会考虑这个。
  • 我以为您已将其连接到输入提交,并取消并返回 false。当你把它放回原来的样子时会发生什么? ~~~ Live 仅适用于某些浏览器,IIRC。当 Live 不工作时,我想到了一个解决方法,但今天早上我跑得有点慢,所以无法查看详细信息。我当然可以在大约 2 或 3 小时内查看然后回复。希望这暂时有所帮助。
【解决方案2】:

我在使用 ASP.NET MVC 4 时遇到了这个问题。我返回的是 JSONResult。但是通过将返回对象更改为 this.content 解决了这个问题。

[HttpPost]
public ActionResult Upload(AddNewModel model)
{
    /**...*/
    return this.Content(id.ToString());
}

所以看来IE返回一个json对象有问题,可以通过返回一个字符串来解决。

【讨论】:

    猜你喜欢
    • 2013-11-21
    • 1970-01-01
    • 2020-02-10
    • 2017-01-14
    • 2012-01-09
    • 1970-01-01
    • 2013-09-23
    • 2012-12-15
    • 1970-01-01
    相关资源
    最近更新 更多