【问题标题】:Ajax Broken in Browsers works in Android浏览器中的 Ajax Broken 可在 Android 中使用
【发布时间】:2011-02-23 20:47:40
【问题描述】:

我可以在 Android 应用程序中运行此代码(使用 PhoneGap 和 jQuery Mobile),但不能在桌面浏览器上运行。 它给了我这一行的萤火虫语法错误=

var TicketList = eval("(" + ajax.responseText + ")"); 

这里是代码

// JScript source code

// ran on body load
function doJsStuff()
{
    var ajax = AJAX();
    ajax.onreadystatechange = function () {
        if (ajax.readyState == 4) {
            var TicketList = eval("(" + ajax.responseText + ")");
            if (TicketList.ListCount > 0) {
            document.getElementById("opencount").innerHTML = TicketList.ListCount +" Open Tickets";
                for (Ticket in TicketList.Tickets) {
                // add stuff to DOM
                //AddTicketToList(TicketList.Tickets[Ticket]);
                }
            }
            else {
                document.getElementById("opencount").innerHTML = "All Tickets Reviewed";
                DisplayNoresults();
            }
        }
    }
    ajax.open("GET", "http://website.com/ListTicketsRequest.ashx?PageNumber=1&PageSize=1&Status=Open", true);
    ajax.send(null);
    //document.addEventListener("deviceready", onDeviceReady, false); 
    //event to check for PhoneGap
    //$('ul').listview('refresh');
    $('#mtickets').page();
    //showVars();
}

function AJAX()
{
    var xmlHttp;
    try
    {
        xmlHttp = new XMLHttpRequest();
    }
    catch (e)
    {
    }
    return xmlHttp;
}

**TicketList 是 JSon 中的一个变量,遇到这种情况=

{"Tickets" : [{"TicketID": "1054","Category": "N/A","SubmittedUserID": "bob.thebuilder","ShortDescription": "test question QID:16668","CreationDate": "2/16/2011 12:24:19 PM","TicketStatus": "Open","LongDescription": "Something is wrong with this question I know I hve the right answer but it keeps telling me I'm wrong"},{"TicketID": "1053","Category": "Mission Support","SubmittedUserID": "dave","ShortDescription": "Make  courseware revisions","CreationDate": "2/16/2011 9:34:48 AM","TicketStatus": "Open","LongDescription": "Find help tickets generated by users for possible courseware update."}], "PageCount": "6", "ListCount": "11"}

关于 PhoneGap 的注意事项如果您尝试在代码也可能在浏览器中执行的地方包含 phoengap 功能,请确保您仅在“deviceready”或您的浏览器不会呈现。示例:

function onload(){
        //event to check for PhoneGap
        document.addEventListener("deviceready", onDeviceReady, true);
}
...
function onDeviceReady() 
    {
        // Now PhoneGap API ready
        vibrate(90); // vib to ack pg ready
        $("a").click(function(event){
        vibrate(30); // add 30 sec vib to all links
        });         
    }

【问题讨论】:

    标签: ajax


    【解决方案1】:

    我的直接反应是使用jQuery's getJSON method,因为您已经习惯使用 jQuery。 jQuery 的 AJAX 提供了更广泛的浏览器兼容性基础。另外,每次你使用eval(),都会有一个小婴儿在某处哭泣。

    var url = "http://website.com/ListTicketsRequest.ashx?PageNumber=1&PageSize=1&Status=Open";
    
    $.getJSON(url ,function(TicketList){
        if (TicketList.ListCount > 0) {
            $("#opencount").html(TicketList.ListCount +" Open Tickets");
            for (Ticket in TicketList.Tickets) {
                ...
            }
        } else {
            $("#opencount").html("All Tickets Reviewed");
            DisplayNoresults();
        }
    });
    

    如果这仍然不适合您,请确保返回的 JSON 有效。但是请坚持这个方法,不要使用eval!!

    简化更新

    var url = "http://website.com/ListTicketsRequest.ashx?PageNumber=1&PageSize=1&Status=Open";
    $.getJSON(url ,function(AnyNameYouWant){
       alert(AnyNameYouWant.ListCount + " Open Tickets");
    });
    

    使用“数据”更新

    如果您的网址变得太长,您可能会开始遇到问题。建议通过data参数传递url数据。

    var url = "http://website.com/ListTicketsRequest.ashx";
    var data = "PageNumber=1&PageSize=1&Status=Open";
    
    $.getJSON(url, data, function(AnyNameYouWant){
       alert(AnyNameYouWant.ListCount + " Open Tickets");
    });
    

    【讨论】:

    • 好的,我该如何替换 eval()? function(TicketList){} 是否应该以某种方式解析数据。 BTW TicketList 是一个变量,看起来像上面的编辑。
    • function(TicketList){} 不是一个名为 TicketList 的函数。它是一个通用函数(没有名称),传递了一个名为TicketList 的变量。将您的代码放入该函数并使用 TicketList 变量,就像您对它进行 eval 一样。 .getJSON() 函数负责幕后的 eval。
    • 参见我上面的简化示例。
    • 感谢您接受我的回答。本着完整性的精神,我添加了一个简化的演示,它使用data 参数来处理您的 URL 可能太长(传递太多数据)的情况。另外,看看这些你可以使用的其他速记方法,因为你已经包含了 jQuery。 api.jquery.com/category/ajax/shorthand-methods
    【解决方案2】:

    查看您的代码,在我看来,语法错误可能不在您发布的代码中,而是包含在您在 ajax.responseText 中评估的 JSON 对象中。查看 AJAX 请求返回的数据。它是有效的Javascript吗?您调用的页面是否返回与桌面浏览器和移动设备不同的内容? JSON代码应该在哪里有错误信息吗?

    【讨论】:

      【解决方案3】:

      另一种可能性:您的应用是否在 website.com 上运行?如果没有,Firefox 可能会阻止 XMLHttpRequest 正常运行。 Firefox 3 及更低版本阻止跨站点 AJAX 请求。 Firefox 3.5 seems to allow some exceptions.

      【讨论】:

      • 实际上也存在跨站点浏览器错误,因此感谢您的建议。它现在可以在浏览器中使用。
      猜你喜欢
      • 2014-10-04
      • 2013-01-18
      • 2015-08-26
      • 2014-04-08
      • 1970-01-01
      • 1970-01-01
      • 2013-01-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多