-1

回避策がある非常に奇妙な問題に遭遇しましたが、実際にはなぜそれが起こっているのかわかりません。

基本的に、既存のDOM要素を取得し、innerHTMLを使用して追加DOM要素を作成してから、そのonclickイベントのイベントハンドラーを配置します。

for(i=0; i<contextMenuModel.length; i++) {
    contextMenuRow = contextMenuModel[i];
    currentRowId = "edit_context_table_row_" + i;

    editTable.innerHTML += "<div id='" + currentRowId + "'></div>";
    row = dojo.byId(currentRowId);

    row.innerHTML += "<span>" + contextMenuRow.labelName + "</span>";
    row.innerHTML += "<span>" + contextMenuRow.eventName + "</span>";

    dojo.connect(row, "onclick", row, rowClickHandler);
}

問題はこれです:最後の行だけがonclickハンドラーで終わります。他の人はしません。使用しているブラウザは関係ありません。dojo.connectをに変更しても関係ありません。

row.onclick = rowClickHandler;

また、私が取り出す場合:

row.innerHTML += "<span>" + contextMenuRow.eventName + "</span>";

それでも機能しません。

ただし、私が見つけた回避策(これにより、これがさらに改善されます)は、これが機能することです。

for(i=0; i<contextMenuModel.length; i++) {
    contextMenuRow = contextMenuModel[i];
    currentRowId = "edit_context_table_row_" + i;

    editTable.innerHTML += "<div id='" + currentRowId + "'></div>";
    row = dojo.byId(currentRowId);

    row.innerHTML += "<span>" + contextMenuRow.labelName + "</span>";
    row.innerHTML += "<span>" + contextMenuRow.eventName + "</span>";
}

for(i=0; i<contextMenuModel.length; i++) {
    row = dojo.byId("edit_context_table_row_" + i);
    dojo.connect(row, "onclick", row, rowClickHandler);
}

そのような奇妙な問題。

4

2 に答える 2

1

要素を動的に作成し、それらにイベントをアタッチすると、通常はを使用した方がうまくいくことがわかりますdocument.createElement。これにより、要素がdomに追加され、文字列を連結する代わりに操作するオブジェクトが確実に作成されます。

   var divRow = document.createElement("DIV");
   divRow.id = currentRowId;
   divRow.onclick = function(){};
   editTable.appendChild(divRow);
于 2012-07-20T20:07:25.597 に答える
0

これが問題です。私がこれをするとき:

editTable.innerHTML += "<div id='" + currentRowId + "'></div>";

古いinnerHTMLを連結してから置き換えています。これは、新しいDOMノードが生成されることを意味します。この新しいDOMノードは古いイベントハンドラーに接続されていません。これにより、古いイベントハンドラーが残り、何も実行されません。コードが非常に多くのDOMノードを作成および破棄していることは言うまでもなく、このコードは本当にひどいものです。

于 2012-07-20T19:31:23.457 に答える