HTML上の複数同一タグの特定の属性値を全て取得するには?

解決


飲兵衛  2003-03-02 06:42:46  No: 77273

はじめまして
Webフォーム上の<input>のNAME属性値を、getElementsByTagName("input")を利用して取得しています。

しかしながら、複数の<input>タグが存在する場合、HTML記述上の一番最初の<input>タグのNAME属性値しか拾ってくれないので悩んでいます。

具体的には
<input name=a>
<input name=b>
と記述されている場合には"a"の値しか拾えません。

Webフォーム上の複数同一タグの特定の属性値を全て取得するにはどのようにしたらよいのでしょうか。(上の例でたとえるなら"a"も"b"も取得したいのです。)
どうか宜しくご指導願います。


魔界の仮面弁士  2003-03-02 07:39:41  No: 77274

> 複数の<input>タグが存在する場合、HTML記述上の一番最初の<input>タグの
> NAME属性値しか拾ってくれないので悩んでいます。

実際のコードを見てないので、間違っているかもしれませんが…もしかして、
メソッドの戻り値を Forループ等で列挙させていないのではないでしょうか。

# getElement系メソッド(getElementById等)は、単一の要素(またはNothing)オブジェクトを返しますが、
# getElements系メソッド(getElementsByTagName等)は、0個以上の要素を含んだコレクションオブジェクトを返します。


飲兵衛  2003-03-02 16:49:15  No: 77275

>  メソッドの戻り値を Forループ等で列挙させていないのではないでしょうか。

はい、その通りです。
ループさせていませんでした・・・
しかし、ループ関連構文は理解しているのですが、今回のようなケースの場合はどのようにコーディングしたら良いのか皆目見当がつきません。

値取得部のコードを以下のようにした場合、
varOBJはオブジェクトを、strNAMEはそのNAME属性値を返してくれていますが、
その値を列挙するにはどのようにしたら良いのでしょうか?
varOBJが複数のオブジェクトを含んだ形になるのでこれを条件式に使うことは想像できるのですが・・・

 varOBJ = doc.getElementsByTagName("input")
 MsgBox varOBJ, vbSystemModal
 strNAME = varOBJ.Name
 MsgBox strNAME, vbOKCancel

宜しくご指導願います。


魔界の仮面弁士  2003-03-03 02:02:31  No: 77276

最初の質問で[Web フォーム]という言葉が出てきたので、
ASP.NET(+VB.NET)の話題かと思ってしまいました。(^^;

「GetElementsByTagName」ではなく、
「getElementsByTagName」という事だったので、
VB6 + WebBrowser/InternetExplorer (+ MSHTML)という
可能性も考えては居ましたけれど……今回の質問の構文をみると、
どうやら .NET 以前のVBの事を質問されていたようですね。

.NET以前のVBでオブジェクトを扱うときは、代入時に、
必ずSetステートメントを使う必要がある事に注意してください。
つまり、
  varOBJ = doc.getElementsByTagName("input")
ではなく、
  Set varOBJ = doc.getElementsByTagName("input")
という事です。

# Setあり無し、それぞれの構文を実行後、
# MsgBox TypeName(varOBJ) でオブジェクトの型を見てみると、
# それぞれ、結果が異なっていることがわかるかと思います。

この事は、HTMLのオブジェクト以外の物を扱う場合にも言える事です。
例えば、
  Set varObj = Form1.Text1
とすると、TextBoxコントロールオブジェクトそのものが 
varObj変数に格納されますが、これを
  varObj = Form1.Text1
のようにしてしまうと、TextBox自体ではなく、
TextBoxの標準プロパティであるTextプロパティの値が
参照されるため、結果的に
  varObj = Form1.Text1.Text
と同じような意味になってしまうのです。

HTMLの場合でいうと、getElements系が返す「allオブジェクト」という
コレクションは、「itemプロパティ」という規定プロパティを持ちます。
そしてitemプロパティは、引数無しで呼ばれると、その先頭要素を
戻す事になっているのです。

****************************************
さて、長々と書いてしまいましたが、本題に戻りますと。。。

1.  Setステートメントを使って、INPUTのコレクション(allオブジェクト)を取得する。
      Set varOBJ = doc.getElementsByTagName("INPUT")

2.  For Eachループを使ってallの中身を列挙する。
      For Each varItem In varOBJ
        MsgBox varItem.name
      Next

もしくは、

1.  Setステートメントを使って、INPUTのコレクション(allオブジェクト)を取得する。
      Set varOBJ = doc.getElementsByTagName("INPUT")

2.  allオブジェクトのlengthプロパティを使って、要素数を調べる。
      Max = varOBJ.length

3.  For ループと、allのitemプロパティを使って、各要素を列挙する。
      For N = 0 To Max - 1
          MsgBox varOBJ.item(N).name
      Next

というコーディングとなります。

ちなみに、先に書いたように「itemプロパティ」は、allの規定プロパティであるため、
上記の3.の記述は、[item]を省略して、『MsgBox varOBJ(N).name』のようにしてもOKです。


飲兵衛  2003-03-03 02:35:04  No: 77277

魔界の仮面弁士さんの通りにしたら出来ました。
ありがとうございます。
魔界の仮面弁士さんの知識の広さには驚かされます。
今回の件も大変勉強になりました。
今後もよろしくお願い致します。

※  私はVB6.0を使用しているのですが自分の環境を書き込むのを忘れてました。申し訳ありませんでした。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加