5

我正准备解决这个问题。我正在使用非常简单的 jQuery ajax 调用从数据库中获取值并使用这些值填充一些选择元素,所有这些都以 JSON 形式返回。它在大多数浏览器上对我来说都可以无缝运行,但是客户报告说他们和他们的客户都没有看到结果。

我一路添加了一些 Console.log() 命令以确保代码正在执行,并且确实如此。有时,对相关 URL 的 ajax GET 有效,其他时候仍然返回 200 OK,但代码根本不会进一步执行,并且错误回调中不会显示任何 ajax 错误消息。

这是我正在使用的代码,有人可以发现可能导致某些浏览器阻塞的明显内容吗?如果是这样,如果您能指出,我将不胜感激:

        var $j = jQuery.noConflict(true);
        $j(document).ready(function(){
            //console.log("jQuery has loaded");
            //console.log("attempting to load country list via AJAX call now");
            $j.ajax({
                url: 'http://www.topplaces.co.za/templates/seb_one/positions/search_establishments_filter/search/db.php?q=countries&rand='+Math.random(),
                success: function(data){
                    //console.log("Successfully got country list, going to populate the dropdown now");
                    if(data.length){
                        $j("#country").children("option:not(:first)").remove();
                        $j("#country").attr("disabled", false);
                        $j.each(data, function(resultIndex, result){
                            var o = new Option();
                            $j(o).html(result.country).val(result.country);
                            $j("#country").append(o);
                        })
                        //console.log("Country list should be populated now?");
                    }
                },
                error: function (xhr, ajaxOptions, thrownError){
                    //console.log(xhr.responseText);
                    console.log(thrownError);   
                },
                dataType: 'json',
                cache: false
            })

            $j("#country").live('change', function(){
                var id = $j(this).val();
                if(id == ""){
                    $j("#province").attr("disabled", "disabled");
                    $j("#town").attr("disabled", "disabled");
                    return false;
                }
                $j.ajax({
                    url: 'http://www.topplaces.co.za/templates/seb_one/positions/search_establishments_filter/search/db.php?q=provinces&c='+id+'&rand='+Math.random(),
                    success: function(data){
                    if(data.length){
                        $j("#province").children("option:not(:first)").remove();
                        $j("#province").attr("disabled", false);
                        $j.each(data, function(resultIndex, result){
                            var o = new Option();
                            $j(o).html(result.province).val(result.province);
                            $j("#province").append(o);
                        })
                    }
                },
                dataType: 'json',
                cache: false
                })
            });

            $j("#province").live('change', function(){
                var id = $j(this).val();
                if(id == ""){
                    $j("#town").attr("disabled", "disabled");
                    return false;
                }
                $j.ajax({
                    url: 'http://www.topplaces.co.za/templates/seb_one/positions/search_establishments_filter/search/db.php?q=towns&p='+id+'&rand='+Math.random(),
                    success: function(data){
                    if(data.length){
                        $j("#town").children("option:not(:first)").remove();
                        $j("#town").attr("disabled", false);
                        $j.each(data, function(resultIndex, result){
                            var o = new Option();
                            $j(o).html(result.town).val(result.town);
                            $j("#town").append(o);
                        })
                    }
                },
                dataType: 'json',
                cache: false
                })
            });

        })

我已经注释掉了 Consol.log 命令,因为客户端在 IE 上收到错误消息,因为没有控制台。

编辑:我没有提到这是一个相同的域请求,因此遵守同源策略

完整的站点在这里:http ://www.topplaces.co.za/ 右侧是一个动态选择组,它以国家开头并启动 AJAX 调用,直到选择了一个省。这个问题,很多人说国家对他们来说没有负担......

亲切的问候,西蒙

4

3 回答 3

4

检查你的服务器应用程序是否总是返回有效的 JSON 对象,否则它不会被接受,因为你设置了dataType: 'json'. 在这种情况下,error将执行 function 而不是success.

删除dataType参数,看看会发生什么,尝试解析传入的数据$.parseJSON()- 如果 JSON 无效,它将引发异常。

于 2012-04-25T13:04:35.993 回答
2

我尝试了您的网站,但没有加载任何省份。Json 是空的。我尝试直接访问 php,它也返回空。你检查你的脚本了吗?

URL 称为 http://www.topplaces.co.za/templates/seb_one/positions/search_establishments_filter/search/db.php?q=provinces&c=Zambia&rand=0.12686952343210578&_=1335360594228

这是参数见:

q:provinces
c:Zambia
rand:0.12686952343210578
_:1335360594228

json结果:[]

这真的是随机的,所以我敢打赌这是 php 脚本没有返回 json。

于 2012-04-25T13:36:47.393 回答
0

我还遇到了从 ajax 调用返回的 json 的浏览器问题。问题是,与 IE 相比,我必须在 Firefox 中查看返回数据的不同部分。对于 Firefox,data.textundefined不得不使用它data.documentElement.firstChild来查找 json:

var list = typeof data.text === 'undefined' ? jQuery.parseJSON(jQuery(data.documentElement.firstChild).text()) : jQuery.parseJSON(data.text);
于 2012-04-25T13:17:05.950 回答