要素を検索する方法は他にもたくさんあります。
DOM(Document Object Model)では、ターゲットとするノードを
基準にすると以下のような関係になる。
childNodesについては、子ノードが存在しない場合は空のノードリ
ストが返るが、それ以外は存在しなければnullが返る。
読み出し専用。
parentNode
previousSibling ターゲット nextSibling
childNodes ( firstChild childNodes.item(1) .. lastChild )
itemメソッドは0から始まるソース上での出現順で検索する。存在しない場合はnullが返る。
<SCRIPT type="text/javascript">
<!--
function myFunc1(obj){
if(document.styleSheets) obj.style.backgroundColor="#ccf";
}
function myFunc2(obj){
if(document.all)
obj.parentElement.style.backgroundColor="#fcc";
else if(document.styleSheets)
obj.parentNode.style.backgroundColor="#fcc";
}
function myFunc3(obj){
if(document.all)
obj.parentElement.parentElement.style.backgroundColor="#cfc";
else if(document.styleSheets)
obj.parentNode.parentNode.style.backgroundColor="#cfc";
}
//-->
</SCRIPT>
<P> <SPAN onmouseover="myFunc1(this)" onclick="myFunc2(this) ondblclick="myFunc3(this)"">イベントを受け取る要素</SPAN> </P>
DOMではテキストノードやコメントノードもカウントするため、IEのDHTML Object Modelとインデックスが異なる。子孫ではなく子であることに注意。
<SCRIPT type="text/javascript">
<!--
function myFunc4(obj){
if(document.all)
obj.children.item(0).style.backgroundColor="#ccf";
else if(document.styleSheets)
obj.childNodes.item(1).style.backgroundColor="#ccf";
}
function myFunc5(obj){
if(document.all)
obj.children[1].children[0].style.color="blue";
else if(document.styleSheets)
obj.childNodes[3].childNodes[1].style.color="blue";
}
//-->
</SCRIPT>
| X | document.write(X) |
|---|---|
| document.documentElement | |
| document.getElementsByTagName | |
| document.getElementById | |
| document.getElementsByName |
DOMを利用。IE5/6はいつものように中途半端に、Netscape6は細かいバグが目立つがDOM2の大部分までサポートしている。毎度のことながら、IEはOSによって動作が異なる場合も多い。
namedItemメソッドはid属性値を検索後、name属性が許されていればname属性値も検索する。存在しない場合はnullが返る。
tagNameプロパティは読み出し専用で、要素名をHTMLの場合は大文字で返す。
<SCRIPT type="text/javascript">
<!--
function fDom1(){
if(document.documentElement)
alert(document.documentElement.tagName);
}
function fDom2_1(){
if(document.getElementsByTagName){
var obj=document.getElementsByTagName("SPAN").item(6);
obj.style.display="block";
}
}
function fDom2_2(){
if(document.getElementsByTagName){
var obj
=document.getElementsByTagName("INPUT").namedItem("bN1");
obj.style.marginLeft="100px";
}
}
function fDom2_3(){
if(document.getElementsByTagName){
var vA=document.getElementsByTagName("IFRAME");
var vB=document.getElementsByTagName("SPAN").item(1000);
var vC=document.getElementsByTagName("LINK").item(0).childNodes;
if(vA!=null && vC!=null) alert(vA+"\n"+vB+"\n"+vC);
// IFRAME要素は存在しないが、vAはnullではない。
// LINKは空要素だが、vCはnullではない。
}
}
function fDom3(){
if(document.getElementById){
var obj=document.getElementById("dom1");
obj.style.backgroundColor="yellow";
}
}
function fDom4(){
if(document.getElementsByName){
var obj=document.getElementsByName("bN1").item(0);
obj.style.padding="10px";
}
}
//-->
</SCRIPT>
<SPAN id="dom1">SPAN</SPAN>
<INPUT type="button" name="bN1" value="bN1">
span
← WinIE5(MacIE5, WinIE6はOK)はエラーになる
※全ての要素にマッチする特別な値として「"*"」を使用することができるのですが、WinIE5(MacIE5, WinIE6はOK)は正しく実装していません。
要素へのリファレンスを取得後、getElementsByTagNameメソッドで子要素集合にアクセスすることも可能ですが、getElementByIdやgetElementsByNameメソッドは使えません。
IE4以降のみ(iCabも?)で利用できる全要素の集合体。インデックスは0から始まるソース上での出現順。
<SCRIPT type="text/javascript">
<!--
function fAll(){
if(document.all){
document.all("bN2",0).style.margin="2em";
// document.all("bN2")
// document.all.tags("INPUT").item(1)
document.all("id1").style.color="red";
// document.all.item("id1")
// document.all.tags("SPAN").item(7)
}
}
//-->
</SCRIPT>
<SPAN id="id1">span</SPAN>
<INPUT type="button" name="bN2" value="test" onclick="fAll()">
span
NN4のみで利用できる。LAYER(独自拡張), ILAYER(独自拡張), 絶対配置, 相対配置要素の集合体。Netscape6ではサポートされていない。
<SCRIPT type="text/javascript">
<!--
function fLayer(){
if(!document.layers) return; // サポートしていなければスキップ
var parentLayer=document.layers["layer1"];
var childLayer=parentLayer.layers["layer2"];
childLayer.bgColor="silver";
parentLayer.bgColor="yellow";
}
//-->
</SCRIPT>
<DIV id="layer1" style="position: relative">layer1
<SPAN id="layer2" style="position: relative">layer2</SPAN>
</DIV>
文書の内容がBODYで包含されていればBODY要素、フレームセット文書であれば最も外側のFRAMESET要素を返す。
<SCRIPT type="text/javascript">
<!--
function fBody(p){
if(document.styleSheets){
document.body.style[p]="5em";
document["bo"+"dy"]["style"]["marginBottom"]="5em";
}
// document.getElementsByTagName("BODY").item(0)
}
//-->
</SCRIPT>
文書の全IMG要素の集合体。
<SCRIPT type="text/javascript">
<!--
var myImg;
if(document.images){ // NN3, IE4以降
myImg=new Image(); // ダウンロードしておく
myImg.src="img/img2.gif";
}
function fImage(){
if(document.images) document.images["img1"].src=myImg.src;
if(document.styleSheets){
var imgS=document.images[0].style;
// document.getElementsByTagName("IMG").item(0)
// document.getElementById("img1")
// document.getElementsByTagName("IMG").namedItem("img1")
imgS.width="50%";
imgS.height="20px";
imgS.border="5px double red";
}
}
//-->
</SCRIPT>
<A href="uri" onmouseover="fImage()" onclick="return false">
<IMG src="img/img.gif" name="img1" id="img1" width="30"
height="30" alt="サンプル画像" onclick="fImage()"></A>
文書の全OBJECT要素(APPLET要素を含む)の集合体。
<SCRIPT type="text/javascript">
<!--
function fApplet(){
if(document.styleSheets){
var objS=document.applets[0].style;
objS.width="50%";
objS.height="20px";
objS.border="5px double red";
}
}
//-->
</SCRIPT>
<OBJECT data="img/img.gif" type="image/gif"
width="30" height="30" onmouseover="fApplet()">
サンプル画像
</OBJECT>
href属性に値を持つ全てのAREAとA要素の集合体。
<SCRIPT type="text/javascript">
<!--
function fLink(){
if(document.styleSheets){
document.links[17].style.textDecoration="underline overline";
document.links[18].style.display="none";
}
}
//-->
</SCRIPT>
文書の全フォームの集合体。プロパティとして、コントロールの全集合体であるelementsを持つ。各コントロールのformプロパティは、自身を含むFORM要素(存在しない場合はnull)を返す。
<SCRIPT type="text/javascript">
<!--
function fForm(){
var obj=document.forms[1];
// document.forms["fName1"];
obj.elements[0].value="入力欄1";
obj.elements["eName2"].value="入力欄2";
if(document.styleSheets){
obj.elements[0].style.width="100px";
obj.elements["eName2"].style.height="50px";
obj.style.backgroundColor="#48d1cc";
}
}
function fForm_2(){
if(document.styleSheets)
arguments[0].style.border="3px green solid";
}
//-->
</SCRIPT>
<FORM action="./" name="fName1">
<P>
<INPUT name="eName1"> <INPUT name="eName2">
<INPUT name="eName3" type="button" value="×"
onclick="fForm_2(this.form)"
ondblclick="fForm_2(this.form.elements[0])">
</P>
</FORM>
文書に含まれるname属性に値を持つ全てのA要素の集合体。
<SCRIPT type="text/javascript">
<!--
function fAnchor(){
var obj=document.anchors[0];
if(document.styleSheets)
obj.style.font="italic bold large Verdana, sans-serif";
}
//-->
</SCRIPT>
<P><A name="eName1" onclick="fAnchor()">anchor</A></P>
それぞれの集合体を構成している(読み込み済みの)要素の数は、lengthプロパティで取得できます。
<SCRIPT type="text/javascript">
<!--
function myFunc11(){
alert(document.links.length);
}
//-->
</SCRIPT>
<SCRIPT type="text/javascript">
<!--
function myFunc12_1(){
if(!document.styleSheets) return; // スキップ
var coll=document.links;
for (i=0,j=coll.length; i<j; i++){
coll[i].style.color="white";
coll[i].style.backgroundColor="black";
}
}
function myFunc12_2(){
if(!document.styleSheets) return;
var coll=document.links;
for (i=0,j=coll.length; i<j; i++){
coll[i].setAttribute("style"
,"color: blue;background-color: #fcc");
} // Netscape6ならまとめて書ける。
} // IE不可。
function myFunc12_3(){
if(!document.styleSheets) return;
var coll=document.links;
for (i=0,j=coll.length; i<j; i++){
coll[i].style.cssText="color: red;background-color: #ccf";
} // IE4以降はこれならOK。
}
function myFunc12_4(){
if(!document.styleSheets) return;
var coll=document.links;
for (i=0,j=coll.length; i<j; i++){
coll[i].removeAttribute("style");
}
}
//-->
</SCRIPT>
<SCRIPT type="text/javascript">
<!--
function myFunc13_1(){
if(!document.styleSheets) return;
var coll=document.links;
for (i=0,j=coll.length; i<j; i++){
coll[i].removeAttribute("style");
} // style属性を削除する。IE4/5(WinIE6はOK)不可。
}
function myFunc13_2(){
var coll=document.links;
if(!document.styleSheets) return;
for (i=0,j=coll.length; i<j; i++){
coll[i].style.cssText="";
} // IE4以降はこれならOK。
}
//-->
</SCRIPT>