2017-06-02 6 views
0

onclick関数を使ってHTMLテーブルを作成して、行のキーと値を取得したいとしましたが、これまでのところonclick関数は動作していますが、どうすればこの問題を解決できますか?ありがとう。HTMLテーブルonClick関数がテーブルの行のキーと値を取得する

私はあなたが最初の行をクリックしたとき、それは、この形式のコンソールログの表示になりたかった。ここでは

{ "name":"Clark", "age":29}; 

は、私が思うに、私のコード

var table = document.getElementById("tableID"); 
 
if (table != null) { 
 
    for (var i = 0; i < table.rows.length; i++) { 
 
    table.rows[i].onclick = function() { 
 
     tableText(this); 
 
    }; 
 
    } 
 
} 
 

 
function tableText(tableRow) { 
 
    var myJSON = JSON.stringify(tableRow); 
 
    console.log(myJSON); 
 
}
<table align="center" id="tableID" border="1" style="cursor: pointer;"> 
 
<thead> 
 
    <tr> 
 
     <th hidden="hidden"></th> 
 
     <th>name</th> 
 
     <th>age</th> 
 
    </tr> 
 
</thead> 
 
<tbody> 
 
    <tr> 
 
     <td >Clark</td> 
 
     <td>29</td> 
 
    </tr> 
 
    <tr> 
 
     <td >Bruce</td> 
 
     <td>30</td> 
 
    </tr> 
 
</tbody> 
 
</table>

+0

あなたはJSON.stringifyにDOM要素(すなわち、ホストオブジェクト)を渡している、あなたは確かにそれが動作するはずですか? [*循環参照があってもDOMノードをJSONにシリアル化する方法は?*](https://stackoverflow.com/questions/32377345/is-there-a-way-to-json-stringify-an-html- DOMオブジェクトのJavaScript)。 – RobG

+0

こんにちは@RobGはあなたの返事に感謝します、私は間違った方向に行ったと思います。私の目標は、後でREST APIフレームワークを編集するために後で渡すことができるように、行オブジェクトonClick全体を取得することです。今はJSON形式でオブジェクトを取得したいだけです。あなたはそれを私に助けてくれますか?ありがとう –

+0

TRの文字列化された(シリアル化された)バージョンは、[* outerHTML *](https://developer.mozilla.org/en-US/docs/Web/API/Element/outerHTML)になります。その後、文字列がHTMLパーサを使用してDOMオブジェクトに解析されます。この場合、JSONは間違ったツールだと思います。 – RobG

答えて

0

データをオブジェクトとして返すように私の答えを編集しました。スクリプトを実行して見てください。

var table = document.getElementById("tableID"); 
 
if (table) { 
 
    for (var i = 0; i < table.rows.length; i++) { 
 
    table.rows[i].onclick = function() { 
 
     tableText(this); 
 
    }; 
 
    } 
 
} 
 

 
function tableText(tableRow) { 
 
    var name = tableRow.childNodes[1].innerHTML; 
 
    var age = tableRow.childNodes[3].innerHTML; 
 
    var obj = {'name': name, 'age': age}; 
 
    console.log(obj); 
 
}
<table align="center" id="tableID" border="1" style="cursor: pointer;"> 
 
<thead> 
 
    <tr> 
 
     <th hidden="hidden"></th> 
 
     <th>name</th> 
 
     <th>age</th> 
 
    </tr> 
 
</thead> 
 
<tbody> 
 
    <tr> 
 
     <td >Clark</td> 
 
     <td>29</td> 
 
    </tr> 
 
    <tr> 
 
     <td >Bruce</td> 
 
     <td>30</td> 
 
    </tr> 
 
</tbody> 
 
</table>

+0

残念ながらこれは機能しません。もう一度質問を参照してください –

+0

@M。Izzat今見て –

+0

@JosanIrachetaありがとう、これは動作します!もし私がもっと大きなテーブルを持っていれば、あなたは私に尋ねる気にしない。どのようにtableRow.childNodes [i] .innerHTMLを宣言する必要がないので、より動的にすることができます。 1 by 1 –

0

ですtr.innerTestを使用して、タグの値を取得することができます

+0

* innerText *を意味すると思います。 OPは、textContentを取得するだけでなく、TR構造全体をシリアル化したいと思うようです。 – RobG

0

あなたはjQueryのを使用している場合は、この

$('#tableID').on('click', 'tr', function(e){ 
 
    tableText($(this).html()); 
 
}); 
 

 
function tableText(tableRow) { 
 
    var myJSON = JSON.stringify(tableRow); 
 
    console.log(myJSON); 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script> 
 

 
<table align="center" id="tableID" border="1" style="cursor: pointer;"> 
 
    <tr> 
 
    <td>Text</td> 
 
    <td>MoreText</td> 
 
    <td>Lorem</td> 
 
    <td>Ipsum</td> 
 
    </tr> 
 
    <tr> 
 
    <td>Text</td> 
 
    <td>MoreText</td> 
 
    <td>Lorem</td> 
 
    <td>Ipsum</td> 
 
    </tr> 
 
    <tr> 
 
    <td>Text</td> 
 
    <td>MoreText</td> 
 
    <td>Lorem</td> 
 
    <td>Ipsum</td> 
 
    </tr> 
 
    <tr> 
 
    <td>Text</td> 
 
    <td>MoreText</td> 
 
    <td>Lorem</td> 
 
    <td>Ipsum</td> 
 
    </tr> 
 
</table>

0

行うには多くの方法がありますが、何」のようなテーブルにイベントリスナーを追加することができますしかし、堅牢で拡張可能な方法は、プロパティ名をテーブルのヘッダー行をクリックし、クリックされた行から値を取得します。

なぜヘッダーにセルが隠されているのか分かりませんが、それは事を複雑にします。あなたがデータのためにそれを使用しているなら、それはテーブルまたは行の関連するオブジェクトまたはdata-*プロパティのほうがずっと良いでしょう。

function getRowDetails(event) { 
 
    row = this; 
 
    var table = row.parentNode.parentNode; 
 
    var header = table.rows[0]; 
 
    
 
    // Get property names from header cells 
 
    var props = [].reduce.call(header.cells, function(acc, cell) { 
 
    if (!cell.hasAttribute('hidden')) { 
 
     acc.push(cell.textContent); 
 
    } 
 
    return acc; 
 
    }, []); 
 
    
 
    // Get value for each prop from data cell clicked on 
 
    var result = props.reduce(function(acc, prop, i) { 
 
    acc[prop] = row.cells[i].textContent; 
 
    return acc; 
 
    }, {}); 
 
    
 
    // Do something with result 
 
    console.log(result); 
 
    return result; 
 
} 
 

 
// Add listener to body rows, could also put single listener on table 
 
// and use event.target to find row 
 
window.onload = function() { 
 
    [].forEach.call(document.getElementsByTagName('tr'), function(row, i) { 
 
    if (i) row.addEventListener('click', getRowDetails, false); 
 
    }); 
 
}
<table align="center" id="tableID" border="1"> 
 
<thead> 
 
    <tr><th hidden="hidden"></th><th>name</th><th>age</th></tr> 
 
</thead> 
 
<tbody style="cursor: pointer;"> 
 
    <tr><td >Clark</td><td>29</td></tr> 
 
    <tr><td >Bruce</td><td>30</td></tr> 
 
</tbody> 
 
</table>

関連する問題