【问题标题】:Simplifying a javascript with multiple functions to a single function array将具有多个函数的 javascript 简化为单个函数数组
【发布时间】:2013-04-01 05:43:27
【问题描述】:

所以我试图简化我的脚本,不再需要使用带有 setintervals 和 clearintervals 的多个函数,而是只有一个可以同时运行的函数,就好像它是一堆不同的函数一样,比如一个数组,所以文件不是很大。以下是脚本的作用示例http://test.719records.com/test/test.html(页面以 1080P 或更高的分辨率查看) 这是整个脚本 http://test.719records.com/test/jquery.solari.letters.js

这是我希望最终被迭代的脚本的摘录。

//randomize name1 li:1 frames
//until correct character is landed on
var randlet = 0;

function randomizerlet1_1() {
    randlet = Math.floor(Math.random() * 156);
    timesletrun[0] += 1;
    if (masterlet[randlet] == letter[0]) {
        $('#flipL1_1').css('background-position', masterlet[randlet]);
        clearInterval(intervallet1_1);
    } else {
        if (timesletrun[0] == 300) {
            masterlet[randlet] = letter[0];
            $('#flipL1_1').css('background-position', masterlet[randlet]);
            clearInterval(intervallet1_1);
        } else {
            $('#flipL1_1').css('background-position', masterlet[randlet]);
        }
    }
}

var intervallet1_1 = setInterval(function() {
    randomizerlet1_1();
}, 10);

这将是序列中的第二个字母:

//randomize name1 li:2 frames
//until correct character is landed on
function randomizerlet1_2() {
    randlet = Math.floor(Math.random() * 156);
    timesletrun[1] += 1;
    if (masterlet[randlet] == letter[1]) {
        $('#flipL1_2').css('background-position', masterlet[randlet]);
        clearInterval(intervallet1_2);
    } else {
        if (timesletrun[1] == 300) {
            masterlet[randlet] = letter[1];
            $('#flipL1_2').css('background-position', masterlet[randlet]);
            clearInterval(intervallet1_2);
        } else {
            $('#flipL1_2').css('background-position', masterlet[randlet]);
        }
    }
}

var intervallet1_2 = setInterval(function() {
    randomizerlet1_2();
}, 10);

现在 1 行总共有 38 行,最终将有 28 行。很抱歉,我的知识不是专家级的,我还在学习,所以这可能很容易,也可能不是,但如果可能的话,我需要将这些简化为一个迭代函数。也许使用多维数组和函数参数?我不确定这段代码会是什么样子。

如果这可以简化,我将为它创建一个教程,并将其包装成一个免费的 3rd 方插件,供人们在他们自己的个人项目中使用!

【问题讨论】:

  • Jättekul .... har vi blivit svenska ?
  • 森纳尔!? BERÄTTA FÖR MIG!
  • 这需要一种面向对象的方法。这是非常可行的,甚至应该使用一个简单的参数来创建页面本身,即您希望页面上有多少对象。我希望我在 OO 方面做得更好,因为我很可能只为以 x_y 结尾的每件事用数组编写代码
  • Jag är inte svensk ... 哈哈
  • 这里是简化的masterlet jsfiddle.net/mplungjan/bAD4Y

标签: javascript jquery arrays function user-defined-functions


【解决方案1】:

这是一个开始 - 正在进行中

FIDDLE

$(function() {
  var products= new Array(4);
  var letters = new Array(39);
  var numbers = new Array(4);
  $.each(products,function(i) {
    var aDIV = $("<div/>",{"class":"product"});
    var aUL  = $("<ul/>",{"class":"cd"});
    var logoLI = $("<li/>",{"class":"logo","id":"logo"+(i+1)});
    aUL.append(logoLI);
    var aLI;
    $.each(letters,function(j){
      aLI=$("<li/>",{"class":"flipletters","id":"flipL"+i+"_"+j,}).css("background-position", "0px 0px").appendTo(aUL);
    });
    $.each(numbers,function(j){
      aLI=$("<li/>",{"class":"flipdigits","id":"flip"+i+"_"+j,}).css("background-position", "0px 0px").appendTo(aUL);
    });
    $(".wrapper").append("<br style='clear:both'/>").append(aDIV.append(aUL));
  });
});
var masterlet = []
var cnt = 0;
$.each(",A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z".split(","),function(n, let) {
    for (var i=0;i<6;i++) {
        masterlet.push("0px -"+(60*cnt++)+"px");
    }                
});
masterlet.push("0px -"+(60*cnt++)+"px");
masterlet.push("0px -"+(60*cnt++)+"px");




function randomizerlet(letId,letPos) {
    if (letPos) {
        this.letPos = letPos;
        this.timesletrun=0;
        this.letId = letId;
        this.tId=setInterval(function() {
          randomizerlet(letId);
        }, 10);
    }
    var randlet = masterlet[Math.floor(Math.random() * masterlet.length)];
    this.timesletrun++;
    var thisLI = $('#'+letId); 
    if (masterlet[randlet] == this.letPos) {
        thisLI.css('background-position', randlet);
        clearInterval(this.tId);
    } else {
        if (this.timesletrun == 300) {
            thisLI.css('background-position', this.letPos);
            clearInterval(this.tId);
        } else {
            thisLI.css('background-position', randlet);
        }
    }
}

【讨论】:

  • 确实摆脱了一行,但并不是我想要的。我想摆脱只为一条线使用 38 种不同的功能,更不用说所有 28 条线了。 38x28= 1064 个函数同时发生 setintervals = 一个不愉快的浏览器 :(
  • 我一次做一点。这是复活节,我有一个家庭;)
  • 哦,我在美国,现在是 100 岁,我今晚可能不会睡觉,因为我明天就该睡觉了。大声笑
  • 对不起,我是个菜鸟,但我并没有完全按照你的榜样。当它再次遍历该函数时,timesletrun 不会重置为 0 吗?我也不太确定你通过 letPos 传递了什么。
  • 我没有看到您在任何地方重置时间。我会在一分钟内到达 letPos
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-26
  • 1970-01-01
  • 2015-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多