0

このスクリプトが完成したと思っていたので、髪の毛をはぎ取りましたが、突然 for ループをもう 1 つ追加すると、すべての indexOf が壊れてしまいました。コンソールがフリークしないようにチェックを作成しようとしましたが、残念ながら成功しませんでした。「z」または LevelCheck に静的な値を使用すると、すべての indexOfs が適切に機能しますが、for ループが含まれるとすぐに、どの indexOfs も機能しないように見えます

<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
4

2 に答える 2

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が上記のコメントで言ったことはお金にぴったりです...あなたがここでやろうとしていることを達成するためのはるかに良い方法があります

于 2012-09-02T00:45:26.213 に答える
1

フラットな数値は文字列ではないことが判明したため、すべての値を安全に処理するには、.toString()が存在する必要がありました。したがって、次のようになります。

key[i].toString().indexOf(key[r]) 
于 2012-09-02T08:39:22.237 に答える