全局范围,返回值和ajax的问题​​?

时间:2011-08-19 14:25:50

标签: javascript jquery ajax global-variables

标题是关于我的剧本出了什么问题的猜测:

这是在我的global.js脚本中:

alert(search.getLabelsNames(); //alerts as undefined.
$('#search').autocomplete({
    source: function( request ) {
        search.getLabelsNames();
    },
    minLength:1
});

这是在我的functions.js脚本中:

var search;
window.search = {
    getLabelsNames:function( search ) {
        $.ajax({
            url : '../db_scripts/get_labels_names.php',
            type: "POST",
            data: { id: search }, //this defaults to nothing. not a problem
            success : function( data ) {
                var dataObj = jQuery.parseJSON( data );
                $.each(dataObj, function() {
                    alert(this.name);
                    return this.name;
                })
            }
        });
    }
}

在每个函数this.name中,从数据库中正确返回每个标签名称。但是当我从globals.js调用它时,它会返回undefined。如果我返回数字1,search.getLabelsNames()警告1 ..所以找到全局函数没有问题。

此脚本有什么问题以及为什么global.js找不到要返回的this.name

3 个答案:

答案 0 :(得分:3)

你有两个问题:

  1. 您无法从jQuery.each回调中返回数据。返回值表示是否停止迭代。来自documentation

      

    我们可以通过使回调函数返回false来在特定迭代中中断$.each()循环。返回非false与for循环中的continue语句相同;它将立即跳到下一次迭代。

  2. 您无法从Ajax回调中返回数据。 Ajax是异步,这意味着在你的情况下getLabelsNames在之前返回,检索并处理响应。

  3. 幸运的是,autocomplete插件接受一个函数作为源。您已经在使用它,但不正确。让它接受第二个参数,这是一个回调。来自documentation

      

    第三种变体,即回调,提供了最大的灵活性,可用于将任何数据源连接到自动完成。回调得到两个参数

         
        
    • 一个请求对象,具有一个名为“term”的属性,它引用文本输入中当前的值。例如,当用户在城市字段中输入“new yo”时,自动填充术语将等于“new yo”。

    •   
    • 响应回调,它希望单个参数包含要向用户建议的数据。应根据提供的术语过滤此数据,并且可以采用上述任何简单本地数据格式(String-Array或具有标签/值/两者属性的Object-Array)。在提供自定义源回调以处理请求期间的错误时,这很重要。即使遇到错误,也必须始终调用响应回调。这可确保窗口小部件始终具有正确的状态。

    •   

    所以你需要做的就是将这个回调传递给getLabelsNames,以便可以在Ajax调用的success方法中调用它:

    $('#search').autocomplete({
        source: function(request, callback) {
            // pass the callback along
            search.getLabelsNames(request.term, callback);
        },
        minLength:1
    });
    
    window.search = {
        getLabelsNames:function(search, callback) { // accept callback as argument
            $.ajax({
                url : '../db_scripts/get_labels_names.php',
                type: "POST",
                data: { id: search }, //this defaults to nothing. not a problem
                success : function( data ) {
                    // format the data
                    data = $.map(jQuery.parseJSON(data), function(obj) {
                        return obj.name;
                    });
                    // pass the data to the callback
                    callback(data);
                }
            });
        }
    }
    

    请注意,我在这里使用jQuery.map [docs],其中从回调中返回值具有不同的含义。不要将其与jQuery.each混淆。

答案 1 :(得分:0)

this取决于通话的上下文。在你的内在功能中,this是不一样的。

根据dataObj的结构,您可能需要执行以下操作:

$.each(dataObj, function(key, value) {
                alert(value.name);  // value will correspond to the current item being looped over
                return value.name;
            })

答案 2 :(得分:0)

AJAX调用是异步的,这意味着你触发它们并且它们会稍后响应。你不能简单地从ajax调用中“返回”一个值 - 你需要在“成功”上将值传递给另一个函数。