【问题标题】:$(document).ready with jQuery$(document).ready 与 jQuery
【发布时间】:2012-03-13 10:10:49
【问题描述】:

我用 jquery 编码。我的问题是:

<script type="text/javascript">
$(document).ready(function() {
function1();
function2();
});
</script>

有时没有功能起作用,有时功能起作用但它们没有按顺序工作! 功能1:

function getnameCategories1()
{

    var request = new XMLHttpRequest();
    if(i<idCategories.length)
        {
            request.open("GET","http://patisserie-orient.fr/prestashop/prestashop/api/categories/"+idCategories[i]+"?PHP_AUTH_USER="+PHP_AUTH_USER+"&ws_key="+ws_key,true);

            request.onreadystatechange = function()
                {
                    if(request.readyState==4)
                    {
                        //alert("Status2 is  "+request.status);
                        if (request.status == 200 || request.status == 0)
                        {
                            response1  = request.responseXML.documentElement;
                            nameCategories[i] = response1.getElementsByTagName('language')[0].firstChild.data;
                            //alert(nameCategories[i]);
                            $('#im'+i).html(nameCategories[i]);
                            $('#a'+i).show();
                            i++;


                         }
                     }
                }

            request.send();

        }   
    else
        {
            return;
        }

}

函数2:

function getCategories()
{

    var request = new XMLHttpRequest();

    request.open("GET","http://patisserie-orient.fr/prestashop/prestashop/api/categories?PHP_AUTH_USER="+PHP_AUTH_USER+"&ws_key="+ws_key,true);
    request.onreadystatechange = function()
    {
        if(request.readyState==4)
        {
            //alert("Status is:  "+request.status);
            if (request.status == 200 || request.status == 0)
            {
                response  = request.responseXML.documentElement;
                i=0;
                while(response.getElementsByTagName('category')[i]!=undefined)
                    {
                        idCategories[i]=response.getElementsByTagName('category')[i].getAttribute('id') ;
                        //alert(idCategories[i]);
                        i=i+1;
                    }

             }
         }

    }
    request.send();
}

有时即使只是 $(document).ready 中的警告也不起作用

【问题讨论】:

  • 奇怪...你能发布一个发生这种情况的代码示例吗?
  • 代码没问题,所以问题应该在你内部function1function2。在旁注中,您应该接受一些问题的答案,这里的人就是这样。
  • function1 和 function2 中实际发生了什么?如果 function1 和 function2 正在执行异步请求(例如 XHR 请求),那么结果将不会以相同的顺序返回。
  • 这两个函数在一个单独的js中,我先调用了js,然后调用了$(document).ready,但是还是不行。这两个函数是正确的,因为当我从按钮调用它们时,它们运行良好
  • 是的@Geuis这两个函数正在执行XHR,那该怎么办?我只是将异步请求更改为同步请求?

标签: jquery


【解决方案1】:

除非您在函数中使用ajaxsetTimeout,否则它们应该按照您放置它们的顺序播放。

$(document).ready 只会在调用您的函数之前等待 DOM 就绪。

如果您想了解更多信息,请提供非工作代码示例。

【讨论】:

  • 这两个函数在一个单独的js中,我先调用js,然后调用$(document).ready,但是不起作用。这两个函数是正确的,因为当我从按钮调用它们时,它们运行良好
【解决方案2】:

jQuery 非常棒,因为每个异步请求都会作为 Deferred 对象返回。一旦你掌握了它们的窍门(它们很简单),你就再也不会以同样的方式编写异步请求了。

http://api.jquery.com/category/deferred-object/

简而言之,如果你说:

var x = $.get('/some_url', function(){ //your callback });

x 现在是一个 Deferred 对象。当您的请求完成时,大多数情况下是 .done() 或 .fail()。

你也可以这样做:

var x = $.get('/some_url'); x.done(function(){ //你的回调 });

有一个非常棒的实用程序,叫做 .when()。仔细阅读,这是您所需要的。

【讨论】:

    【解决方案3】:

    正如 Michael Laffargue 所说,除非您使用某种 AJAX 请求,或者在 setTimeout 内执行某些操作,否则您的函数应该以正确的顺序调用。

    请记住,jQuery 存在 DOM 状态和 iframe 的错误(查看参考:http://bugs.jquery.com/ticket/10067)。

    最好的办法是将 .ready() 回调函数绑定到 DOM,而不是在 iframe 中进行。

    另外,请记住,您可以绑定多个 .ready() 回调。 示例:

    $(document).ready(
      function(){
        console.log("Hello");
      }
    )
    
    $(document).ready(
      function(){
        console.log("world");
      }
    )
    

    也许你以错误的顺序绑定你的函数?

    问候

    【讨论】:

      【解决方案4】:

      这可能不是你的问题,但可能值得一试。

      我知道在使用 asp.net updatePanels 时,您需要使用function pageLoad() { // } 而不是$(document).ready( function() { // });

      它有其局限性,因为您只能在页面上包含一个 function pageLoad()

      所以在你的情况下:

      function pageLoad() {
      function1();
      function2();
      };
      

      【讨论】:

        【解决方案5】:

        您应该等待请求状态 (request.readyState == 4) ,然后调用 function2()。

        if(request.readyState==4)
        {
            //alert("Status2 is  "+request.status);
            if (request.status == 200 || request.status == 0)
            {
                response1  = request.responseXML.documentElement;
                nameCategories[i] = response1.getElementsByTagName('language')[0].firstChild.data;
                //alert(nameCategories[i]);
                $('#im'+i).html(nameCategories[i]);
                $('#a'+i).show();
                i++; 
        
        
             }
           function2();
         }
        

        【讨论】:

        • 我更喜欢 Geuis 他的回答。
        猜你喜欢
        • 2010-12-11
        • 2011-04-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-20
        • 2011-04-07
        • 2013-07-19
        相关资源
        最近更新 更多