2012-09-01 149 views
1

嗯,我已经撕掉我的头发,因为我认为我完成了这个脚本,但突然增加一个for循环打破了每一个indexOf,我试图创建检查,所以控制台不会吓坏了,但可悲的是没有成功。使用静态值“z”或LevelCheck允许所有indexOfs正确,但只要for循环是参与工作,似乎没有indexOfs的希望工作对于循环打破IndexOf

<script type="text/javascript"> 
var tempval = new Array(); 
function Renew(){ //Reset tempval back to val 
    for(d=0;d<val.length;d++){ 
     tempval[d] = val[d]; 
    } 
} 
function UpdateLoop(){ 
    Renew(); 
    var Levels = document.getElementById("Lvl"); 
    if(Levels){ 
     for(z=0; z<=Levels.value; z++){ 
      Update(z); 
     } 
    } 
} 
function Update(LevelCheck){ 
    for (i=0; i<=key.length; i++){ 
     if(key[i] != null){ 
      if (key[i].indexOf("rate") > -1) { //Search through 
       for (r=0; r<=key.length; r++){ 
        if(key[i].indexOf(key[r]) > -1){ //Finds out which form it should replace 
         var raw=tempval[i]; 
         for (y=0; y<=key.length; y++){ 
          if(key[i] != "movespeed" && key[i] != "Movrate"){ //add a check to see if string is not there 
           var item = document.getElementById(key[y]); 
           if (item) { //Make it use formula value and then put that result into a value and loop back into function until level reached. If level changed to a lower number, reset to original value and repeat 
            //raw=raw.replace(key[y],document.getElementById(key[y]).value); //replace this with val[y] 
            raw=raw.replace(key[y],tempval[y]); 
           } 
          } 
          else 
           break; 
         } 
         if(raw != null){ 
          if(raw.indexOf("Mov") > -1){ 
           for(x=0; x<=key.length; x++){ 
            if(key[x].indexOf("movespeed") > -1){ 
             //raw=raw.replace("Mov",document.getElementById(key[x]).value); 
             raw=raw.replace("Mov",tempval[x]); 
             break; 
            } 
           } 
          } 
          if(raw.indexOf("Lvl") > -1){ 
           raw=raw.replace("Lvl",document.getElementById('Lvl').value); 
          } 
          if(raw.indexOf("Exp") > -1){ 
           raw=raw.replace("Exp","0"); 
          } 
         } 
         if(document.getElementById('Lvl').value == LevelCheck){ 
          alert("Input:"+tempval[i]); 
          if(key[i] == "Movrate"){ 
           document.getElementById("movespeed").value = eval(raw); 
          } 
          else{ 
           var check = document.getElementById(key[r]); 
           if (check){ 
            document.getElementById(key[r]).value = eval(raw); 
           } 
          } 
         } 
         else{ 
          tempval[r] = eval(raw); 
         } 
         break; //So it doesn't keep searching 
        } 
       } 
      } 
     } 
    } 
} 
</script> 

的Html部分(这是产生通过PHP所以我只是用生成的内容的浏览器)

<table> 
    <tbody> 
     <tr> 
      <td>Creature Name:</td> 
      <td> 
       <input type="Text" name="CName" value="Thing" size="10%"> 
      </td> 
     </tr> 
     <tr> 
      <td>Level:</td> 
      <td> 
       <input type="Text" id="Lvl" name="level" onchange="" value="1" size="10%"> 
      </td> 
     </tr> 
     <tr> 
      <td>movespeed:</td> 
      <td> 
       <input type="Text" name="movespeed" id="movespeed" value="1" size="10%"> 
      </td> 
     </tr> 
     <tr> 
      <td>str:</td> 
      <td> 
       <input type="Text" name="str" id="str" value="4" size="10%"> 
      </td> 
     </tr> 
     <tr> 
      <td>dex:</td> 
      <td> 
       <input type="Text" name="dex" id="dex" value="3" size="10%"> 
      </td> 
     </tr> 
     <tr> 
      <td>int:</td> 
      <td> 
       <input type="Text" name="int" id="int" value="1" size="10%"> 
      </td> 
     </tr> 
     <tr> 
      <td>will:</td> 
      <td> 
       <input type="Text" name="will" id="will" value="2" size="10%"> 
      </td> 
     </tr> 
     <script type="text/javascript"> 
      var key=new Array(); 
      var val=new Array(); 
      key.push("movespeed"); 
      val.push("1"); 
      key.push("str"); 
      val.push("4"); 
      key.push("dex"); 
      val.push("3"); 
      key.push("int"); 
      val.push("1"); 
      key.push("will"); 
      val.push("2"); 
      key.push("Movrate"); 
      val.push("Mov+1"); 
      key.push("strrate"); 
      val.push("1+str"); 
      key.push("dexrate"); 
      val.push("1+dex+(str/4)"); 
      key.push("intrate"); 
      val.push("1+int"); 
      key.push("willrate"); 
      val.push("1+will"); 
     </script> 
     <tr> 
      <td> 
       <input type="button" name="button" value="Use Formula" onclick="UpdateLoop();"> 
      </td> 
      <td> 
       <input type="submit" value="Save"> 
      </td> 

控制台:

Uncaught TypeError: Object 2 has no method 'indexOf' Monsters.php:62 
Update Monsters.php:62 
UpdateLoop Monsters.php:39 
onclick Monsters.php:28 
+11

哦。我的。神。伙计,你一定需要重新考虑你的代码。你不能为这样的代码疯狂。 – MaxArt

+0

你能对齐你的HTML吗?它也看起来不完整。 –

+1

这是生成页面的第62行吗? “key”,“val”和“tempval”的内容是什么? – MaxArt

回答

1

你需要改变你的更新功能如下:

function UpdateLoop(){ 
    var Levels = document.getElementById("Lvl"); 
    if(Levels){ 
     for(z=0; z<=Levels.value; z++){ 
      Renew(); 
      Update(z); 
     } 
    } 
} 

处理级别0后,tempval数组的值为级别0,它从val数组中删除了原始值。

此更改固定在我的测试问题:http://jsfiddle.net/jimmym715/xTUND/

哦,什么MaxArt在上面的评论说的是正确的金钱...有更好的方式来完成你要什么这里

+0

它有点让我更好地了解为什么脚本不是工作,但为什么val,价值被首先消灭? –

+0

'val' *中的值不会被清除,这就是为什么我们能够在每个级别之后刷新'tempval'中的值。但是,如果“LevelCheck”的值与“Lvl”文本框中的值不匹配,那么'tempval'中的值会在'r'循环的末尾显式重置。因此,当为Level 0运行'Update'时,'tempval'中的值被覆盖,并且这又要求'tempval'中的值被重置为'Update'以在下一个级别上工作(尽管运行'如果你不打算保留这些值,那么在0级上更新''是不必要的,所以我猜测有什么不对劲) – jimmym715

+0

嗯事实证明,类似于你所说的发生了什么事情,这些值只有数字所以他们没有得到正确的解析,为了纠正这种情况,必须放置.toString()来将每个int转换回字符串。 –

1

原来,扁平数字不是字符串,所以为了安全地通过每个值.toString()必须存在,谢谢大家尝试。 所以它看起来像:

key[i].toString().indexOf(key[r])