
オブジェクトの座標位置を取得する"offsetTop"はTABLEタグ内のものには使えないとありました。
(参考質問URL:http://oshiete1.goo.ne.jp/kotaeru.php3?q=1556067)
参考URLの回答例を見ながら、簡単なソースを組んでみたのですが、結果が「0」となってしまい値がとれていません。
(TABLEタグにはいっていなければ取得できます)
何がいけなくてこうなってしまっているのかわからず、大変悩んでいます。
お分かりになられる方、ご教授お願いいたします。
(文字数制限の関係で、インデントがとれてません。みにくくてごめんなさい)
<xmp>
<html>
<head>
<script language="JavaScript" type="text/javascript">
<!--
function absOffsetTopR(el){
if(el.offsetParent.tagName.toLowerCase()=="body"){
return el.offsetTop;
}else{
return el.offsetTop+absOffsetTopR(el.offsetParent);
}
}
function absOffsetTop(id){
var el=document.getElementById(id);
if(el.offsetParent.tagName.toLowerCase()=="body"){
return el.offsetTop;
}else {
return absOffsetTopR(el);
}
}
//-->
</script>
</head>
<body>
<form name="fm_test">
<table name="testTable" border="1" width="150">
<tr>
<td align="center">
<input type="text" size="20" name="testText">
<script language="JavaScript" type="text/javascript">
<!--
zahyo = absOffsetTop("testText");
document.fm_test.elements["testText"].value=zahyo;
//-->
</script>
</td>
</tr>
</table>
</form>
</body>
</html>
</xmp>
No.2ベストアンサー
- 回答日時:
#1>・座標を求める対象物にはIDを振る必要があるのに、それがなかった
そうです。
プログラムの
var el=document.getElementById(id);
の部分で、エレメントの特定をしていますが、
これは、エレメントに振られたidを元にする特定するメソッドです。
なので、このプログラムの場合、idを渡してやる必要があり、したがってエレメントにidを振っておく必要がありました。
エレメントの特定方法は他にも色々あります。
例えば、質問の例であれば
document.fm_test.testText
としても特定できます。
(つまり
var el=document.getElementById(id);
は、
var el=document.fm_test.testText;
に置き換えられます。
)
ただ、一般的に、
id は、ほとんど全てのエレメントに振ることができますが、
name は、一部のエレメントにしか振ることができません。
また、id は、定義からは、そのページに唯一1つとなっていますから、エレメントを特定するのにgetElementById を使って直接決定できます。
つまり、このような場合に、必ずしもidを使わなければならないというわけではないが、idを使った方法の方がより汎用性があると言えると思います。
#1>・座標を求める対象物がロードされる前に、座標を取ろうとしていた
そうです。
今回の場合、座標計算を呼び出し設定するスクリプトの位置が<td>の中にありました。
つまり、その場合、<td>も<tr>も<table>もいわば作りかけの状態であり、(少なくとも)完成したオブジェクトではありません。
ブラウザがその構成要素の配置を計算する時、
どのタイミングで、構成位置を計算するかはブラウザによって異なるでしょうが、未完成の部品を配置していっている途中ではその位置を確定できてなくてもしょうがないと思います。
(というか、確定できない部分が多いのでむしろ確定できない(ブラウザの動作として途中ではしない)のが一般的じゃないかなと思います、逆にimg エレメントのwidth やheight のように、指定してやると(画像を実際に読込終わるより)早くに確定できる情報もあります)
No.1
- 回答日時:
プログラムは、id を使って座標を求めようとするエレメントを同定しますからid を振ってやる必要があります。
なので
<input type="text" size="20" name="testText">
を
<input type="text" size="20" name="testText" id="testText">
のように変更します
<script language="JavaScript" type="text/javascript">
<!--
zahyo = absOffsetTop("testText");
document.fm_test.elements["testText"].value=zahyo;
//-->
</script>
の部分が埋め込まれていますけど、
ページのロードが完了してから実行するようにします。
埋め込まれていたスクリプトは削除して
<head></head>の中のスクリプトの方に移します
例えば、
function setValue(){
document.fm_test.elements["testText"].value=absOffsetTop("testText");
}
のような関数を書きます。
<body onload="setValue()">
のようにして、ページのロードが完了したら実行されるようにします。
この回答への補足
ご回答ありがとうございます。
無事、ソースを組めました!
ただ、確認させていただきたいのですが、今回のうまくいかなかった原因としては
・座標を求める対象物にはIDを振る必要があるのに、それがなかった
・座標を求める対象物がロードされる前に、座標を取ろうとしていた
という認識であっていますか?
お手数ですが、お返事いただけると嬉しいです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ActiveXobjectが作成できない
-
<a>タグのテキストを取得
-
日本語入力の禁止
-
javascriptで、表示されている...
-
同じIDで定義した要素の配列を...
-
ボタンをクリックすると数が増...
-
ASP.NET MVCでObjectをjsに渡す
-
Strutsで半角英数字1文字以上
-
JavaScriptで、現在日時から100...
-
window.openでタイトル名の指定
-
雪を降らせるみたいな、ゆらゆ...
-
関数でy=g(x)のgとは何の略です...
-
C#OpenCv V4にのエラーに関する...
-
翌月を取得するGASが分かりません
-
【正規表現】【javascript】CR...
-
javascriptでiframeのURL変更は?
-
イベントが初めの一回しか起き...
-
javascriptで2つのArrayの...
-
JavaScriptが期待どおりに動い...
-
クリックすると上に開くアコー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ActiveXobjectが作成できない
-
<a>タグのテキストを取得
-
onchangeイベントを使ってspan...
-
javascriptで編集可能不可能の...
-
innerHTML実行後のイベント
-
javascriptの質問です
-
クリックでURLに飛ばすときに、...
-
ボタン上でマウスを押している...
-
別フレームのタグ属性を取得す...
-
DIV内のDIV要素を移動する。
-
HTML:Tableタグに対し、JavaScr...
-
任意の座標をクリックさせるには
-
お気に入り用のボタンを配置し...
-
1つの処理で複数表示させたい
-
WordPressのコンタクトフォーム...
-
指定した数値同士を合計計算し...
-
JavaScriptで文字列の置き換え
-
フォーカスを合わせる
-
div要素内の全input要素をdisable
-
[javascript]DOCTYPE宣言対応に...
おすすめ情報