当来自Ajax调用的div内容访问问题

时间:2020-03-05 18:56:42  来源:igfitidea点击:

这是一个非常简单的原型示例。

它所做的只是在窗口加载时进行的ajax调用,该调用将一些html粘贴到div中。

<html>
    <head>
        <script type="text/javascript" src="scriptaculous/lib/prototype.js"></script>
        <script type="text/javascript">
            Event.observe(window, 'load', function(){
                new Ajax.Request('get-table.php', {
                    method:  'get',
                    onSuccess:  function(response){
                        $('content').innerHTML = response.responseText;
                        //At this call, the div has HTML in it
                        click1();
                    },
                    onFailure:  function(){
                        alert('Fail!');
                    }
                });
                //At this call, the div is empty
                click1();
            });

            function click1(){if($('content').innerHTML){alert('Found content');}else{alert('Empty div');}}
        </script>
    </head>
    <body><div id="content"></div></body>
</html>

令人困惑的是Prototype理解div实际上包含东西的上下文。

如果查看ajax调用的onSuccess部分,我们将看到此时$('content')。innerHTML中包含内容。

但是,当我在ajax调用后立即检查$('content')。innerHTML时,它似乎为空。

就我而言,这一定是一些基本的误解。有人愿意向我解释吗?

编辑
我只想澄清一些事情。我意识到Ajax调用是异步的。

这是事情执行的实际顺序,以及为什么让我感到困惑:

  • 页面加载。
  • 发出了对get-table.php的Ajax请求。
  • 发生对onSuccess内部的click1()的调用。我看到div有内容的警报。
  • 在Ajax调用之后发生对click1()的调用。我看到一个警报,指出div为空。

因此,就像代码按编写的顺序执行,但DOM的更新顺序不同。

编辑2
因此,简短的答案是将代码放入onSuccess是正确的位置。

要考虑的另一种情况是,先执行Ajax调用,然后从第一个调用的onSuccess进行另一个Ajax调用,如下所示:

new Ajax.Request('foo.php',{
  method:  'get',
  onSuccess:  function(response){
    doAnotherAjaxCall();
  }
  });

function doAnotherAjaxCall(){
  new Ajax.Request('foo.php',{
    method:  'get',
    onSuccess:  function(response){
      //Anything that needs to happen AFTER the call to doAnotherAjaxCall() above
      //needs to happen here!
    }
  });
}

});

解决方案

回答

AJAX的首字母代表"异步"。这意味着AJAX调用是在后台执行的,即AJAX请求调用立即返回。这意味着紧随其后的代码通常在onSuccess处理程序被调用之前(甚至在AJAX请求完成之前)实际执行。

考虑到我们编辑后的问题:在某些浏览器(例如Firefox)中,警报框没有我们想象的那样模态。即使已经打开了另一个异步代码,异步代码也可能会弹出一个警告框。在这种情况下,较新的警报框(来自异步代码的一个)将显示在较旧的警报框的顶部。这产生了先执行异步代码的错觉。

回答

无需尝试代码:AJAX调用是异步执行的。这意味着Ajax.Request将被触发,然后继续执行click1()调用,该操作将告诉我们div为空。在此之后的某个时刻,Ajax请求完成,并且内容实际上已放入div中。此时,将执行onSuccess函数,我们将获得所需的内容。

回答

这是Ajax调用,它是异步的。这意味着在该请求调用之后,响应尚未返回,这就是为什么$('content')仍然为空。

回答

在收到get-table.php的响应时,将执行要处理AJAX调用的函数调用的onSuccess元素。这是一个单独的Javascript函数,当我们从get-table.php获得答案时,它告诉浏览器进行调用。 AJAX.Request调用之后的AJAX.Request调用下面的代码将被访问,但不一定在调用get-table.php之前被访问。因此,是的,我认为对于AJAX的工作方式存在一些根本性的误解,可能是由于使用了一个库来隐藏细节。