【问题标题】:Blocking UI on document ready在文档就绪时阻止 UI
【发布时间】:2016-09-15 22:26:04
【问题描述】:

我正在开发一个需要与 Internet Explorer 8 兼容的网络应用程序(你知道,与 HELL 兼容)。问题是我正在上传一个文件,该文件稍后由 PHP 代码处理并刷新页面。当我有一个处理过的文件时,我使用该文件将数据插入到表中,因此我需要一个进程栏并在插入此数据时阻止 UI(我需要为每一行调用另一个 PHP 进程)

问题是下一个,我想阻止那个 UI,我已经解决了逻辑和所有兼容性问题;但工作 5 天后,我无法阻止 UI。这是一个最小的代码(封装了我们需要的所有东西),以简化想法:

    $(document).ready({
    (...)
        $("#title").html('some text');
        $("#bar").html('');
        $.blockUI({message: $('#window'),css:{width:'303px'}});
        go = true;
        while (go){
            $.ajax({<ASYNC FALSE AJAX CALL});
            if (!file.lines) go = false;
            <update progress>
        }

        $.unblockUI();
    (...)
    });

显然,$.blockUI 应该阻塞主线程(直到我解除阻塞)并显示一个个性化的窗口,下面的代码是:

<div id="window" style="display: none; cursor: default">
    <div id="title_bar">
        <div id="titulos">some text</div>
        <div id="cerrar"></div>
    </div>
    <div id="body">
        <img src="an icon"
            alt="enviando" border="0" width="33" height="33" id="enviar">
        <p class="titulo" id='title'></p>
        <p class="texto" id='bar'></p>
        <br />
    </div>
</div>

我认为问题在于我在一个不是主线程的线程上执行该块,并且我不能真正阻塞 UI;但我需要那个块,因为我必须强制用户等到我处理完所有信息。

谢谢大家,希望你们能帮我解决这个问题。

【问题讨论】:

  • 尝试删除async: false。使用它是非常糟糕的做法,这意味着您的 UI 不会更新,这会干扰您正在使用的 blockUI 插件。
  • 您遇到的任何错误。或者你有小提琴吗?
  • 我无法删除async: false,我知道这是一种不好的做法,但我需要在这段代码@RoryMcCrossan 上使用它。我没有任何错误,开发者控制台显示了关于 async: false 的典型警告。
  • 我 99% 确定在没有 async: false 的情况下还有另一种方法可以满足您的要求,而且我也很确定这就是您的问题的原因。
  • @RoryMcCrossan 我刚刚尝试使用async: true 删除while 条件(如果我在它阻止浏览器时离开了它)但仍然无法正常工作。

标签: javascript php jquery html web


【解决方案1】:

我认为主要是因为同步,但如果你让它异步,你需要在你的代码中进行更改。删除 while-loop 并调用一个函数,该函数将进行异步调用,并在成功完成后递归调用相同的函数。满足终端条件后,按如下方式解除对 UI 的阻止:

 $.blockUI({message: $('#window'),css:{width:'303px'}});
 //  based on the above code I assume you will get file as a response.
 process();

 function process(file){
     if (file && !file.lines){
         $.unblockUI();
     }

     $.ajax({<ASYNC TRUE AJAX CALL})
      .done(function(file){                   
               <update progress>
               process(file);
          });
 }

【讨论】:

  • 嗯,非常感谢。那是一个完美的主意。我没有考虑递归函数。所以现在它工作正常。谢谢!!!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-04
  • 2012-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多