Javascript 如果我添加“警报”,则会发生无法解释的更改

Javascript 如果我添加“警报”,则会发生无法解释的更改,javascript,synchronization,alert,Javascript,Synchronization,Alert,请在此问题上提供帮助: 在循环中,我首先调用一个函数,该函数将更改DIV的内容,然后尝试显示新内容。守则简介如下: while (...){ fetch(website_url); // alert("useless"); x=document.getElementById("prova").textContent; alert(x); } Fetch是一个使用jQuery打开指定URL并将内容粘贴到DIV prova中的函数。是否查看已评论的警报?如果我对它进行了注

请在此问题上提供帮助: 在循环中,我首先调用一个函数,该函数将更改DIV的内容,然后尝试显示新内容。守则简介如下:

while (...){
    fetch(website_url);
//  alert("useless");
    x=document.getElementById("prova").textContent;
    alert(x);
}
Fetch是一个使用jQuery打开指定URL并将内容粘贴到DIV prova中的函数。是否查看已评论的警报?如果我对它进行了注释,那么提取工作将非常完美。我在浏览器窗口中看到了提取的代码,但第二个警报没有!它显示先前的DIV内容,即第一次为空时,第二次迭代将显示第一次迭代的内容,等等。。。。 但是,如果我取消对第一个警报的注释,第二个警报可以正常工作。 很明显,这看起来像是一个同步问题,但我已经尝试了很多方法,例如超时、ifs。。我还没能解决这个问题。有什么建议吗

这是fetch函数实际上它不是我的。。。我只是在学习如何使用它

function fetch(url){
  container = $('#prova');
  doAjax(url);

  function doAjax(url){
    $.getJSON("http://query.yahooapis.com/v1/public /yql?"+"q=select%20*%20from%20html%20where%20url%3D%22"+encodeURIComponent(url)+"%22&format=xml'&callback=?",
function(data){
    if(data.results[0]){
      var data = filterData(data.results[0]);
      container.html(data);
    } else {
      var errormsg = '<p>Error: could not load the page.</p>';
      container.html(errormsg);
    }
  }
}

听起来你好像还不明白什么是异步通信或者它是如何工作的。在代码中,当执行此行时:

x=document.getElementById("prova").textContent;
ajax调用获取仍在运行。通过将无用的警报放在适当的位置,ajax调用就有时间完成了,因为下面的一行将等待您在执行之前单击ok

要解决此问题,您有两种可能:

将请求更改为同步,但这几乎每次都是一个坏主意 使用ajax请求的成功回调来执行应该等待请求完成的代码
编辑:您还没有发布用于获取的代码,因此推测您正在使用jquerys的一些ajax函数。。。发布完整的代码会很好。

此代码取决于时间。第一个警报将创建一个延迟,在此期间提取完成

您要做的是将jQueryAjax与回调一起使用,例如

$.get('ajax/test.html', function(data) {
  $('.result').html(data);
  alert('Load was performed.');
});

请参见

您似乎完全忽略了这里的AJAX:您正在向Yahoo发出异步页面请求,这意味着您设置了发出请求的浏览器,然后在等待时继续处理脚本。这就是全部目的

设置调用后,响应文本不会立即可用,但在您添加警报时,您正在添加一个依赖于人的延迟,在您的情况下,该延迟恰好足够长,异步请求可以返回

您可以使AJAX请求同步AJAX,因为异步Javascript和XML用词不当,最好称为XmlHttpRequest:

现在,在代码继续之前,请求将完成或失败

或者,如果要保留异步请求,可以将完成后要执行的代码移动到回调函数中:

while (...) {
    function myFunction() {
        var x = document.getElementById("prova").textContent;
        alert(x);
    }
    fetch_and_handle(website_url, myFunction);
}

function fetch_and_handle(url, handler) {
    var container = $('#prova');
    var url       = "http://query.yahooapis.com/v1/public /yql?"+"q=select%20*%20from%20html%20where%20url%3D%22"+encodeURIComponent(url)+"%22&format=xml'&callback=?";

    $.getJSON(url, function(data) {
       if (data.results[0]) {
          var data = filterData(data.results[0]);
          container.html(data);

          if (handler != undefined) {
              handler();
          }
       }
       else {
          var errormsg = '<p>Error: could not load the page.</p>';
          container.html(errormsg);
       }
   });
}

我还在一些地方添加了var:当您创建一个局部变量时,使用var。我修复了一些缩进。

提取是什么样子的?根据描述,我怀疑它是jQuery.load或相关的风格之一,但我同意,看到提取实现会很有帮助。我还不太擅长Ajax,但这也是我的猜测。我曾尝试在Javascript代码中使用其他循环和延迟来实现相同的结果,但没有成功。我试试你的建议。谢谢,你走对了。在回调函数data{}实现中添加您希望随后执行的代码。感谢您的帮助。如何使我的请求同步?我对Ajax还不太了解。请看文档:-有一个名为async的选项必须设置为false默认值为true。但是:你真的,真的,真的,真的不应该这样做。请使用回调。尤其是当你不知道自己在做什么的时候。请不要用逗号来写代码,读到这篇文章会很恐怖。编辑您的初始问题并附加该信息。非常感谢。我仍然对回调函数没有信心,但现在情况更好了。如果我理解正确,我需要对获取的内容执行的所有进一步的数据操作都必须嵌套在回调函数中或由回调函数调用,即代替警报。。。对的
while (...) {
    function myFunction() {
        var x = document.getElementById("prova").textContent;
        alert(x);
    }
    fetch_and_handle(website_url, myFunction);
}

function fetch_and_handle(url, handler) {
    var container = $('#prova');
    var url       = "http://query.yahooapis.com/v1/public /yql?"+"q=select%20*%20from%20html%20where%20url%3D%22"+encodeURIComponent(url)+"%22&format=xml'&callback=?";

    $.getJSON(url, function(data) {
       if (data.results[0]) {
          var data = filterData(data.results[0]);
          container.html(data);

          if (handler != undefined) {
              handler();
          }
       }
       else {
          var errormsg = '<p>Error: could not load the page.</p>';
          container.html(errormsg);
       }
   });
}