1

私はいくつかの検索を行いましたが、明確な答えはありません。私はまったくJavaScriptの人ではなく、かなり無知です。PHPは理解していますが、私にとってはこれでうまくいくはずです。また、このスクリプトは javascript に document.all を使用していたことにも注意してください。可能な場合は getElementById() に更新しようとしました (document.all が firebug でエラーをスローしていたため)。

これで、発生するはずの JavaScript の変更がなくても、ほとんどの場合、ページは正常に表示されます。

また、コードの古さをお詫びしなければなりません。このコードは、私がゲーム クラブのインターネット担当者として引き継いだときに継承したものです。このコードは、架空のクレジットを使用して架空のアイテムを購入するためのものです。

アイテムをクリックして「購入」すると (またはそのいずれでもない場合)、その行の背景が緑色になり、アカウントの合計からクレジットが差し引かれます (ボックスのチェックを外すと逆になります)。送信ボタンをクリックすると、クリックしたものが別のシートに追加され、アカウントから実際の金額が差し引かれます。

現在、「tr615 は未定義です」というエラーが表示されます。これは、以下に示す要素の PHP 生成コードです。

誰かがこれを理解するのを手伝ってくれるなら、それは素晴らしいことです。グーグルとここで数日間検索した後、答えが見つからないようです。

関連するコードの PHP スニペット: (サイトではカスタム関数を使用します。例: エントリ)

たとえば、$id=615 とします。

    <?php
        while (list ($id, $name, $class, $desc, $range, $damage, $cost,$hide) = entry ($items) )
        {
           if ($hide =='0')
           {
            $JavaScriptArrayParms .= '"' . $id . '",';
            $list .= $id . ',';
           ?>
           <tr id="tr<?php echo $id; ?>">  //Thus tr615 for this example
           <td>
             <input type="checkbox" name="chk<?php echo $id; ?>" onclick="updateStoreTable(this.form, this, <?php echo $id; ?>)" />
             <input type="hidden" name="cost<?php echo $id; ?>" value="<?php echo $cost; ?>" />
           </td>
           <td><?php echo $name; ?></td>
           <?php if (! in_array($catid, $noclass)){ echo "<td>$class</td>";}?>
           <td><?php echo $desc; ?></td>
           <?php if (! in_array($catid, $norange)){ echo "<td>$range</td>";}?>
           <td><?php echo $damage; ?></td>
           <td><?php echo $cost; ?></td>
           </tr>
         <?php
        }
        }
        ?>
    </table>

 <input type="hidden" name="list" value="<?php echo $list; ?>" />
 <input type="button" value="Purchase!" onclick='validatePurchase(this)' />
 <input type="reset">
</form>

関連する JS: (以前は document.all.store... または単に document.all.. であった場合があります。正しい方法で修正したことを願っています)

<script language="javascript">
var startmoney = <?php echo $currMoney; ?>;
function canAfford(t,id)
{
    if(t.checked) return;// don't touch if checked for buying.
    //alert("canAfford("+t+","+id+");");
    //t.disabled = false;
    eval("document.store.getElementByID(foo).disabled = false;");
    eval("document.store.getElementByID(foo).checked = false;");
    eval("document.getElementByID(tr"+id+").style.background = '#000000';");
}

function cantAfford(t,id)
{
    //alert("cantAfford("+t.disabled+","+id+")-- "+t+";");
    //alert("before disable");
    //t.disabled = true;
    eval("document.store.getElementByID(chk"+id+").disabled = "+true+";");
    //alert("After disable");
    eval("document.store.getElementByID(chk"+id+").checked = false;");
    eval("document.getElementByID(tr"+id+").style.background = '#555555';");
}

function getCost(id)
{
return eval("document.store.getElementByID(cost"+id+").value");
}

function buying(t,id)
{
eval("document.getElementByID(tr"+id+").style.background = 'green';");
document.store.credits.value -= getCost(id);
}

function notbuying(t,id)
{
eval("document.getElementByID(tr"+id+").style.background = '#000000';");
var creds = new Number(document.store.credits.value);
var cost  = new Number(getCost(id));
document.store.credits.value = (creds + cost);
}

function updateStoreTable(f,t,id) 
{
    var ids = new Array(<?php echo $JavaScriptArrayParms; ?>);
    if(t.checked)
        buying(t,id);
    else
        notbuying(t,id);

for(i = 0; i<ids.length; i++)
    {
        cost = new Number(getCost(ids[i]));
        creds = new Number(f.credits.value);
        //alert("COST: " +(cost)+"\nCREDITS: "+creds+"\nID: "+ids[i]);
    //  alert("'"+ (cost) + "' > '" + (creds) +"'\n"+(eval(cost > creds)));
    //  alert("f.chk"+ids[i]+".checked");
        if(eval("f.chk"+ids[i]+".checked")) { continue; } //ignore already carted items     

        if(eval(cost > creds))
            cantAfford(eval("f.chk"+id),ids[i]);
        else 
            canAfford(eval("f.chk"+id),ids[i]);     
    }
}

4

1 に答える 1

0

第 1 号:

それは(最後にgetElementById()
小文字のd )でなければなりません


2番目:

eval を使用すると、コードは次のように評価されます。

document.getElementById(tr615).style.background = '#000000';

..tr615 は引用符で囲まれていないため、エラーが強制されるため、javascript は変数 tr615 を想定しています。

行は次のようになります。

eval("document.getElementById('tr"+id+"').style.background = '#000000';");

しかし:なぜここで eval を使用するのですか? これは eval なしで実行できます:

document.getElementById('tr'+id).style.background = '#000000';
于 2012-04-11T00:23:41.337 に答える