- PR -

フレームをまたぐスクリプト

投稿者投稿内容
BB.NK
大ベテラン
会議室デビュー日: 2004/02/05
投稿数: 138
投稿日時: 2005-08-09 20:14
C#でWeb開発しております。
散々既出で申し訳ありませんが、確認させてください。

フレームA:DataGridでリスト表示
フレームB:ボタンB
ページC:CSVフォーマットをユーザが決定

ボタンBクリックで、RegisterStartupScriptで記述したフレームAのJavaScript関数を呼び、
別のページCを表示する。CSVフォーマットを決定したらページCから
フレームAのJavaScript関数を呼びポストバックさせる。
同時にページCはクローズ(パラメータをAに送信)
フレームAで保存しておいたdataViewからCSVファイルを作成する。
ダウンロード方法は、
content-disposition,attachment,application/octet-stream
あとencoding等々を記述しています。
ここまでは問題ありません。

ここで過去レスどおりの問題ですが、↓
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=6388&forum=7
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=20974&forum=7
フレームAにアクセスすると「未定義のエラー」が出ます。
理由は、↓の通り。
http://support.microsoft.com/default.aspx?scid=kb;ja;167796

ここらへんから曖昧になってしまって確認したいのですが、
ダウンロードが終わって元のページが表示された(ように感じる?)状態で、
フレームAのJavaScript関数が実行されると
document.all["test"]...なんて記述されたものはエラーが発生する。
(DataGridの選択で色を変えるといったことをJavaScriptで記述しています)

ダウンロードしている画面から記述すればアクセスできるので(?)、
下記は確認済みです。
window.parent.frameB.document....は取得可能。
しかし、
window.parent.frameA.document....に取得不可能。
つまり、このケースではダウンロード後に、フレームAのJavaScriptは実行不可能である
と考えてよいでしょうか?

また、勘違いをしている部分がありましたらご指摘願えますでしょうか。
よろしくお願いいたします。
BB.NK
大ベテラン
会議室デビュー日: 2004/02/05
投稿数: 138
投稿日時: 2005-08-10 09:15
自己レスです。
フレーム間云々と書きましたが違いました。

フレームA内にボタンを作成してCSVをダウンロードしてみました。
(ダウンロード方法は同じです。)
開く、キャンセル等のボタンで戻った場合は問題なし。
保存した後、フレームAのdocument以下が取得できません。

別の問題であることがわかりました。
もう少し調べてみます。

ご存知の方はヒントをいただけないでしょうか。
よろしくお願いいたします。

#追記
CSVダウンロードするコードを追記しました。
コード:

private void CsvOutpu(string strFormat)
{
  try{
    Response.AddHeader("content-disposition","attachment;filename=list.csv");
    Response.ContentType = "application/octet-stream";
    System.Text.Encoding encoding = System.Text.Encoding.GetEncoding("Shift-jis");

    string strTemp = "";
    strTemp = strFormat;
    strTemp = makeCsv(strTemp);//←CSV作成
    
    strTemp = strTemp + "\r\n";
    Response.BinaryWrite(encoding.GetBytes(strTemp));
    
    Response.End();
    }
    catch(省略)
    {省略}
}




[ メッセージ編集済み 編集者: BB.NK 編集日時 2005-08-10 09:24 ]
BB.NK
大ベテラン
会議室デビュー日: 2004/02/05
投稿数: 138
投稿日時: 2005-08-18 18:31
再び自己レスです。

まだ解決していないのですが、
CSV保存後、
過去スレのようにフレーム名から記述すれば
window等は取得可能ですが、documentは取得できません。
これはどうしようもないことなのでしょうか?

dataViewからCSV保存までASP.NETでできたのに、ActiveXで逃げる方法しかないのかと
悔しがっている今日この頃です。

よろしくお願いいたします。
NYRL
ベテラン
会議室デビュー日: 2003/07/14
投稿数: 90
投稿日時: 2005-08-19 09:34
なんとなくですが
1.AとBの二分割のフレーム表示
2.Bのボタンを押すと画面Cをポップアップ
3.Cでボタンを押すとCを閉じてAのJavaScriptを起動しCSVダウンロード

3.の時にCSV出力はどこに出していますか?

たぶんフレームAを書き換えている気がしますが
JavaScriptで新規画面をオープンしそのURLをCSVダウンロードにするとどうでしょうか?
フレームAを書き換えてCSVをダウンロードしているとうまくいかないのは経験があるので

あとはJavaScriptのデバッガで変数の中身を見ていくと
参照は取れるはずです

ところでそもそも
>フレームAにアクセスすると「未定義のエラー」が出ます。
がおかしい気がします内部のファイルをダウンロードさせている感じなので
ASP.NETで(C#)で出力しCSVダウンロードさせるPGと
このHTMLのドメインが違うのは何故でしょうか?
普通は同じドメインになるからこのエラーにはならないと思うのですが
BB.NK
大ベテラン
会議室デビュー日: 2004/02/05
投稿数: 138
投稿日時: 2005-08-19 10:59
NYRLさんありがとうございます。
少し見えてきました。

仰るとおりフレームAを書き換えていました。
というのは、フレームAにdataViewが存在し、
dataViewをほかのページに渡すのは情報量が多いと思い、
フレームA内でCSV出力をしていました。

つまり、この考え方が間違っていたのですね。
Aから新しいページに対してCSVに出力したいデータを送信することは必須
なのですね。(WinXP、IE6では問題ありませんでした)
Aから別ページへのデータの送信方法について考えてみます。
(セッション or HtmlInputHidden or その他)
また報告します。
BB.NK
大ベテラン
会議室デビュー日: 2004/02/05
投稿数: 138
投稿日時: 2005-08-22 19:40
自己レスです。
Csv出力用に別Windowを表示して実装できました。
ただ、このCsv出力用ページのボタンクリックで
Csvを出力した後、このWindowを閉じられなくなってしまいました。

過去スレに同じものがありました。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=22794&forum=7
ですが、実際どうされたのかがイマイチわからないため、
このスレは終わりにして、上記スレで質問したいと思います。
ありがとうございました。
NYRL
ベテラン
会議室デビュー日: 2003/07/14
投稿数: 90
投稿日時: 2005-08-23 15:07
一部勘違いがあるようなので補足

・Aから新しいページに対してCSVに出力したいデータを送信することは必須
ではありません。
どのデータを指定したかとかページCで選択したフォーマットがどれかの情報は必須です。
Aを出力する際に出力したデータもしくは出力の為のパラメータをセッション等に残しておけばクライアントから再度送る必要はありません。

また「JavaScriptで新規画面をオープンしそのURLをCSVダウンロードにするとどうでしょうか? 」と書いたことに対して
「Csv出力用に別Windowを表示して実装できました。 」と書かれているので
勘違いしているようですがここは
window.open("CSV出力URL","_top");
といった感じで指定します。
別画面とは言っていますが実際には一瞬のみ表示されすぐにダウンロードダイアログが表示されるはずです。
この場合は元の画面(フレームA)は書き変わっていないので引き続き操作できるはずなので
BB.NK
大ベテラン
会議室デビュー日: 2004/02/05
投稿数: 138
投稿日時: 2005-08-23 17:42
引用:

NYRLさんの書き込み (2005-08-23 15:07) より:
一部勘違いがあるようなので補足

・Aから新しいページに対してCSVに出力したいデータを送信することは必須
ではありません。


私の言葉が悪かったです。すみません。
セッションにデータを格納してほかのページで参照することを含めて、
データを送信すると発言していました。
頭の中と発言が一致していませんでした。

引用:

また「JavaScriptで新規画面をオープンしそのURLをCSVダウンロードにするとどうでしょうか? 」と書いたことに対して
「Csv出力用に別Windowを表示して実装できました。 」と書かれているので
勘違いしているようですがここは
window.open("CSV出力URL","_top");
といった感じで指定します。
別画面とは言っていますが実際には一瞬のみ表示されすぐにダウンロードダイアログが表示されるはずです。
この場合は元の画面(フレームA)は書き変わっていないので引き続き操作できるはずなので


これは勘違いでした。実装してみて気づきました。
深くいじり過ぎてしまったので、再度実装しなおします。
(バックアップが消えた。。。)

サーバ処理はAにさせたいので、
1.ページCからフレームAのスクリプトをCallして、ページAをポストバック
2.Csv処理を行う
3.ページAのクライアント側でwindow.open("csv出力用URL","csv")を実行
4.csv出力用ページでダウンロード(Response.End()でクライアントへページ送信しない)
このような流れで実装してみます。これじゃ無理だ!という場合、ご指摘ください。

再度コーディングして報告します。

【フロー編集しました】

[ メッセージ編集済み 編集者: BB.NK 編集日時 2005-08-23 17:50 ]

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