非常奇怪的jQuery / AJAX行为

时间:2012-04-07 17:24:04

标签: javascript jquery ajax alert

我对服务器进行了Ajax调用,只有在我向alert();传递时才会有效。无法弄清楚出了什么问题。有人可以帮忙吗?

目标

  1. 如果在PrettyPhoto iFrame中单击“更新”按钮 - 则(a)调用服务器以运行更新后端数据库的PHP脚本,(b)关闭PrettyPhoto窗口,以及(c)刷新页面
  2. 如果在PrettyPhoto iFrame中单击“不更新”按钮 - 只需(a)关闭PrettyPhoto窗口,(b)刷新页面
  3. 这不起作用(即,无法对服务器进行Ajax调用):

    jQuery.support.cors = true; // needed for ajax to work in certain older browsers and versions
    
    $('input[name="status"]').on("change", function() {
    
        if ($('input:radio[name="status"]:checked').val() == 'Y') {
    
            $.ajax({
                url: 'http://mydomain.com/dir/myPHPscript.php?param=' + $('#param').val() + '&id=' + ( $('#id').val() * 1 ) + '&mode=' + $('#mode').val()
            });
    
        }
    
        window.parent.closePP();
    
        window.top.location.href = $('#redirect').val();    // reloads page
    
    });
    

    这个作品! (即,当我有alert()时,Ajax对服务器的调用会被激活):

    jQuery.support.cors = true; // needed for ajax to work in certain older browsers and versions
    
    $('input[name="status"]').on("change", function() {
    
        if ($('input:radio[name="status"]:checked').val() == 'Y') {
    
            $.ajax({
                url: 'http://mydomain.com/dir/myPHPscript.php?param=' + $('#param').val() + '&id=' + ( $('#id').val() * 1 ) + '&mode=' + $('#mode').val()
            });
    
            alert('this makes it work');
    
        }
    
        window.parent.closePP();
    
        window.top.location.href = $('#redirect').val();    // reloads page
    
    });
    

    感谢。

    根据答案做了大量修改 - 仍然无法让它发挥作用。这是最新的:

    jQuery.support.cors = true; // needed for ajax to work in certain older browsers and versions
    
    $('input[name="status"]').on("change", function() {
    
    if ($('input:radio[name="status"]:checked').val() == 'Y') {
    
        $.ajax({
            url: 'http://mydomain.com/dir/myPHPscript.php?param=' + $('#param').val() + '&id=' + ( $('#id').val() * 1 ) + '&mode=' + $('#mode').val(),
            success: functions(data) {var $doNothing = data;}
        });
    
    }
    
    window.parent.closePP();
    window.top.location.href = $('#redirect').val();    // reloads page
    
    });
    

3 个答案:

答案 0 :(得分:2)

您需要在Ajax回调中完成剩下的工作

请参阅jquery ajax

$('input[name="status"]').on("change", function() {
    if ($('input:radio[name="status"]:checked').val() == 'Y') {
        $.ajax({
            url: 'http://mydomain.com/dir/myPHPscript.php?param=' + $('#param').val() + '&id=' + ( $('#id').val() * 1 ) + '&mode=' + $('#mode').val()
        },
        success:function() {
          window.parent.closePP();
          window.top.location.href = $('#redirect').val();    // reloads page
        });
     }
     else {
          window.parent.closePP();
     }
 });

您也可以获取数据:

$('input[name="status"]').on("change", function() {
    if ($('input:radio[name="status"]:checked').val() == 'Y') {
        $.get('http://mydomain.com/dir/myPHPscript.php?param=' + $('#param').val() + '&id=' + ( $('#id').val() * 1 ) + '&mode=' + $('#mode').val(), 
         function() {
          window.parent.closePP();
          window.top.location.href = $('#redirect').val();    // reloads page
        });
     }
     else {
          window.parent.closePP();
     }
 });

答案 1 :(得分:2)

AJAX是异步的。 $.ajax()调用将向服务器发起请求,然后即使请求在飞行中返回服务器,脚本的其余部分也将继续执行。

alert()用于“减慢”/暂停其余代码,允许完成ajax请求。

您需要做的是:

$.ajax({
    url: '....';
    success: someFunction;
});

当ajax调用成功时,它会调用someFunction(),这是你做.location.href的东西。

答案 2 :(得分:1)

你可以试试这个:

$('input[name="status"]').on("change", function() {

    if ($('input:radio[name="status"]:checked').val() == 'Y') {

       $.ajax({
          url: '....',
          success: function(data) {
                    window.parent.closePP();
                    window.top.location.href = $('#redirect').val();  
                   }
       });      

    }
    else{

       window.parent.closePP();

       window.top.location.href = $('#redirect').val();    // reloads page
    }
});