Javascriptを介してテーブル行にonclickイベントを追加しようとしています。
function addRowHandlers() {
var table = document.getElementById("tableId");
var rows = table.getElementsByTagName("tr");
for (i = 1; i < rows.length; i++) {
row = table.rows[i];
row.onclick = function(){
var cell = this.getElementsByTagName("td")[0];
var id = cell.innerHTML;
alert("id:" + id);
};
}
}
これはFirefoxでは正常に機能しますが、Internet Explorer(IE8)ではテーブルセルにアクセスできません。これは、onclick関数の「this」が「Table」(またはそのようなもの)ではなく「Window」として識別されるという事実に何らかの関係があると考えています。
現在の行にアクセスできる場合、onclick関数でgetElementById
を実行できますが、その方法は見つかりません。助言がありますか?
このようなもの。
function addRowHandlers() {
var table = document.getElementById("tableId");
var rows = table.getElementsByTagName("tr");
for (i = 0; i < rows.length; i++) {
var currentRow = table.rows[i];
var createClickHandler = function(row) {
return function() {
var cell = row.getElementsByTagName("td")[0];
var id = cell.innerHTML;
alert("id:" + id);
};
};
currentRow.onclick = createClickHandler(currentRow);
}
}
[〜#〜] edit [〜#〜]
作業中 デモ 。
IEの場合は Eventオブジェクト のsrcElementプロパティを使用する必要があります。jQueryがオプションである場合は、それを使用することを検討してください。ブラウザのほとんどの違いを抽象化します。
$("#tableId tr").click(function() {
alert($(this).children("td").html());
});
これは、同じ純粋なJavascript(jQuery)ソリューションのコンパクトで少しすっきりしたバージョンです@redsquareおよび@SolutionYogi(上記で説明したように、すべてのHTMLテーブル行にonclick
イベントハンドラーを追加)は、最新のIE11を含むすべての主要なWebブラウザーで動作します。
_function addRowHandlers() {
var rows = document.getElementById("tableId").rows;
for (i = 0; i < rows.length; i++) {
rows[i].onclick = function(){ return function(){
var id = this.cells[0].innerHTML;
alert("id:" + id);
};}(rows[i]);
}
}
window.onload = addRowHandlers();
_
作業中 [〜#〜] demo [〜#〜]
注:IE8でも同様に機能させるために、this
ポインターの代わりに、@が示唆するfunction(myrow)
などの明示的な識別子を使用します赤の広場。宜しくお願いします、
頭がjqで長すぎます。これは動作します。
function addRowHandlers() {
var table = document.getElementById("tableId");
var rows = table.getElementsByTagName("tr");
for (i = 1; i < rows.length; i++) {
var row = table.rows[i];
row.onclick = function(myrow){
return function() {
var cell = myrow.getElementsByTagName("td")[0];
var id = cell.innerHTML;
alert("id:" + id);
};
}(row);
}
}
簡単な方法は以下のようにコードを生成します:
<!DOCTYPE html>
<html>
<head>
<style>
table, td {
border:1px solid black;
}
</style>
</head>
<body>
<p>Click on each tr element to alert its index position in the table:</p>
<table>
<tr onclick="myFunction(this)">
<td>Click to show rowIndex</td>
</tr>
<tr onclick="myFunction(this)">
<td>Click to show rowIndex</td>
</tr>
<tr onclick="myFunction(this)">
<td>Click to show rowIndex</td>
</tr>
</table>
<script>
function myFunction(x) {
alert("Row index is: " + x.rowIndex);
}
</script>
</body>
</html>
これが私がこれを行う方法です。 theadタグとtbodyタグでテーブルを作成します。そして、クリックイベントをIDでtbody要素に追加します。
<script>
document.getElementById("mytbody").click = clickfunc;
function clickfunc(e) {
// to find what td element has the data you are looking for
var tdele = e.target.parentNode.children[x].innerHTML;
// to find the row
var trele = e.target.parentNode;
}
</script>
<table>
<thead>
<tr>
<th>Header 1</th>
<th>Header 2</th>
</tr>
</thead>
<tbody id="mytbody">
<tr><td>Data Row</td><td>1</td></tr>
<tr><td>Data Row</td><td>2</td></tr>
<tr><td>Data Row</td><td>3</td></tr>
</tbody>
</table>
私のテーブルは別のiframeにあるので、私はSolutionYogiと答えて修正しました:
<script type="text/javascript">
window.onload = addRowHandlers;
function addRowHandlers() {
var iframe = document.getElementById('myiframe');
var innerDoc = (iframe.contentDocument) ? iframe.contentDocument : iframe.contentWindow.document;
var table = innerDoc.getElementById("mytable");
var rows = table.getElementsByTagName("tr");
for (i = 0; i < rows.length; i++) {
var currentRow = table.rows[i];
var createClickHandler =
function(row)
{
return function() {
var cell = row.getElementsByTagName("td")[0];
var id = cell.innerHTML;
alert("id:" + id);
};
}
currentRow.onclick = createClickHandler(currentRow);
}
}
</script>
テーブル行を選択して、簡単にクリップボードにコピーしてからExcelに貼り付けられるようにしました。以下は、ソリューションの小さな適応です。
参照:
(Jarek Milewski)からのwindow.Prompt行の場所 :
ユーザーには、コピーするテキストがすでに選択されているプロンプトボックスが表示されます...
完全なテーブルを選択する場合(ティムダウン) 。非常に興味深いが、私は<tr>
要素。
<!DOCTYPE html>
<html>
<body>
<div>
<table id="tableId" border=1>
<tbody>
<tr><td>Item <b>A1</b></td><td>Item <b>B1</b></td></tr>
<tr><td>Item <b>A2</b></td><td>Item <b>B2</b></td></tr>
<tr><td>Item <b>A3</b></td><td>Item <b>B3</b></td></tr>
</tbody>
</table>
</div>
<script>
function addRowHandlers() {
var table = document.getElementById("tableId");
var rows = table.getElementsByTagName("tr");
for (i = 0; i < rows.length; i++) {
var currentRow = table.rows[i];
var createClickHandler =
function(row)
{
return function() {
var cell = row.getElementsByTagName("td")[0];
var id = cell.innerHTML;
var cell1 = row.getElementsByTagName("td")[1];
var id2 = cell1.innerHTML;
// alert(id + " - " + id2);
window.Prompt("Copy to clipboard: Ctrl+C, Enter", "<table><tr><td>" + id + "</td><td>" + id2 + "</td></tr></table>")
};
};
currentRow.onclick = createClickHandler(currentRow);
}
}
window.onload = addRowHandlers();
</script>
</body>
</html>
this.getElementsByTagName("td")[0])
行を変更して、row.getElementsByTagName("td")[0];
を読み取ってください。これは、クロージャ内のrow
参照をキャプチャし、期待どおりに動作するはずです。
編集:行はグローバル変数であるため、上記は間違っています-他の人が言ったように、新しい変数を割り当ててからクロージャーでTHATを使用します。
ほとんどの回答はSolutionYogiの回答のコピーですが、ヘッダーをクリックするとエラーが返される「セル」がnullではないかどうかを確認する重要なチェックを見逃しています。だから、ここにチェックが含まれている答えです:
function addRowHandlers() {
var table = document.getElementById("tableId");
var rows = table.getElementsByTagName("tr");
for (i = 0; i < rows.length; i++) {
var currentRow = table.rows[i];
var createClickHandler = function(row) {
return function() {
var cell = row.getElementsByTagName("td")[0];
// check if not null
if(!cell) return; // no errors!
var id = cell.innerHTML;
alert("id:" + id);
};
};
currentRow.onclick = createClickHandler(currentRow);
}
}