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

问题描述 投票:1回答:3
$("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回调的结果(将其放入选项,全局变量中)粘贴到首先激活事件的对象的同级中。我上面的代码几乎可以成功完成此操作,但是由于回调不会立即发生,因此无法正常工作,因此它在兄弟姐妹中留了空白字符串。在此先感谢您,如果我在这里输入的术语有误,请谅解:)

jquery ajax json callback
3个回答
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
投票

为什么不将$(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);
        }
      );
    }
  );

EDIT:添加了备用代码。


0
投票

JQuery对于ajax有一些问题,主要是当您想“仅在请求完成时”触发函数时。发布,获取,直播等问题。唯一有效的方法是全局$ .ajax,我建议您使用。

© www.soinside.com 2019 - 2024. All rights reserved.