解析:使用easyui的form提交表单,在IE下出现类似附件下载时提示是否保存的现象

原文:解析:使用easyui的form提交表单,在IE下出现类似附件下载时提示是否保存的现象

之前开发时遇到的一个问题,使用easyui的form提交表单,在Chrome下时没问题的,但是在IE下出现类似附件下载时提示是否保存的现象。

这里记录一下如何解决的。其实这个现象不光是easyui的form,还有其他一些form插件也是一样的,使用不当就会遇到这个问题。

 

前台:

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <meta name="keywords" content="">
    <meta name="description" content="">
    <title></title>
    <link rel="stylesheet" type="text/css" href="http://www.jeasyui.com/easyui/themes/default/easyui.css">
    <link rel="stylesheet" type="text/css" href="http://www.jeasyui.com/easyui/themes/icon.css">
    <script src="http://code.jquery.com/jquery-1.11.3.min.js"></script>
    <script type="text/javascript" src="http://www.jeasyui.com/easyui/jquery.easyui.min.js"></script>
</head>
<body>
    <div>
        <form id="formTest" method="post" action="~/Test/Save">
            name: <input type="text" /><br />
            <a href="javascript:void(0)" class="easyui-linkbutton" onclick="submitForm()">submit</a>
        </form>
    </div>
    <script type="text/javascript">
        function submitForm() {
            $('#formTest').form('submit', {
                success: function(data){
                    var data = $.parseJSON(data);
                    if (data.result){
                        alert(data.msg)
                    }
                }
            });
        }
    </script>
</body>
</html>

后台:

        public ActionResult Save()
        {
            return Json(new {
                result = true,
                msg = "Save successful."
            });
        }

结果:

Chrome是这样↓

IE是这样↓,不科学啊?

怎么解决?改后台的Action的返回的content-type改为text/html:

        public ActionResult Save()
        {
            return Json(new {
                result = true,
                msg = "Save successful."
            }, "text/html");
        }

 

为什么?因为JsonReslut默认返回给浏览器的content-type类型是:application/json,(←等于没说)。

奇怪了,我们平时通过jQuery的ajax方法来提交数据、请求数据不都挺正常的吗,没出现过这个情况啊,浏览器兼容性jQuery已经帮我们处理好了啊,这个easyui的form方法也是无刷新提交表单啊,应该也是ajax吧。问题就在这里,这个easyui的form提交表单并不是真的ajax。我们来看看easyui-form的源码(正好1.4.2版本的jquery.form.js有源码):

...省略...
         function ajaxSubmit(target, options){
        var opts = $.data(target, 'form').options;
        $.extend(opts, options||{});

        var param = $.extend({}, opts.queryParams);
        if (opts.onSubmit.call(target, param) == false){return;}
        $(target).find('.textbox-text:focus').blur();
        //构造了一个iframe
        var frameId = 'easyui_frame_' + (new Date().getTime());
        var frame = $('<iframe id='+frameId+' name='+frameId+'></iframe>').appendTo('body')
        frame.attr('src', window.ActiveXObject ? 'javascript:false' : 'about:blank');
        frame.css({
            position:'absolute',
            top:-1000,//让我们看不到它
            left:-1000
        });
        frame.bind('load', cb);

        submit(param);

        function submit(param){
            var form = $(target);
            if (opts.url){
                form.attr('action', opts.url);
            }
            var t = form.attr('target'), a = form.attr('action');
            form.attr('target', frameId);//把我们要提交的form的target指向构造出来的那个iframe
            var paramFields = $();
            try {
                for(var n in param){
                    var field = $('<input type="hidden" name="' + n + '">').val(param[n]).appendTo(form);
                    paramFields = paramFields.add(field);
                }
                checkState();
                form[0].submit();
            } finally {
                form.attr('action', a);
                t ? form.attr('target', t) : form.removeAttr('target');
                paramFields.remove();
            }
         ...省略...

看我标为红色的,其他的我现在不关心,就先省略了。

我们看到easyui的作者写了一个ajaxSubmit方法(不仔细看内容还真以为是一个ajax方法呢)。方法里面动态构造了一个隐藏的iframe,然后把我们要提交的form的target指向了构造出来的这个隐藏的iframe,给这个iframe设置了load事件回调方法用来处理响应。重要的是那句“form[0].submit()”,这是什么,这就是直接在提交表单啊,哪儿有什么ajax,只是保证了页面无刷新。(好吧,我承认我理解的ajax概念比较狭隘)

IE浏览器对于application/json的非ajax的响应的处理比较特殊,我这里指的是相当于你在IE的地址栏上输入了一个url,而服务器返回的content-type是application/json,我猜是IE默认是不能直接处理application/json的响应,所以就提示下载了。

而Chrome则默认对application/json是当做文本来处理的,所以可以正常显示。

还有一点需要弄清楚的是ajax,我们看看这个(来自w3school):

我们看出ajax的响应实际上就两种,一种当做纯文本处理,另一种当做xml处理。所以jQuery的ajax默认对于application/json或者text/html都会当做文本处理的,ajax是没有一种处理方式是“下载保存”的方式的。

这样应该比较好理解这个问题了。

可以比较一下用真的ajax来提交表单,不管后台返回的是application/json或者text/html处理都是一致的:

        function submitForm() {
            $.post($("#formTest").attr("action"), {
                name: $("#formTest input[type=text]").val()
            }, function (response) {
                alert(response.msg);
            });
        }

 

时间: 2024-09-01 06:01:53

解析:使用easyui的form提交表单,在IE下出现类似附件下载时提示是否保存的现象的相关文章

ajax提交表单,MVC下action执行两次,前台只执行一次,求解

问题描述 前台ajax提交:第一步,点击添加按钮:<td><aclass="easyui-linkbutton"onclick="ns.rolelist.add();">添加</a></td>第二步,调用add()方法:ns.rolelist.add=function(){userAE({iconCls:'icon-add',formUrl:'/DZZHYHDHCB/Add'});};第三步,调用userAE()方法,

举例详解HTML5中使用JSON格式提交表单

以JSON编码格式提交表单数据是HTML5对WEB发展进化的又一大贡献,以前我们的HTML表单数据是通过key-value方式传输的服务器端,这种形式的传输对数据组织缺乏管理,形式十分原始.而新出现的JSON格式提交表单数据方法,将表单里的所有数据转化的具有一定规范的JSON格式,然后传输的服务器端.服务器端接收到的数据是直接可以使用的合格JSON代码.如何声明以JSON格式提交表单 大家应该对如何用表单上传一个文件的写法很熟悉,它需要在HTML中form标记上添加 enctype="multi

深入分析JSON编码格式提交表单数据

  这篇文章主要介绍了深入分析JSON编码格式提交表单数据的相关资料,需要的朋友可以参考下 以JSON编码格式提交表单数据是HTML5对WEB发展进化的又一大贡献,以前我们的HTML表单数据是通过key-value方式传输的服务器端,这种形式的传输对数据组织缺乏管理,形式十分原始.而新出现的JSON格式提交表单数据方法,将表单里的所有数据转化的具有一定规范的JSON格式,然后传输的服务器端.服务器端接收到的数据是直接可以使用的合格JSON代码. 如何声明以JSON格式提交表单 大家应该对如何用表

JS和jQuery使用submit方法无法提交表单的原因分析及解决办法_javascript技巧

昨天,在做一个表单异步提交内容的时候,遇到很奇怪的问题,submit()方法无法进行提交,每次提交都是把 当前给刷新了,网络抓包发现,每次都是 get方式去获取 当前页面,完全没有post 请求,想着以前 遇上这样的问题 都是因为 表单中 有 name 或者 id 这些命名跟submit 有冲突,但是检查了几次,始终没有发现 名字冲突,所以这个可能性被排除. 平常自己做触发按钮,基本不用a 标签,但是昨天不知道什么 问题,竟然用了 a 而且还给了 href 为空,由于这个a 的class 有多个

深入分析JSON编码格式提交表单数据_json

以JSON编码格式提交表单数据是HTML5对WEB发展进化的又一大贡献,以前我们的HTML表单数据是通过key-value方式传输的服务器端,这种形式的传输对数据组织缺乏管理,形式十分原始.而新出现的JSON格式提交表单数据方法,将表单里的所有数据转化的具有一定规范的JSON格式,然后传输的服务器端.服务器端接收到的数据是直接可以使用的合格JSON代码. 如何声明以JSON格式提交表单 大家应该对如何用表单上传一个文件的写法很熟悉,它需要在HTML中form标记上添加 enctype="mult

php判断客户端IP来防止重复提交表单的方法

本文实例分析了php通过记录IP来防止表单重复提交方法.分享给大家供大家参考.具体分析如下: 这个原理比较的简单就是用户第一次提交时我们记录提交用户的IP地址,这样如果用户在固定时间内再次提交表单就会提示重复提交了,这种做法通常用于在顶一下,支持一下这种应用中了,在防止数据重复提交是一个非常不好的选择. 例子,代码如下:  代码如下 复制代码 <?php  session_start(); if(empty($_SESSION['ip']))//第一次写入操作,判断是否记录了IP地址,以此知道是

javascript中回车提交表单代码

本demo演示在文本框中按enter键是否触发提交表单 默认情况下,一个文本框的时候,提交,不管按钮type是submit还是button 一个文本框的时候怎么才能做到不提交,方法是加一个隐藏掉的文本框 只要有type为submit的按钮存在,一个文本框还是多个文本框都提交 只要有type为submit的按钮存在,一个文本框还是多个文本框都提交 多个文本框的时候,不提交,用type为button的按钮就行啦 用button元素时,FX和IE下有不同的表现 提交 radio和checkbox在FX

jQuery EasyUI提交表单验证_jquery

EasyUI的form表单里面的验证框,先讲解下validatebox类和相关的属性. 验证规则 验证规则是通过使用 required 和 validType 特性来定义的, 这里是已经实施的规则: email:匹配 email 正则表达式规则,系统提供的属性. url:匹配 URL 正则表达式规则 length[0,100]:允许从 x 到 y 个字符 remote['http://.../action.do','paramName']:发送 ajax 请求来验证值,成功时返回 'true'

Jquery.Form 异步提交表单的简单实例

 这篇文章主要介绍了Jquery.Form 异步提交表单的简单实例.需要的朋友可以过来参考下,希望对大家有所帮助 http://www.vaikan.com/docs/jquery.form.plugin/jquery.form.plugin.html#   1. 在你的页面里写一个表单.一个普通的表单,不需要任何特殊的标记:    代码如下: <form id="myForm" method="post" action="/Home/AjaxFor