プロが教える店舗&オフィスのセキュリティ対策術

指定のdiv内にある一行目(もしくは、最初の3つ)のtdタグに対して
JavaScriptでClass名を付けたいのですが、どのようにすればよいでしょうか?

【HTML参考】
<div id="box">
<table>
<tr>
<td>セル1</td>
<td>セル2</td>
<td>セル3</td>
</tr>
<tr>
<td>セル4</td>
<td>セル5</td>
<td>セル6</td>
</tr>
</table>
</div>

上記のような時、div#box内の「セル1~3」に対してclass名を付けたいと言った場合です。

よろしくお願いいたします。

A 回答 (6件)

<html>


<head><style> .red{ background-color:#c00; } </style></head>
<body>
<div id="box">
<table id="tb">
<tr>
<td>セル1</td>
<td>セル2</td>
<td>セル3</td>
</tr>
<tr>
<td>セル4</td>
<td>セル5</td>
<td>セル6</td>
</tr>
</table>
</div>
<script>
window.onload=function(){
ob = document.getElementById('tb').rows[0].cells;
for(i=0;i<ob.length;i++) ob[i].className='red';
}
</script>
</body>
</html>
直感的で俺はこれが楽。
    • good
    • 0

あともう一つ動かない原因あった。


gooのシステムが
U+005CをU+00A5に置き換えてた気がする。
    • good
    • 0

<?xml version="1.0" encoding="UTF-8"?>


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dt …
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Q237452 TestCase 1</title>
<style type="text/css">
table{
border-collapse:separate;
}
td.special{
border-style:solid;
background-color:red;
border-color:green;
border-width:medium;
}
</style>
<script type="application/ecmascript"><![CDATA[
function initialize(){
var tds = document.evaluate("//xhtml:div[@id='box']/xhtml:table/xhtml:tr[1]/xhtml:td",document.documentElement,getNS,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);
for (var i = 0; i < tds.snapshotLength;i++){

var attr = tds.snapshotItem(i).getAttributeNode("class");
var attrval = "";
if (attr !== null){
attrval = attr.nodeValue;
}
var arr = attrval.split(new RegExp("[\\u0009|\\u0020|\\u000A|\\u0000C|\\u000D]","g"));
for (var j = 0;j < arr.length;j++){
if (arr[j] == ""){
arr.splice(j,1);
}
}
if (arr.indexOf("special") < 0){
arr.push("special");
}
attrval = arr.join("\u0020");
tds.snapshotItem(i).setAttribute("class",attrval);
}
}
function getNS(prefix){
switch(prefix){
case "xhtml":
return "http://www.w3.org/1999/xhtml";
default:
throw new RangeError();
}
}
]]></script>
</head>
<body onload="initialize();">
<div id="box">
<table>
<tr>
<td>セル1</td>
<td>セル2</td>
<td>セル3</td>
</tr>
<tr>
<td>セル4</td>
<td>セル5</td>
<td>セル6</td>
</tr>
</table>
</div>
</body>
</html>
<!--
Q. 今までの回答でgetAttributeを使ってたのに,何でgetAttributeNodeなんていう回りくどい記述をしているんですか?

A. W3Cの仕様と違うことに気づいてショックを受けたからです。MDCのgetAttributeメソッドのNotesを見てください。

Q.Mozilla,Safari,Operaで動作しないんですが。
可能性として二つ。
一つはapplication/xhtml+xmlで配布していないことが原因です。
text/htmlで配布する場合XPathの名前空間接頭辞を取り外し,
引数として与えている名前空間リゾルバをnullにしてください。

もう一つは,gooのシステムがURIっぽい文字列の前後に文字を埋め込むため,これを削除しないと正しい名前空間宣言として認識してくれなかったり,名前空間リゾルバ中の文字列リテラルが崩れたりします。かなり苦労しないと回答時には直せないので直しません。

Q. IEで動作しないんですが。
A. 理由は色々ありますが,直す気がありません。
application/xhtml+xmlをIEが読まないこと。
application/ecmascriptをIEが読まないこと
document.evaluateがIEにないこと

Q.他に言いたいことは?
A.getElementByIdは単一の要素返すからElementですけど,
getElementsByTagNameはノードリストなのでElementsなんですよね…。
-->
    • good
    • 1

No2です。

質問の趣旨を捉え違えていたようです。ごめんなさい。。。

1行目だけ取りたいなら以下のような方法でいかがでしょうか?

var divNode = document.getElementById("box");
var trNodeList = divNode.getElementByTagName("TR");
var tdNodeList = trNodeList[0].getElementByTagName("TD");
    • good
    • 1

DOMを利用しても良いですが


どちらかというとJavaScript(HTML)では
classNameプロパティを使う人の方が多いかと思います。

var divNode = document.getElementById("box");
var tdNodeList = divNode.getElementByTagName("TD");
for(var i = 0; i < tdNodeList.length; i++) {
 tdNodeList[i].className = "ClassName";
}

こんな感じでしょう。(※誤字あったらスマソ)
ちなみに上記例では「セル1~6」に対してclass名を付けています。
    • good
    • 0

答えをそのまま書くのは約束でできないからヒントを



・div['box']の中の「td」群を取り出す。
・該当する値が入っているなら class という名前の「属性」に値を書き込む

こんな流れになるよ。


http://www.tohoho-web.com/js/dom.htm#getElements …
「javascript dom」辺りで探すと良いよ。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A