![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
いつもお世話になっております。
今回はテーブルの各セルに同じ関数を対応させたいのですがいい方法が思い浮かばなかったので、そこをお聞きしたいです。
function swap(TD)
{
if(TD.style && TD.style.backgroundColor)
{
TD.style.backgroundColor = '';
}
else
{
TD.style.backgroundColor = '#ff0000';
}
}
(略)
<TD onclick="swap(this)"><INPUT type="hidden" name="xxx01" value="0"></TD>
<TD onclick="swap(this)"><INPUT type="hidden" name="xxx02" value="0"></TD>
<TD onclick="swap(this)"><INPUT type="hidden" name="xxx03" value="0"></TD>
<TD onclick="swap(this)"><INPUT type="hidden" name="xxx04" value="0"></TD>
swapという関数はセルの色を白と赤に交互に変えるものですが、ここにセルが白なら0を、赤なら1を各テキストに入れるという処理を加えたいです。
しかしながらnameがちょっと違うので一つ一つ関数を作らなくてはいけないのかと思っています。
nameのxxxの部分は共通で、お尻の数字が変わっていきます。
この規則性を使って何とかうまい方法はありませんでしょうか?
ご教授お願いします。
No.5ベストアンサー
- 回答日時:
<html>
<head>
<script type="text/javascript" >
function setup(){
td_all = document.getElementsByTagName("td")
alert( td_all.length );
for( i = 0 ; i <= td_all.length - 1 ; i ++ ){
td_all[i].onclick = function(){click(this);};
}
}
function click( td ){
if( td.style && td.style.backgroundColor ){
td.style.backgroundColor = '';
td.firstChild.value = 0;
}else{
td.style.backgroundColor = '#ff0000';
td.firstChild.value = 1;
}
}
</script>
</head>
<body onload=" setup();">
<table>
<tbody>
<tr>
<td><INPUT type="text" name="xxx01" value="0"></td>
<td><INPUT type="text" name="xxx02" value="0"></td>
<td><INPUT type="text" name="xxx03" value="0"></td>
</tr>
</tbody>
</table>
</body>
</html>
テストをしている最中に、テキストの内容が
type「hidden」ではみえなかったので
とりあえずtextにしてやってみました。
全部のTDたぐに onclick=" swap(this);"
を書くのはめんどくさいかな?と思ったので
勝手にgetElementsByTagNameで、すべてのTDたぐに、swap関数を
あてはめちゃってます。
このまま、コピー&貼り付けをしていただければ。
hidden(今は type="text"ですが)のinputタグのvalueに、1と0が入っている様子が確認していただけると思います。
質問者様の要望と違う回答でしたらすみません。
ご回答ありがとうございます。
動作の確認しました。
要望どおりです。ありがとうございます。
>全部のTDたぐに onclick=" swap(this);"
>を書くのはめんどくさいかな?と思ったので
>勝手にgetElementsByTagNameで、すべてのTDたぐに、swap関数を
>あてはめちゃってます。
まだうまい方法がわからないもので、1000個くらいすべてに書いてました。
これからはこのようにします。
NO.6とあわせて質問以上のアドバイスをありがとうございました。
No.6
- 回答日時:
No.5です
私が書き込みしたプログラムの
inputタグのname属性に xxx01、xxx02、xxx03とそのままのこしてありますが。
それぞれのTDタグの、一番初めの子供の要素(firstChild)として
それぞれのinputタグを参照しているので
name属性は消去しても、問題なく動作します。
あと、セルが白なら0、赤なら1にしたい!とのことでしたが
0と1を逆にしてしまったようです。
td.firstChild.value = 0;
この行の0を1に、もうひとつは1を0にしていただければOKなはずです。
No.4
- 回答日時:
No1です。
たびたび失礼します。
Name属性に連番を与える場合に使用した関数の別回答です。
eval関数を使用してもおkです。
function changeValue(Num,TD){
var tblObj = document.getElementById("target");
var TDs = tblObj.getElementsByTagName("td");
var INPUTs = tblObj.getElementsByTagName("input");
//何番目のTDがクリックされたか
for(var i = 0;i<TDs.length;i++){
if(TDs[i] == TD){
//indexは0から始まるので1追加
i++;
break;
}
}
var str = "f." + "xxx" + "0" + i + ".value = Num;"
eval(str);
}
ご回答ありがとうございました。
ifで1000個に分けるかと思いましたが、サンプルをやってみて動作確認しました。
firstchildというものがよくわからなかったのですが、理解しました。
要望どおりのものができました。
何度もアドバイスいただきまして本当にありがとうございました。
No.3
- 回答日時:
No1です。
>>if文でやれるとのことでしたが、今回はこのようなものが1000個くらいあるので
質問文に書かれているswap関数のif文のことを言っているのですが‥?
具体的に言えば
function swap(TD){
if(TD.style && TD.style.backgroundColor){
TD.style.backgroundColor = '';
TD.firstChild.value = 0;
}else{
TD.style.backgroundColor = '#ff0000';
TD.firstChild.value = 1;
}
}
こんなカンジです。
TDタグに文字を入れるつもりならfirstChildの代わりにlastChildも使えますし
firstChild.nextSiblingとかも使えます。
↓のようにTDタグからINPUTタグを取ってもいいと思います。
function swap(TD){
var INPUTs = TD.getElementsByTagName("input");
if(TD.style && TD.style.backgroundColor){
TD.style.backgroundColor = '';
INPUTs[0].value = 0;
}else{
TD.style.backgroundColor = '#ff0000';
INPUTs[0].value = 1;
}
}
Name属性に連番を与えてやりたい場合の例としては
function swap(TD){
if(TD.style && TD.style.backgroundColor){
TD.style.backgroundColor = '';
changeValue(0,TD);
}else{
TD.style.backgroundColor = '#ff0000';
changeValue(1,TD);
}
}
function changeValue(Num,TD){
var tblObj = document.getElementById("target");
var TDs = tblObj.getElementsByTagName("td");
var INPUTs = tblObj.getElementsByTagName("input");
//何番目のTDがクリックされたか
for(var i = 0;i<TDs.length;i++){
if(TDs[i] == TD){
//indexは0から始まるので1追加
i++;
break;
}
}
for(var j = 0;j<INPUTs.length;j++){
//ゼロ埋めはJavaScriptに実装されていないので別途関数が必要
//今回はとりあえずゼロ埋めはせずにテキトーに
if (INPUTs[j].name == "xxx" + "0" + i){
INPUTs[j].value = Num;
break;
}
}
}
あんまりスマートとは言い難いですがこんなカンジですかね。
まぁ、質問文のソースは簡単に切り出しただけかと思いますので
上記などを参考に自分に合った方法をご検討ください。
No.2
- 回答日時:
swap関数でinputに辿りつく方法
TD.getElementsByTagName('input')[0]
- TD配下のINPUTの配列の#0
TD.firstChild
- TDの最初の子要素(※1)
inputのnameを導く方法
テーブル全体の構成がわからないのですがカラムや行を得る事ができれば算出できる?
TD.cellIndex
- 何番目のカラムか得る
TD.parentNode.rowIndex
- 親(TR)が何行目か得る
※1 IE以外では改行文字なんかもテキストノードとして存在するので
<td>
<input~
みたいにソース上で改行しているとfirstChildはテキストノードになるので注意が必要
ご回答ありがとうございました。
firstChildというものをはじめて知り、便利なものだと感じました。
これからはうまく使っていきます。
アドバイスありがとうございました。
No.1
- 回答日時:
例文だけで考えれば
TD.firstChild.value = 1
のような記述をif文に加えれば良いと思うのですが。
あるいは、
<table id="target">
<TD onclick="swap(this)"><INPUT type="hidden" name="xxx01" value="0"></TD>
<TD onclick="swap(this)"><INPUT type="hidden" name="xxx02" value="0"></TD>
<TD onclick="swap(this)"><INPUT type="hidden" name="xxx03" value="0"></TD>
<TD onclick="swap(this)"><INPUT type="hidden" name="xxx04" value="0"></TD>
</table>
var tblObj = document.getElementById("target");
var TDs = tblObj.getElementsByTagName("td");
とすればインデックス値をうまく利用してできなくはないですけどね。
どういう使い方をされるのか分からないので、本当に参考までですが
この回答への補足
ご回答ありがとうございます。
if文でやれるとのことでしたが、今回はこのようなものが1000個くらいあるので、
何とかうまくやりたいのですが、
var tblObj = document.getElementById("target");
var TDs = tblObj.getElementsByTagName("td");
について、説明をいただけたら幸いです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript javascriptでテーブルに追加した項目のid追加してローカルストレージを操作したい 5 2023/01/01 15:52
- AJAX JavascriptからPHPへのAjax通信でnullが返ってくる 3 2022/08/03 22:00
- HTML・CSS テーブルタグのセルの幅の一部だけを指定 1 2023/03/12 12:02
- JavaScript EasyUIのSubGrid(jquery)におけるObjectに入れた連想配列について 1 2022/05/02 11:21
- HTML・CSS ただいま勉強始めたての初心者です。フォームを縦並べにしたいです。 2 2022/11/20 17:18
- PHP PHPで画像の渡しが上手く行きません。 1 2023/02/02 09:39
- JavaScript javascript作成してます。ラジオボタンで判定するコードを書いてます。 1 2023/07/18 11:03
- JavaScript 1日1回引けるJavaScriptおみくじについて 1 2022/12/12 22:28
- HTML・CSS CSSが効かずどのように指定すれば良いか分からないのでアドバイスお願い致します 2 2023/06/07 12:25
- 工学 【制御工学】単位ステップ応答の遅れ時間の求め方(令和2年度の機械設計技術者試験(制御工学)の問題) 3 2022/11/02 10:51
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
画面の2重起動をチェックする...
-
Formのシリアライズができない
-
動的に生成されるラジオボタン...
-
tableの各セルに同じ関数を対応...
-
画面表示とともにtableの指定の...
-
table などの height を外から...
-
localStorageでのcheckbox制御
-
JavaScriptの「.querySelectorA...
-
テーブル内のチェックボックス...
-
複数のテーブルをラジオボタン...
-
チェックボックス付きのテーブ...
-
表の中のセルの位置を把握した...
-
return trueとreturn falseの用...
-
<JavaScript>tableタグを入力不...
-
プルダウン 項目が多いので先頭...
-
JavaScriptde途中で、「exit」...
-
submitした値を返したい
-
【jQuery】input nameの文字列...
-
テキストボックスの値同士を比...
-
ボタン2回押しを無効にしたい
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
チェックボックス付きのテーブ...
-
複数のselect値で1つも選択され...
-
画面表示とともにtableの指定の...
-
localStorageでのcheckbox制御
-
文字数を数える際に空白、改行...
-
JavaScriptの「.querySelectorA...
-
Javascriptの電卓で最初の何も...
-
formで項目を連結したい
-
ラジオボタンが選択されたらテ...
-
javascriptで表(テーブル)の自...
-
テーブル内のチェックボックス...
-
横へスクロール
-
java scriptで問題集を作りたい...
-
history.backの前に値をクリア...
-
フォームタグの中のラジオボタ...
-
Java Scriptで・・・
-
送信ボタン連打を抑止したいです
-
【緊急】リアルタイムでエラー...
-
jQuery テキストボックス読み取...
-
JavaScriptを使って九九の表を...
おすすめ情報