インラインフレーム内全ての項目をdisabledにする

[新着] Webテンプレートを仮オープンしました



0   名前: かずお : 2006/11/17(金) 18:46  ID:j4Ls6BUt
【現在の状況】
→ どのような問題が起きているのかを、具体的に記入してください。

インラインフレーム内の項目全てをdisabledにしていますが、disabledにする処理に5秒ほど掛かってしまっています。

【どうしたいのか】
→ 本来あるべき正常な状態を、具体的に記入してください。

出来るだけ処理時間を短縮したい。

パフォーマンスを上げる為にループでは無く、画面内の項目を一括でdisabledにするようなことは可能でしょうか?
もしくは、パフォーマンスを上げる方法がありましたらご教授願います。

【何をしたのか】
→ 何をしたら問題が起きたのか、環境の変化はなかったか、などを記入してください。
→ 原因として可能性のあるものを全て提示してください。
→ 必要に応じてソースやURLを提示してください。

【備考】
→ その他、回答者の参考になるような情報があれば記入してください。
→ 特定のツールに関連がある場合は、その名称やバージョンを記入してください。
→ ※矢印の付いた行は削除して使用してください。

OS:Windows2000Terminal
ブラウザ:IE6.0

※インラインフレーム内の項目は300項目あります。

for (var i = 0; i < iform1.document.f01.length; i++) {
  iform1.document.f01.elements[i].disabled = true;
}


不備がありましたらご指摘下さい。
宜しくお願い致します。

1   名前: K+S : 2006/11/17(金) 18:46  ID:nROqylMa
> インラインフレーム内全ての項目をdisabledにする

何のために実現する必要があるのでしょうか。


> ※インラインフレーム内の項目は300項目あります。

項目とは何でしょうか。

2   名前: 匿名 : 2006/11/17(金) 18:46  ID:9aAn00vg
DOM TraversalもDOM XPathも使えないIEならば

・lengthに毎回アクセスするのは時間の無駄
(HTMLCollectionは活きているのだからアクセスのたびに再検索される)

・毎回親オブジェクトのプロパティを辿るのは時間の無駄
(毎回iframe要素の検索から行うようでは話にならない)

だから積極的にスナップショットを撮るしかないんじゃない。

3   名前: かずお : 2006/11/17(金) 18:46  ID:j4Ls6BUt
K+S様、匿名様返信ありがとうございます。

K+S様

>> インラインフレーム内全ての項目をdisabledにする

> 何のために実現する必要があるのでしょうか。

実現する必要性としては、画面がヘッダーとフッターで分かれており、初期表示の際はフッターが編集不可となって
おります。(ヘッダー:基本情報 フッター:詳細情報)

初めヘッダーで基本情報の読み込みを行い、各入力項目の入力をします。
ヘッダーの整合性のチェックを行い、それが通るとヘッダーが編集不可となり、詳細情報の入力が出来るようになります。

インラインフレームは、フッターに2箇所ありますが片方だけ入力項目がある状態です。

>> ※インラインフレーム内の項目は300項目あります。

> 項目とは何でしょうか。

項目とは入力項目のことでdisableにする項目です。内容はチェックボックスが50件、テキストボックスが250件となっております。


匿名様

> DOM TraversalもDOM XPathも使えないIEならば

今回は使うことが出来ません。

> ・lengthに毎回アクセスするのは時間の無駄
> (HTMLCollectionは活きているのだからアクセスのたびに再検索される)

lengthではなく固定値でということで宜しいでしょうか?

> ・毎回親オブジェクトのプロパティを辿るのは時間の無駄
> (毎回iframe要素の検索から行うようでは話にならない)

現在、親画面からインラインフレームの制御を行っていますが、親画面から子画面の関数を呼び
disable処理を行うということでしょうか?

> だから積極的にスナップショットを撮るしかないんじゃない。

こちらは私の知識不足というか、理解能力が無いのか理解が出来ませんでした・・・。


説明が上手く出来ていませんが、宜しくお願いいたします。

4   名前: 匿名 : 2006/11/17(金) 18:46  ID:Tv3SVOHh
フッタの iFrame にはダミーのHTML(読み込み中ですなどと表示した物)を表示しておいて、ヘッダの読み込みが終わったあと JavaScript でフッタの書き換えをしたらどうでしょうか?

5   名前: ラブーフ : 2006/11/17(金) 18:46  ID:mGMjLPPf
for (var i = 0; i < iform1.document.f01.length; i++) {
  iform1.document.f01.elements[i].disabled = true;
}

ここを、
var _f01 = iform1.document.f01;
var _f01_len = _f01.length;

for (var i = 0; i < _f01_len; i++) {
  _f01.elements[i].disabled = true;
}

にするだけでも、かなり違うと思いますよ、特にIEの場合。

6   名前: 匿名 : 2006/11/17(金) 18:46  ID:9aAn00vg
>>3
ごめん。>>5のように書くことを言いたかったんだ。
よく考えたらform要素の保持はスナップショットにならないしね。失礼。

>>4
試してないけど面白いアイデアだと思った。
innerHTMLではなく、appendChildとDocumentFragmentなら相当速いかも。
でもそれだとremoveChildで時間をとられるか…?

7   名前: かずお : 2006/11/17(金) 18:46  ID:j4Ls6BUt
4.匿名様、ラブーフ様、6.匿名様返信ありがとうございます。

返信が遅くなってしまい申し訳ありません。

4.匿名様

>フッタの iFrame にはダミーのHTML(読み込み中ですなどと表示した物)を表示しておいて、ヘッダの読み込みが終わ
>ったあと JavaScript でフッタの書き換えをしたらどうでしょうか?

ダミーのHTMLを表示しておくというのは考えていませんでした。
ただ、画面全体が表示されるまでの時間を短縮させたいとの要望の為、今回は許されないと思います。
そのような方法があると大変勉強になります。ありがとうございます。

ラブーフ様

>var _f01 = iform1.document.f01;
>var _f01_len = _f01.length;

>for (var i = 0; i < _f01_len; i++) {
> _f01.elements[i].disabled = true;
>}

>にするだけでも、かなり違うと思いますよ、特にIEの場合。

考え方としては、withを使うような感じでしょうか。
こちらはまだ試していなかったので、試してみたいと思います。
ありがとうございます。

6.匿名様

>試してないけど面白いアイデアだと思った。
>innerHTMLではなく、appendChildとDocumentFragmentなら相当速いかも。
>でもそれだとremoveChildで時間をとられるか…?

DocumentFragementですが、インナーフレームを使わないで実現するといった方法でしょうか。
現在どうしても調べる時間がない為、時間があったら試してみたいと思います。

現在はdisabledにするのに一番時間が掛かってしまっている為、そこの改善を最優先とさせて頂きたいと思います。
もし、DocumentFragementでそれも実現出来るようなことでしたら申し訳ありません。

8   名前: Chip : 2006/11/17(金) 18:46  ID:iXTrKUp6
disableにする目的が整合性のために入力内容を変えさせないってだけなら

こんな風にしてもいいかも。
function hoge(O){
  if(今は入力していい?){
    return;
  } else {
    O.blur();
  }
}
<input 〜 onfocus(this)>
<input 〜 onfocus(this)>
<input 〜 onfocus(this)>


9   名前: Chip : 2006/11/17(金) 18:46  ID:iXTrKUp6
>>8
input の部分意味不明だった。

function hoge(O){
  if(今は入力していい?){
    return;
  } else {
    O.blur();
  }
}
<input 〜 onfocus="hoge(this)">
<input 〜 onfocus="hoge(this)">
<input 〜 onfocus="hoge(this)">


10   名前: かずお : 2006/11/17(金) 18:46  ID:j4Ls6BUt
Chip様、返信ありがとうございます。

今回は私が担当している画面でだけではなく、他の画面でも同じことをやっています。
ただ、画面の規模が違う為私が担当の画面のみパフォーマンスの問題に引っかかって
しまっています。(実際WEB側だけでなくAP側の問題もあるわけですが・・・)

他の画面も同じようにdisabledで処理を統一している為、変更することが出来ません。

blur()とは画面からフォーカスを外すんですね。色々やり方はあるもんですね。
勉強になります。ありがとうございます。

11   名前: 匿名 : 2006/11/17(金) 18:46  ID:X7MtaP2L
bodyをdisabledとか・・
透明な枠を張るとか・・・

12   名前: かずお : 2006/11/17(金) 18:46  ID:j4Ls6BUt
11.匿名様、返信ありがとうございます。

> bodyをdisabledとか・・
> 透明な枠を張るとか・・・

bodyをdisabledで試して見ました。

iform.document.body.disabled = true;


このような記述で宜しいのでしょうか?(調べたページではこんな感じでした)
結果は、チェックボックスは全てdisabledになりましたが、テキストボックスがdisabledになりません。
もしかしたら子画面に問題があるのかもしれません・・・。


ラブーフ様

テストしてみました。結果として1秒近く速くなりました。
ありがとうございます。

他にも色々試してみます。

あと大切?な情報を忘れていました。画面はJSPです。
「それを早く言え!」と思った方、申し訳ありません・・・。

一覧へ戻る