jQuery:发出json请求,在回调中处理它,在回调函数之外访问它?

时间:2009-09-27 01:41:17

标签: jquery ajax json callback

$("select[name=field[]]").live("change", function() {
            $.getJSON("/json.php",{id: $(this).val(), ajax: 'true'}, function(j){
                options = '';
                for (var i = 0; i < j.length; i++) {
                    options += '<option value="' + j[i].optionValue + '">' + j[i].optionDisplay + '</option>';
                }
            });
            $(this).siblings("[name=logic[]]").html(options);
        });

所以,我想把json回调的结果(它放在选项中,一个全局变量)粘贴到首先激活事件的对象的兄弟中。我上面的代码几乎成功了,但是不能正常工作,因为回调不会立即发生,因此它会在兄弟中添加一个空白字符串。如果我在那里有任何错误的话,请提前致谢并抱歉:)

3 个答案:

答案 0 :(得分:2)

我认为你正在向后看。您可以更轻松地使外部变量可用于内部函数。这是个主意:

$("select[name=field[]]").live("change", function() {
    var theSelect = $(this);
    $.getJSON("/json.php",{id: $(this).val(), ajax: 'true'}, function(j){
        options = '';
            for (var i = 0; i < j.length; i++) {
                   options += '<option value="' + j[i].optionValue + '">' + j[i].optionDisplay + '</option>';
            }
            theSelect.siblings("[name=logic[]]").html(options);
            });
    });

我也有顾虑。您似乎正在尝试将选项添加到触发事件的选择中。他们是孩子,而不是兄弟姐妹。他们拥有它,这将为每个选择添加选项,这些选择是事件源的兄弟。如果我的假设是正确的,你可以在你的内部for循环中做这样的事情,而不是构建一个巨大的HTML字符串:

$('<option>blah blah</option>').appendTo(theSelect);

答案 1 :(得分:1)

为什么不将$(this).siblings("[name=logic[]]").html(options);行放在回调本身中?最好的地方似乎是在for循环完成后立即。

  $("select[name=field[]]")
  .live
  (
    "change", 
    function() {
      var selectElem = $(this);
      $.getJSON
      (
        "/json.php",
        {id: $(this).val(), ajax: 'true'}, 
        function(j) {
          options = '';
          for (var i = 0; i < j.length; i++) {
            options += '<option value="' + 
                       j[i].optionValue + '">' + 
                       j[i].optionDisplay + 
                       '</option>';
          }

          selectElem.siblings("[name=logic[]]").html(options);
        }
      );
    }
  );

编辑:添加了替代代码。

答案 2 :(得分:0)

JQuery在ajax方面存在一些问题,主要是当你想“仅在请求完成时”触发函数时。发布,获取,生活等,有这些问题。唯一一个正常工作的是全球$ .ajax,我建议你使用它。