代码之家  ›  专栏  ›  技术社区  ›  CallMeLaNN

浏览器自动完成/保存表单在ajax请求中不起作用

  •  21
  • CallMeLaNN  · 技术社区  · 16 年前

    在搜索引擎中搜索任何关键字组合都是非常困难的,因为大多数流行的开发人员都希望通过ajax实现自定义的自动完成。

    大多数开发人员通过ajax搜索自定义自动完成以从db获得结果,或者由于安全原因,搜索如何禁用浏览器自动完成,或者他们希望使用另一个自动完成扩展程序。

    在登录表单中填写用户名和密码这样的表单是简单而正常的。提交表单后(表单数据发布),浏览器将保存自动完成,或FF中的事件将要求与密码一起保存。

    现在,考虑一下通过ajax提交的登录。由于表单不是通过post方法发送的,因此IE或FF不会自动保存表单数据。我很确定这是因为ajax和post方法。

    像DotNetNuke这样的CMS使用这种方式,我很难为开发目的的5个用户登录键入用户名和密码,如果我想让用户在浏览器中保存他们自己的表单数据,而无需任何自定义或扩展程序。通过另一个例子,用户可以看到并使用同一封电子邮件来填写跨网站或域的任何电子邮件表单。

    如何解决这个问题?

    卡拉梅林

    3 回复  |  直到 8 年前
        1
  •  4
  •   user268781 user268781    16 年前

    我也有同样的问题。我能够通过添加一个隐藏的iframe来解决FireFox的问题,在发布AJAX帖子之前,我通过JavaScript提交了这个iframe。我还没有找到任何能在Chrome/IE中工作的东西。

        2
  •  2
  •   shiser    14 年前

    我也遇到过同样的问题,也曾进行过一些搜索。如果你有一个登录页面,我认为下面的解决方案是解决这个问题最方便的方法。如果我们考虑通过Ajax提交的登录,则浏览器中没有一个记住或提供自动补充的用户名和密码字段的功能,另外要求记住凭据。但是如果您使用javascript提交功能(可能与旧版本的浏览器不兼容),除了IE之外,所有浏览器都提供保存用户名和密码的功能。但是我发现另一个javascript很难让IE提供保存用户名和密码的功能。

    [编辑]:链接已断开

    有一个关于这个问题的固定页面在页面链接,我不能给你另一个链接,因为我的声誉。请在页面中搜索以下报价:

    当然,如果您因为表单提交而在默认页面中有一个登录部分,那么这种方法就不适合。这会导致页面闪烁。我想知道是否有人对此有想法?

        3
  •  1
  •   Armel Larcier    12 年前

    下面是一些非结构化的js jQuery代码,它将通过ajax($.post方法)将表单提交到真实的后端脚本,也将通过iFrame提交到虚拟脚本,因此浏览器将保存提交的数据以供后续自动完成。

    var  formframesindex = 0;
    function onSubmitAjax(evt){
        var $form = $(this);
        var framesubmitting = $form.hasClass('framesubmitting');
        var action = $form.attr('action');
        var original_action = action;
    
        if(!framesubmitting){
            $.post(action,$form.serialize()+"&ajax=1", function(responseText,message,request){
                formResponseHandler(responseText);
            }, "json");
    
    
            formframesindex++;
            var formframe = $("<iframe name='formframe_id_"+(formframesindex)+"' id='formframe_id_"+(formframesindex)+"' class='formframe' src='/fakeformreceiver.php'></iframe>");
            $('body').append(formframe);
            var target = $form.attr('target');
            $form.data('originaltarget',target);
            $form.data('originalaction',original_action);
            $form.attr('target','formframe_id_'+formframesindex);
            $form.attr('action','/fakeformreceiver.php');
            $form.addClass('framesubmitting');
            $form.submit();
    
        } else {
            var current_target = $form.attr('target');
            var original_action = $form.data('originalaction');
            var original_target = $form.data('originaltarget');
            var $frame = $('#'+current_target);
            setTimeout(function(){
                if($frame && $frame.length){
                    $frame.remove();
                }
                $form.attr('action',original_action);
                $form.attr('target',original_target);
                $form.removeClass('framesubmitting');
            },100);
        }
        return framesubmitting;
    }