0

メニュー システムを作成していて、ユーザーが特定の行をクリックしたときに関数を呼び出す必要があります。新しい関数を使用して、関数を呼び出した div とユーザーがクリックした行を渡します。関数にローカル配列を渡そうとするまでは、問題ありません。私が次のことをした場合:

for (i=0;i<tmpdropnumber;i++){
    var dv=document.getElementById(id+i);
    dv.style.cursor="pointer";  
    dv.onmouseover = new Function('dropover'+"('" + id + "','" + i + "')");
    dv.onmouseout = new Function('dropout'+"('" + id + "','" + i + "')");
    dv.onclick = new Function('dropclick'+"('" + id + "','" + i + "','"+tmparray1+"','"+tmparray2+"')");
}

ご想像のとおり、配列は文字列として渡されます。関数で配列を再構築することはできましたが、それは洗練されていないようです。

次のことを試してみると:

for (i=0;i<tmpdropnumber;i++){
    var dv=document.getElementById(id+i);
    dv.style.cursor="pointer";  
    dv.onmouseover = new Function('dropover'+"('" + id + "','" + i + "')");
    dv.onmouseout = new Function('dropout'+"('" + id + "','" + i + "')");
    dv.onclick = new Function('dropclick'+"('" + id + "','" + i + "',"+tmparray1+","+tmparray2+")");
}

配列を渡そうとするとクラッシュします。どうすればこれを達成できるかについてのアイデアはありますか? コードでjqueryを使用しているため、javascriptまたはjqueryソリューションで問題ありません。

4

2 に答える 2

1

それ以外の

dv.onclick = new Function('dropclick'+"('" + id + "','" + i + "','"+tmparray1+"','"+tmparray2+"')");

試す

dv.onclick = function() {
    dropclick(id, i, tmparray1, tmparray2);
};

編集

宣言を無名関数でラップします。

(function(id, i) {
    dv.onclick = function() {
        dropclick(id, i, tmparray1, tmparray2);
    };
} (id, i));
于 2013-02-15T16:03:25.803 に答える
1

新しい関数を使用しないでください。

文字列が構築されているときに配列が文字列に変換されるため、問題が発生しています。

toString() を回避するための基本的な考え方

for (i=0;i<tmpdropnumber;i++){
    var dv=document.getElementById(id+i);
    dv.style.cursor="pointer";
    (function(id, i){  
        dv.onmouseover = function(){ dropover(id,i); };
        dv.onmouseout = function(){ dropout(id,i); };
        dv.onclick = function(){ dropclick(id,i, tmparray1, tmparray2); };
    })(id,i);
}

しかし実際には、オブジェクト id を渡す必要はありません。

現在の行を取得するためにいつでも使用できthis、テーブルにはrowIndexがあります。テーブルに 1 つのイベント ハンドラーを設定し、テーブル/tbody でハンドラーを使用してバブリングをキャプチャし、target/srcElement を使用することができます。

于 2013-02-15T16:05:25.350 に答える