2

我有一个 Web 应用程序,它登录到另一个 Web 服务并可能为用户执行一些操作。

我正在使用 codeigniter 和 jQuery。我在 codeigniter 中设置了一个控制器,专门用于处理 ajax 请求。控制器做它需要做的任何事情,然后echo是 json.

下面的 ajax 调用应该获取其他 Web 服务的用户名和密码,并将它们发布到我的 ajax 控制器。控制器使用这些值尝试登录到其他服务(使用 curl)。json 响应反映了登录是否成功。

我的问题是有时我的浏览器被重定向到 ajax 控制器,所以 json 响应被echo编辑到浏览器。我无法确定发生这种情况的原因或时间。发生这种情况时,不会调用该success函数。

/* Verify login credentials
 *
 * @param username, password
 * @param activityElement - element in which to place activity indicator
 * @param location - location to refresh after success
 * @return none
*/
function verify_login(username, password, activityElement, location) 
{  
    $.ajax({
        type: 'POST',
        url: '<?=site_url('ajax/eval_login')?>',
        data: { username: username, password: password },
    beforeSend:function() {
        window.savedHtml = $(activityElement).html();
        $(activityElement).html('<div id="activity"></div><div class="text-center">Verifying </div>');
        $('#activity').activity(); //neteye activity indicator plugin
    },
    success:function(data) {
        data = $.parseJSON(data);
        if (data.success) {
            $(activityElement).html(window.savedHtml);

            //fades in success message then performs function
            set_message('Success!',function() {
                alert(location);
                window.location.href = "<?=site_url()?>/" + location;
            });
        } else {
            $(activityElement).html(window.savedHtml);
            set_message(data.error);
        }    
        $('#activity').activity(false);
        set_clicks();
    },
    error:function(){
        set_message('<strong>Oops!</strong> Try that again in a few moments.</p>');
        $('#activity').activity(false);
        $(activityElement).html(window.savedHtml);
    }
    });
}

编辑:我很困惑。我真的不认为ajax请求是问题......对我来说没有意义

再次走过它..

  1. 请求随.ajax通话一起发送
  2. 有时一切都按预期工作(请求返回,ui 已更新)
  3. 有时浏览器只是转到http://yadayada.local/index.php/ajax/eval_login显示正确 json 响应的位置(请参见下面的屏幕截图..)。有趣的是正在显示正确的 json 响应。如果浏览器只是被重定向,则不会有输出,因为$_POST它将是空的......

截屏

4

3 回答 3

2

问题是我出于某种原因将表单操作指向了 ajax 控制器,并且event.preventDefault()有时只能工作。不敢相信我做到了..我想我应该因为草率的逻辑

于 2012-09-26T02:57:59.737 回答
1

我会使用您的浏览器网络检查器来查看对其中一个失败请求的响应,这可能会对您的应用程序响应中的问题有所了解。

@see http://docs.jquery.com/Ajax_Events “只有在请求成功时才会调用此事件(服务器没有错误,数据没有错误)。”

所以要么是响应代码要么是响应数据导致失败。

于 2012-09-25T23:05:10.787 回答
0

我认为你不需要这条线:

data = $.parseJSON(data);

尝试在没有它的情况下运行它。

于 2012-09-25T23:07:36.263 回答