ajax是异步执行的  要不定时去检查是否执行完毕  要不设置成同步  要不放在回调里试试

解决方案 »

  1.   

    可以使用promise设计模式。
    简单点来说,就是使用jquery中的defferd对象来处理你这个问题。
    在jquery1.5.0之后就引入了defferd对象。
    以下是类似楼主问题的demo,多个请求结果一起处理。$.when( $.ajax( "/page1.php" ), $.ajax( "/page2.php" ) ).done(function( a1, a2 ) {
      // a1 and a2 are arguments resolved for the page1 and page2 ajax requests, respectively.
      // Each argument is an array with the following structure: [ data, statusText, jqXHR ]
      var data = a1[ 0 ] + a2[ 0 ]; // a1[ 0 ] = "Whip", a2[ 0 ] = " It"
      if ( /Whip It/.test( data ) ) {
        alert( "We got what we came for!" );
      }
    });详细请参考:
    http://www.ruanyifeng.com/blog/2011/08/a_detailed_explanation_of_jquery_deferred_object.html
    这个地方介绍了defferd对象的基础。
    http://api.jquery.com/jQuery.when/
    这个地方说明了when的用法,特别适合楼主多个请求数据完成后,一起处理的需求。
      

  2.   

    题目要求:不允许改动已有的js方法,增加一个JS方法,这个JS方法可以判定以上的JS都加载完成(包括AJAX异步请求的执行方法)
      

  3.   

    不過,話說回來,一般正常情況下,異步的如果都執行完了,同步的JS沒有不執行完的道理除了少數情況(setTimeout,setInterval)所以如果沒有特別需求,只需要等所有異步完成,就可以算做所有在頁面加載后需要執行的JS都完成了。至于對異步ajax的偵聽,可以考慮給現有的ajax加個壳,不知道這樣算不算改動現有JS
    var _ajax = $.ajax;
    $.ajax = function(url, data, callback) {
        var id = Math.ceil(Math.random() * 1000000000);     
        $.ajax.queue[id] = id;
        _ajax(url, data, function(d) {
            $.ajax.queue[id] = null;
            delete $.ajax.queue[id];
            callBack(d); 
        });
    }
    $.ajax.queue = {};
      

  4.   

    $.when($.ajax("/page1.php"), $.ajax("/page2.php")).then(myFunc, myFailure);
      

  5.   

    $.when($.ajax("/page1.php"), $.ajax("/page2.php")).then(myFunc, myFailure);楼上改进的结果是正解,myFunc就是楼主要求的增加的一个js方法,myFunc方法会在所有的ajax请求成功后调用,在myFunc函数内部,楼主可以调用已有的函数。
      

  6.   


    楼主的题目要求的结果,很有可能是陷入金字塔厄运的一个陷阱,异步事件驱动模式很大的弊端就是会造成处理逻辑的碎片化,难以书写,难以控制,难以阅读,在这种模式下,再去加判断,基本就是一场灾难。
    promise就是为了解决这个问题而产生的,现在很多都是用这个模式来书写异步代码。
      

  7.   

    楼上的回复很给力。这个方法确实不错,但是不是我想要的那个最终效果,楼上的方法必须要在每个ajax前面加个方法名,并返回这个ajax。这样的话我的工作量就加大了,需要分析每个JS然后改动。然后碰到每一次这样的问题时,我都要更改源码。个人认为这种方法还是有缺陷。
    ----个人想法举例:加个setInterval事件,根据页面加载的效果去针对性的检测某个模块的ID是否完成
    ------代码:setInterval(test,500)
    ------------function test(){
    --------------if($("#id1").val()!=null){
    ------------------写任意方法
    ----------------}
    ------------}
    以上想法虽然可以实现,但需要针对页面效果去分析,我想找个通用的方法,这个方法可以任意在别的页面中调用。