- PR -

JavaScript

投稿者投稿内容
ビギ
ベテラン
会議室デビュー日: 2006/04/03
投稿数: 56
投稿日時: 2008-06-07 17:23
ボタンをクリックしたら、frame内に最新の情報を表示するアプリを作成しました。
表示方法は、GETでパラメータをCGIアプリ(c++)に渡して、iframe内に情報をはき出しています。で、はきだした情報の件数を inputタグのhiddenに持ち、その値を親フレームのテキストエリアに表示させたいのですが、うまくいきません。

onclickのイベントで、

ABC(iframeのame).location.href="HYOUJIG.EXE?FORM=FOOM" +
"&ACTION=1" +・・・
を行い、その中の件数(DATACNT)を

dcnt = ABC.document.getElementById("DATACNT");
dc = dcnt.value;
var divObj = document.getElementById("KEN);
  divObj.innerText = dc;

という感じで表示させてるのですが、内容が一つ前の情報・・・というか、
最新の情報の取得が間に合わないようです。

まず、iframe内の表示をし、それが終わったら
最新件数を表示させるにはどうしたらいいのでしょうか。

親フレームに表示させる前にalertをいれて動かしてみたら、
alertが先に動き、その後に
iframe内の表示をしました。
(順番が違う・・・)

iframe内の onLoad()が使えればいいのでしょうが
ある関数を使用しているため、onLoadを使うとその関数が効かなくなるので使えません。

どんなアドバイスでもいいので
よろしくお願いします!!!


ぴあちゃん
ぬし
会議室デビュー日: 2008/02/07
投稿数: 287
投稿日時: 2008-06-07 19:23
>親フレームに表示させる前にalertをいれて動かしてみたら、
>alertが先に動き、その後に
>iframe内の表示をしました。
>(順番が違う・・・)

具体的に何をどーしているのですか?

>iframe内の onLoad()が使えればいいのでしょうが
>ある関数を使用しているため、onLoadを使うとその関数が効かなくなるので使えません

ある関数ってなんですか?onload を使うと何がダメなのか教えてください。

#


ビギ
ベテラン
会議室デビュー日: 2006/04/03
投稿数: 56
投稿日時: 2008-06-07 21:04
ボタンをクリックしたら 下記のようなzzz()が動きます。

function zzz{
// iframeに表示
ABC.location.href="HYOUJI.EXE?FORM=FOOM" +
"&ACTION=1" +・・・ ;

★★ alert("koko");

// テキストエリアに最新件数を表示
 dcnt = ABC.document.getElementById("DATACNT");
 dc = dcnt.value;
 var divObj = document.getElementById("KEN);
 divObj.innerText = dc;
}

★★の部分にalert("koko"); を入れてみたら
iframeを表示
    ABC.location.href="HYOUJI.EXE?FORM=FOOM" + ・・・
する前に alertウインドウが表示され、
「OK」を押したらiframe内に最新情報を表示しました。
HYOUJI.EXEの方が前に欠いてあるのに、動くのが遅いのです。


>ある関数ってなんですか?onload を使うと何がダメなのか教えてください。

iframe内にテーブル形式でデータを表示してるのですが、そのテーブルの先頭行が見出しになっていて、見出しはスクロールしないで固定表示させたまま、データだけをスクロールさせる関数です。(どなたかが作られたJavaScriptを使わせていただいています。)
その関数を使う場合onLoad()があると、見出し部分が2行表示されてしまうので、onLoad()は使えないのです。(使わないでください・・・と注釈がありました)

よろしくおねがいします。

ぴあちゃん
ぬし
会議室デビュー日: 2008/02/07
投稿数: 287
投稿日時: 2008-06-07 22:33
まず、確認して下さい。

(1)HTML を2つ用意する(*1 と *2)。
(2)*1 に <iframe> を用意し、src に *2 を指定する。
   onreadystatechange="alert(this.readyState)" イベントを追加すること。
(3)*2 の onload で alert("OK") を表示するようにして下さい。

*1 を表示したとき、
[1] complete / OK / interactive と表示された場合
  onreadystatechange を使ってください。
[2] complete / interactive / OK と表示された場合
  ヘッダ固定するスクリプト側の onload を attachEvent に変更して下さい。

# ローカルで試すと loading ってのも出てくるのね。

# 答えは [1] です。

# 詳細は、onreadystatechange をぐぐってみて下さい。
# で、作業は、interactive 通知の時に行います。





[ メッセージ編集済み 編集者: ぴあちゃん 編集日時 2008-06-07 22:35 ]

[ メッセージ編集済み 編集者: ぴあちゃん 編集日時 2008-06-07 22:39 ]

[ メッセージ編集済み 編集者: ぴあちゃん 編集日時 2008-06-07 22:43 ]
ぴあちゃん
ぬし
会議室デビュー日: 2008/02/07
投稿数: 287
投稿日時: 2008-06-07 22:59
# サッカー負けそう・・・
コード:
function zzz() {
   var o = document.getElementById("IFRAME1");

   o.onreadystatechange = function() {
       if (this.readyState == "interactive") {
          //何か処理
          document.getElementById("TextBox1").value = o.getXXX();
       }
   };

   o.src = "xxx.EXE?...";

}



IE と 他のブラウザでは挙動が異なるかもしれません。
他も対応なら個別で調査してから実装して下さい。

IFRAME 内コンテンツの何かを利用したい場合は、直接その何かに
アクセスしようとするのではなくて、getXXX() なりメソッドを用
意しておくと良いでしょう。

ビギ
ベテラン
会議室デビュー日: 2006/04/03
投稿数: 56
投稿日時: 2008-06-07 23:44
ぴあちゃんさん、ありがとうございます。


function zzz() {
var o = ABC.document.getElementById("IFRAME1");
o.onreadystatechange = function() {
if (this.readyState == "interactive") {
//何か処理
dcnt = ABC.document.getElementById("DATACNT");
dc = dcnt.value; ★
var divObj = document.getElementById("NEWCNT");
divObj.innerText = dc;
}
};
o.src = "HYOUJI.EXE?...";
}

で、試してみました。
★のところでエラーになりました。

IFRAME内には「DATACNT」が常時設定されていて、最新情報が表示され、値が変わったら
var divObj = document.getElementById("NEWCNT");
divObj.innerText = dc;
をやりたいのですが、使い方が間違ってるでしょうか。。。


>var o = ABC.document.getElementById("IFRAME1");
>o.onreadystatechange = function() {

は、IFRAME1を監視ですよね?

IFRAME内のid、「DATACNT」の値が変わったら・・・なんていう監視はできないのでしょうか。
私にとって、だんだん難しくなってきてしまい、
不勉強で申し訳ありませんが
よろしくお願いします。
ぴあちゃん
ぬし
会議室デビュー日: 2008/02/07
投稿数: 287
投稿日時: 2008-06-08 02:02
>★のところでエラーになりました。
だから何?

です。

鵜呑み・コピペはやめてください。

以下のサンプルで理解できたら、自分のコードに組み込んで結果を教えて下さい。

「出来ました、ありがとうございます」ってのは無しです。

コード:

IFRAME が存在するHTML 1.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<TITLE></TITLE>
<script>
function xxx(e) {

var o = document.all ? e.srcElement : e.target != null ? e.target : e.currentTarget;

if (document.all) {

if (o.readyState.indexOf("interactive") > -1) {
document.getElementById("DIV1").innerText = o.contentWindow.getXX();
}
}
else {
document.getElementById("DIV1").appendChild(document.createTextNode(o.contentWindow.getXX()));
}

}
function setTEXTAREA1(s) {
alert("INPUT:" + s);
return s + " .... OK ";
}
</script>
</HEAD>
<BODY>
<iframe src="2.html" onreadystatechange="xxx(event)" ID="IFRAME1" onload="xxx(event)"></iframe>
<div id="DIV1"></div>
</BODY>
</HTML>

※Firefox2.0 でも動作するように訂正



コード:

xxx.EXE が吐き出す HTML 2.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<TITLE>2.html</TITLE>
<script>
window.onload = function() {
alert("OK:2");

alert(parent.setTEXTAREA1(getXX()));
}
function getXX() {
return document.getElementById("TEXTAREA1").value;
}
</script>
</HEAD>
<BODY>

<textarea id="TEXTAREA1">あいう</TEXTAREA>

</BODY>
</HTML>



訂正:
//alert(document.getElementById("IFRAME1").window.getXX);
//IFRAME て getElementById じゃ取れないの?
document.getElementById("IFRAME1").contentWindow.getXX
ですね。


[ メッセージ編集済み 編集者: ぴあちゃん 編集日時 2008-06-08 02:41 ]

[ メッセージ編集済み 編集者: ぴあちゃん 編集日時 2008-06-08 03:02 ]
ビギ
ベテラン
会議室デビュー日: 2006/04/03
投稿数: 56
投稿日時: 2008-06-08 16:37
ぴあちゃんさん、ありがとうございます。
理解できていないので、鵜呑み・コピペでしかできず、そこから理解できれば・・・と思ったのですが、思ってもいないところでエラーになってしまったので・・・失礼しました。

なるべく理解しながら・・と取り組んでいますが、なかなか難しくまだ時間がかかりそうです。
IFRAME内に吐き出す方だけ組み込んでみましたが、onloadを使うとやはりテーブルの見出しが2行になってしまうので、onloadではない方法を考えないとダメだと思っています。
取り急ぎのご報告でした。

スキルアップ/キャリアアップ(JOB@IT)