4

对于循环的每次迭代,我将如何更改 h1?此代码现在仅在完成所有操作后显示 h1 文本。

for (i=0; i<array.length; i++) {
  $("body > h1").text("Processing #" + i);
  // things that take a while to do
}

附加信息:如果我在循环时调整窗口大小,则 html 会更新。

4

5 回答 5

7
var array = ['one', 'two', 'three']
var i = 0;

var refreshIntervalId = setInterval(function() {
    length = array.length;
    if (i < (array.length +1)) {
        $("h1").text("Processing #" + i);
    } else {
        clearInterval(refreshIntervalId);
    }
    i++     
}, 1000);

http://jsfiddle.net/3fj9E/

于 2013-02-27T22:29:48.910 回答
4

使用setInterval具有一毫秒延迟的 a:

var i=0, j=array.length;
var iv = setInterval(function() {
    $("h1").text("Processing #" + i);
    // things that take a while to do
    if (++i>=j) clearInterval(iv);
}, 1);

http://jsfiddle.net/mblase75/sP9p7/

于 2013-02-27T22:35:54.170 回答
1

有时您可以通过强制重新计算布局来强制渲染

for (i=0; i<array.length; i++) {
  $("body > h1").text("Processing #" + i)
      .width();  // force browser to recalculate layout
  // things that take a while to do
}

它可能不适用于所有浏览器。

一种更好的方法,它不会过多地阻止浏览器:

function doThings(array) {
   var queueWork,
       i = -1,
       work = function () {
          // do work for array[i]
          // ...
          queueWork();
       };

   queueWork = function () {
       if (++i < array.length) {
          $("body > h1").text("Processing #" + i);
          setTimeout(work, 0); // yield to browser
       }
   };
}


doThings(yourArray);
于 2013-02-27T22:21:10.430 回答
0

演示

我花了一些时间来开发一个似乎可以解决这个问题的 jquery 函数。基本上,它是一个进程处理程序,您可以add访问任意数量的进程,然后调用run它以异步方式顺序调用这些进程。

$.fn.LongProcess = function () {
    var _this = this;
    this.notifications = [];
    this.actions = [];

    this.add = function (_notification, _action) {
        this.notifications.push(_notification);
        this.actions.push(_action);
    };
    this.run = function () {

        if (!_this.actions && !_this.notifications) {
            return "Empty";
        }
        //******************************************************************
        //This section makes the actions lag one step behind the notifications.
        var notification = null;
        if (_this.notifications.length > 0) notification = _this.notifications.shift();

        var action = null;
        if ((_this.actions.length >= _this.notifications.length + 2) || (_this.actions.length > 0 && _this.notifications.length == 0)) 
            action = _this.actions.shift();
        //****************************************************************
        if (!action && !notification) {
            return "Completed";
        }

        if (action) action();        
        if (notification) notification();

        setTimeout(_this.run, 1000); 
        //setTimeout(_this.run,1); //set to 1 after you've entered your actual long running process. The 1000 is there to just show the delay.
    }
    return this;
};

如何使用<h1 class="processStatus"></h1>

$(function () {
    var process = $().LongProcess();

    //process.add(notification function, action function);
    process.add(function () {
        $(".processStatus").text("process1");
    }, function () {
        //..long process stuff
        alert("long process 1");
    });

    process.add(function () {
        $(".processStatus").text("process2");
    }, function () {
        //..long process stuff
        alert("long process 2");
    });

    process.add(function () {
        $(".processStatus").text("process3");
    }, function () {
        //..long process stuff
        alert("long process 3");
    });

    process.run();
});
于 2013-02-28T17:20:28.180 回答
0

如果过程很长,您可以使用此脚本显示特定时间间隔的每个通知。

这是代码..

html

<div id="ccNotificationBox"></div>

css

#ccNotificationBox{
 -webkit-animation-name:;
 -webkit-animation-duration:2s;/*Notification duration*/
 box-sizing:border-box;
 border-radius:16px;
 padding:16px;
 background-color:rgba(0,0,0,0.7);
 top:-100%;
 right:16px;
 position:fixed;
 color:#fff;
}
#ccNotificationBox.active{
 -webkit-animation-name:note;
 top:16px;
}
@-webkit-keyframes note{
0%   {opacity:0;}
20%  {opacity:1;}
80%  {opacity:1;}
100% {opacity:0;}
}

javascript

var coccoNotification=(function(){
var
nA=[],
nB,
rdy=true;
function nP(a){
 nA.push(a);
 !rdy||(nR(),rdy=false);
}
function nR(){
 nB.innerHTML=nA[0];console.log(nA[0]);
 nB.offsetWidth=nB.offsetWidth;//reflow ios
 nB.classList.add('active');
}
function nC(){
 nB.classList.remove('active');
 nB.innerHTML='';
 nA.shift();
 nA.length>0?nR():(rdy=true);
}
function init(){
 nB=document.getElementById('ccNotificationBox');
 nB.addEventListener('webkitAnimationEnd',nC,false);
 window.removeEventListener('load',init,false);
}
window.addEventListener('load',init,false);
return nP
})();

用法

coccoNotification('notification 1');

例子

http://jsfiddle.net/f6dkE/1/

信息

上面的示例非常适合外部 js,因为您只使用一个全局变量,它是函数的名称......在我的例子中coccoNotification

这是一种不同的方法,但它的作用相同

http://jsfiddle.net/ZXL4q/11/

于 2013-11-22T15:50:35.283 回答