javascript-js延迟顺序执行的问题

问题描述

js延迟顺序执行的问题

现在项目中遇到一个问题。就是在前台页面顺序延迟显示后台发送的数据。
比如前台是一个表格,点击前台按钮后,一次获得table上该显示的所有随机序号。
目前的问题不能让这些选择的序号顺序延迟显示。
这个问题类似于在表格中随机点名。
代码不完整:

<table>
   <tr><td>11</td><td>12</td><td>13</td><td>14</td></tr>
   <tr><td>21</td><td>22</td><td>23</td><td>24</td></tr>
   <tr><td>31</td><td>32</td><td>33</td><td>34</td></tr>
   <tr><td>41</td><td>42</td><td>43</td><td>44</td></tr>
</table>
<input type="button" value="顺序延迟加载" id="btnRun" />
<script>
   $(function(){
       $("#btnRun").click(function(){
           // rndArray假如是产生的一个瞬间顺序数组,用来控制表格的td变色
           var rndArray=[3,7,11,1,12,15];
           for(var i=0;i<rndArray.length;i++){
               setTimeout(function(){
                   $("table td").eq(i).addClass("test1").siblings().removeClass("test1");
               },1000);
           }
       })
   });
</script>

今天查阅了一下js是单线程执行的,setTimeout("code()",delay)是在delay后将code插入到代码中。
因此这样肯定无法实现我要的功能。不知道有什么好方法可以实现这个功能,
以前在学习视频的时候看到过这个表格随机点名的效果。

求大神指点该怎么弄。

解决方案

递增那个时间间隔不可以吗?
虽然不够精确。

for(var i=0;i<rndArray.length;i++){
    setTimeout(function(){
        $("table td").eq(i).addClass("test1").siblings().removeClass("test1");
    },1000*(i+1));
}

想要精确,就只有递归加回调了。

解决方案二:

谢谢大家帮忙想办法,昨天搜了很多方法,综合各种,最后找到一种可行的是。ajax同步调用,前台等待后台返回,后台线程sleep。这样可以解决,但希望还有更好的方法。

解决方案三:

本质应该是循环遍历发生了js的一个bug。解决办法看下面的例子。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
    <HEAD>
        <TITLE> 简单实验 </TITLE>
        <META NAME="Generator" CONTENT="EditPlus">
            <META NAME="Author" CONTENT="">
                <META NAME="Keywords" CONTENT="">
                    <META NAME="Description" CONTENT="">
                        <script type="text/javascript" src="jquery.js"></script>
    </HEAD>

    <BODY>

        页面报错的话,修改js路径<br/>
        <table border="1">
            <tr>
                <td>11</td>
                <td>12</td>
                <td>13</td>
                <td>14</td>
            </tr>
            <tr>
                <td>21</td>
                <td>22</td>
                <td>23</td>
                <td>24</td>
            </tr>
            <tr>
                <td>31</td>
                <td>32</td>
                <td>33</td>
                <td>34</td>
            </tr>
            <tr>
                <td>41</td>
                <td>42</td>
                <td>43</td>
                <td>44</td>
            </tr>
        </table>
        <input type="button" value="顺序延迟加载" id="btnRun" />
        <script>

           $(function(){
               $("#btnRun").click(function(){
                   // rndArray ,从0开始, 第0个为red,第5个为green,第10个为tomato,地15个为hotpink
                   var rndArray=[0,5,10,15];
                   var colorArray=['red','green','tomato','hotpink'];
                   $("#btnRun").attr('disabled',true);
                   for(var i=0;i<rndArray.length;i++){
                       setTimeout(function(i2){
                            var _i = rndArray[i2];
                            return function(){
                               $("table td").eq(_i).css('background-color', colorArray[i2]);
                            };
                       }(i),1000);
                   }
               })
           });

        </script>
    </BODY>
</HTML>

解决方案四:

很典型的问题,循环遍历问题。

解决方案五:

上面的内容不是你全部的需求吗?

setTimeout("code()",delay)是在delay后将code插入到代码中

这句不是很懂。

----- 递增那个时间间隔的做法如下。

var rndArray = [ 3, 7, 11, 1, 12, 15 ];
function chageColor(index) {
    console.log(index);
    $("table td").eq(index).addClass("test1");
}
$("#btnRun").click(function() {
    for ( var i = 0; i < rndArray.length; i++) {
        setTimeout("chageColor(" + rndArray[i] + ")", 1000 * (i + 1));
    }
});

---- 递归回调的做法。处理一个TD后,调用回调。而回调是层层嵌套,以实现每个处理结束后继续下个。

var rndArray = [ 3, 7, 11, 1, 12, 15 ];
function chageColor2(index, callback) {
    console.log(index);
    $("table td").eq(index).addClass("test2");
    if (callback) {
        setTimeout(callback, 1000);
    }
}
$("#btnRun").click(function() {
    var f = false;
    $(rndArray.reverse()).each(function(i, v) {
        f = (function(index, callback) {
            return function() {
                chageColor2(index, callback);
            };
        })(v, f);
    });
    f();
});
时间: 2024-11-03 20:09:56

javascript-js延迟顺序执行的问题的相关文章

js并行加载,顺序执行

<script>运行脚本或加载外部文件时,会阻塞页面渲染,阻塞其他资源的加载.如果页面中需要加载多个js文件,在古老浏览器中性能会比较糟糕. 因此有了最原始的优化原则:把脚本放在底部. 如何实现js非阻塞.并行加载,甚至能保持执行顺序呢?各浏览器表现如何?站在巨人的肩膀上,Kyle Simpson.Nicholas C. Zakas和Steve Souders对此有过总结和方案. 背景 1. Script DOM Element. 动态插入<script>,不会阻塞,但无法保持执行

js加载js文件并行加载与顺序执行

javaScript文件(下面简称脚本文件)需要被HTML文件引用才能在浏览器中运行.在HTML文件中可以通过不同的方式来引用脚本文件,我们需要关注的是,这些方式的具体实现和这些方式可能会带来的性能问题. 当浏览器遇到(内嵌)<script>标签时,当前浏览器无从获知javaScript是否会修改页面内容.因此,这时浏览器会停止处理页面,先执行javaScript代码,然后再继续解析和渲染页面.同样的情况也发生在使用 src 属性加在javaScript的过程中(即外链 javaScript)

JS 多方法执行顺序(跪求大神)

问题描述 JS 多方法执行顺序(跪求大神) JS里面有两个方法,必须保证第一个方法执行完成再执行第二个方法,但是第一个方法的执行时间不确定(是一个时间插件.无返回值),第二个方法是Ajax,请问如何保证第一个方法必须执行且执行完成后执行第二个方法. 解决方案 第一个方法搞一个回调callback,让它执行完后调用第二个方法

解析页面加载与js函数的执行

 这篇文章主要介绍了页面加载与js函数的执行 onload or ready 需要的朋友可以过来参考下,希望对大家有所帮助 首先,页面加载顺序: 解析HTML结构. 加载外部脚本和样式表文件. 解析并执行脚本代码. 构造HTML DOM模型. 加载图片等外部文件. 页面加载完毕.   也就是: html → head → title → #text(网页标题) → style → 加载样式 → 解析样式 → link → 加载外部样式表文件 → 解析外部样式表 → script → 加载外部脚本

Js代码顺序问题,JS异常:报缺少对象

问题描述 Js代码顺序问题,JS异常:报缺少对象 大家好,有一个JS问题,代码以上线,突然有一天下午,JS异常:报缺少对象 代码如下: 1,有一个父页面JSP里有Iframe,Iframe里调用另一个公司界面,这个界面有一个提交按钮,点击提交后回调我一个Action的方法 2,这个方法回调中间界面如下: <%@ page language="java" import="java.util.*" pageEncoding="gbk"%>

网页中JS函数自动执行常用三种方法_javascript技巧

本文为大家分享了在网页中JS函数自动执行常用方法,供大家参考,具体内容如下 一.JS方法 1.最简单的调用方式,直接写到html的body标签里面: <body onload="myfunction()"> <html> <body onload="func1();func2();func3();"> </body> </html> 2.在JS语句调用: <script type="text

javascript从定义到执行 你应知这些事

javascript从定义到执行,JS引擎在实现层做了很多初始化工作,因此在学习JS引擎工作机制之前,我们需要引入几个相关的概念:执行环境 栈.全局对象.执行环境.变量对象.活动对象.作用域和作用域链等,这些概念正是JS引擎工作的核心组件.这篇文章的目的是孤立的为你讲解每一个概念,而 是通过一个简单的demo来展开分析,全局讲解JS引擎从定义到执行的每一个细节,以及这些概念在其中所扮演的角色. var x = 1;  //定义一个全局变量 x  function A(y){     var x 

javascript(js)的小数点乘法除法问题详解

 本篇文章主要是对javascript(js)中的小数点乘法除法问题进行了详细的介绍,需要的朋友可以过来参考下,希望对大家有所帮助 一.用js计算 12.32 * 7  结果是多少?答案:86.24000000000001   为什么会出现这种问题?怎么解决? js在处理小数的乘除法的时候有一个bug,解决的方法可以是:将小数变为整数来处理. 以上的计算可以改为: 12.32 * 100 * 7 /100 得出的结果是:86.24,正确.   另外再计算一下: 8.80 * 100 * 12 /

javascript-页面js文件解析执行过程

问题描述 页面js文件解析执行过程 在高性能javascript书中有如下讲解,感觉甚是不懂!如下:每个文件必须等到前一个文件下载并执行完成才开始下载.如下图:(http://img.ask.csdn.net/upload/201508/25/1440490986_104397.png) 疑问:一些外部引入的js文件不是不能被执行么,还有那些页面加载完后再执行的js文件,这里为什么是下载并执行呢!又晕了,求大神解答!感谢! 解决方案 这个要看你的htnl怎么写的,如果是外部js,那么肯定是先下载