Ajax成功功能在jquery mobile中不起作用

Posted

技术标签:

【中文标题】Ajax成功功能在jquery mobile中不起作用【英文标题】:Ajax success function not working in jquery mobile 【发布时间】:2016-03-24 18:49:49 【问题描述】:

我正在尝试使用用户名和密码字段验证基本登录表单。我需要从check.php ajax 页面验证用户名和密码。 ajax请求和响应没有问题。我从 ajax 页面得到了正确的响应。但是Ajax成功函数不能正常工作。

ajaxrequest.html

$(document).on('pagebeforeshow', '#login', function()
        $(document).on('click', '#submit', function() 
        if($('#username').val().length > 0 && $('#password').val().length > 0)
                $.ajax(
                    url : 'serverurl/check.php',
                    data: action : 'login', formData : $('#check-user').serialize(),
                    type: 'post',                   
                    beforeSend: function() 
                        $.mobile.loading(true);
                        alert("beforesend");
                    ,
                    complete: function() 
                        $.mobile.loading(false);
                        alert("complete");
                    ,
                    success: function (result) 
                        console.log("Ajax response");   
                        res = JSON.stringify(result);
                        if(res.status == "success")    
                        resultObject.formSubmitionResult = res.uname;
                        localStorage["login_details"] = window.JSON.stringify(result);
                        $.mobile.changePage("#second");
                else
                        $.mobile.changePage("#login");
                        alert("incorrect login");           
                
                    ,
                    error: function (request,error) 
                        alert('Network error has occurred please try again!');
                    
                );                   
         else 
            alert('Fill all fields');
                   
            return false;
        );    
);

在这里我添加了我的 ajax 页面。此页面仅验证发布的用户名和密码。最后它返回json 对象。我做错了什么?

serverurl/check.php

header("Access-Control-Allow-Origin: *");
header('Content-Type: application/json');
if(isset($_POST['formData']) && isset($_POST['action']) && $_POST['action'] == 'login')
    parse_str($_POST['formData'],$searchArray);
    $uname = "arun";
    $pwd = "welcome";
    $resultArray = array();
    if($uname == $searchArray['username'] && $pwd == $searchArray['password'])      
    
        $resultArray['uname'] = $searchArray['username'];
        $resultArray['pwd'] = $searchArray['password'];
        $resultArray['status'] = 'success';
    else
        $resultArray['status'] = 'failed';
    
    echo json_encode($resultArray);

【问题讨论】:

发布响应 json、任何错误或异常。 我没有收到任何错误。相反,我没有在成功功能中得到响应。直接进入错误函数。 【参考方案1】:

你的代码应该是

success: function (result) 
                        console.log("Ajax response");   
                        //don't do this
                        //res = JSON.stringify(result);
                        if(result.status == "success")    
                        resultObject.formSubmitionResult = result.uname;
                        localStorage["login_details"] = window.JSON.stringify(result);
                        $.mobile.changePage("#second");
                else
                        $.mobile.changePage("#login");
                        alert("incorrect login");           
                

JSON.stringify 之后,您像stringJson.status 一样访问,这将不起作用。它桅杆已“解析”“json 对象”而不是字符串化。

【讨论】:

感谢您的回复。我想要做,jQuery.parseJSON(result) 还是只是删除那个 stringify? 只需删除 stringify 。 我已经按照你说的做了。转换为apk后,我将我的apk安装到了我的手机上。同样的问题也存在。当我输入错误的用户名和密码时,它会进入错误功能并抛出错误消息(发生网络错误,请重试!)。响应没有进入成功函数 在浏览器中得到正确的结果。当我将我的代码转换为 apk 并安装到移动设备中时。它不工作。 它在success 里面吗?可以在手机上追踪吗?【参考方案2】:

不需要将您的 JSON 转换为字符串。

$(document).on('pagebeforeshow', '#login', function()
        $(document).on('click', '#submit', function() 
        if($('#username').val().length > 0 && $('#password').val().length > 0)
                $.ajax(
                    url : 'serverurl/check.php',
                    data: action : 'login', formData : $('#check-user').serialize(),
                    type: 'post',                   
                    beforeSend: function() 
                        $.mobile.loading(true);
                        alert("beforesend");
                    ,
                    complete: function() 
                        $.mobile.loading(false);
                        alert("complete");
                    ,
                    success: function (result) 
                        console.log("Ajax response");   
                        //Don't need to converting JSON to String
                        //res = JSON.stringify(result);
                        //directly use result 
                        if(result.status == "success")    
                        resultObject.formSubmitionResult = result.uname;
                        localStorage["login_details"] = window.JSON.stringify(result);
                        $.mobile.changePage("#second");
                else
                        $.mobile.changePage("#login");
                        alert("incorrect login");           
                
                    ,
                    error: function (request,error) 
                        alert('Network error has occurred please try again!');
                    
                );                   
         else 
            alert('Fill all fields');
                   
            return false;
        );    
);

【讨论】:

在浏览器中得到正确的结果。当我将我的代码转换为 apk 并安装到移动设备中时。它不工作。 如果您必须同时使用这两个结果,则此结果在 android 中不起作用,那么您需要使用 API 这为两者提供结果。 我需要澄清一件事。您需要使用 API。这是什么意思。你能告诉我一些更详细的吗? 没有。现在您正在谈论成功功能。我的问题是代码不会进入成功函数本身。直接进入错误函数。【参考方案3】:

您的 AJAX 调用很完美,但数据类型未在 ajax 中声明

尝试使用 JSON 或 JSONP。你会成功的。

$.ajax(
    url : 'serverurl/check.php',                    
    type: 'post',
    dataType: "json", OR "jsonp",
    async: false,
    data: action : 'login', formData : $('#check-user').serialize(),
        beforeSend: function() 
        $.mobile.loading(true);
        alert("beforesend");
    ,
    complete: function() 
        $.mobile.loading(false);
        alert("complete");
    ,
    success: function (result) 
        console.log("Ajax response");   
        alert(JSON.stringify(result)); // Check response in alert then parse according to that
        res = JSON.stringify(result);
        if(res.status == "success")    
        resultObject.formSubmitionResult = res.uname;
        localStorage["login_details"] = window.JSON.stringify(result);
        $.mobile.changePage("#second");
else
        $.mobile.changePage("#login");
        alert("incorrect login");           

    ,
    error: function (request,error) 
        alert('Network error has occurred please try again!');
    
);  

【讨论】:

在浏览器中得到正确的结果。当我将我的代码转换为 apk 并安装到移动设备中时。它不工作。 将 async: false & jsonp 用于移动目的 我也尝试过异步和 jsonp。同样的问题也存在。成功功能不起作用 警报框在 apk/mobile 中不起作用更好的方式将您的成功结果绑定到任何 要绑定结果,我的响应应该进入成功函数。我的问题是成功功能不起作用。直接进入错误函数。【参考方案4】:

在某些情况下,您的服务器可能无法正确返回响应。您是否尝试过像这样处理实际的响应代码(例如,如果您的服务器返回 200):

 $.ajax(
         url : 'serverurl/check.php',
         data: action : 'login', formData : $('#check-user').serialize(),
         type: 'post', 
         .... 
         statusCode: 
               200: function (response) 
                      // do your stuff here
                    
         
 );

【讨论】:

我试过statusCode,在statusCode里面我使用了alert(statusCode),它返回空的[object Object]。我想我们就在附近。那是什么? 尝试:alert(response);alert(response.responseText);,具体取决于您的回复内容... alert(response) 给出 [object Object],alert(response.responseText) 给出未定义。 如果我是你,我会调试函数来查看你的响应对象是什么。你可以这样做:... 200: function(response)debugger; 在浏览器中打开你的页面并打开检查器,你的代码应该在这里中断。如果确实如此(它应该这样做),只需在控制台中输入response。通过这种方式,您可以检查响应对象为您提供的属性... 感谢您的回复。我收到成功响应 --- response = Object uname: "arun", pwd: "welcome", status: "success",失败响应 --- response = Object status: "failed"。所以我得到了服务器的正确响应。但在移动 apk 中,成功函数内部什么也没有发生

以上是关于Ajax成功功能在jquery mobile中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

完整功能中的ajax调用后刷新jquery mobile listview不起作用

jQuery Mobile 在 WebView 中不起作用

滑块在 jQuery Mobile 中不起作用

为啥我的 simpledialog2 在我的 jQuery Mobile 代码段中不起作用?

$.extend 中的 AJAX 函数在 jQuery 3 中不起作用

Ajax 在 JQuery 表单插件中不起作用