- PR -

AJAX の タブコンテナ タブパネルを使用している時に WINDOW.OPENを使う

1
投稿者投稿内容
ニセイタ
常連さん
会議室デビュー日: 2009/02/27
投稿数: 24
投稿日時: 2009-02-27 16:42
VISUALSTUDIO2005 + AJAX WEBEXTENSIONKit
にて、開発を行っております。

AjaxのTabContainer(タブコンテナ)を使用しまして、
複数のタブパネルを用意しました。
その各タブにGridViewを設置、その複数の中のタブパネルの
ある項目のデータより、ボタン押下で、任意の詳細データを
ポップアップWINDOWにて、表示しようと考えております。

問題は、ポップアップをjavascriptのwindow.openで出力した
後に、起こります。親のタブパネルのタブ表示が崩れてしまうのです。

具体的には、全てのタブが非アクティブ状態になり閉じてしまいます。
但し、表示はタブ部の部分のみが非アクティブとなっており、もともと
開いていた、タブは表示されています。

再度、GridViewのソートを掛けた時のみ、親のタブ表示は元に
戻ります。
​http://www.atmarkit.co.jp/fdotnet/dotnettips/565aspajaxtabs/aspajax...​
などを参照しているのですが、

ちょっと調べて、
__VIEWSTATE" id="__VIEWSTATE"
__EVENTVALIDATION" id="__EVENTVALIDATION"
の変化を調べるのがポイントという記述があったので、(検討違い
かもしれませんが)

ポップアップ出力前の親のタブコンテナのHTML

ポップアップ出力後の親のタブコンテナのHTML

出力後にある項目で正常ソート時の親のHTML
を比較しました。


__EVENTVALIDATION" id="__EVENTVALIDATION" value="…
__VIEWSTATE" id="__VIEWSTATE" value="…
変化したのは上ののvalue以降の箇所でした。

また、当然ですが、ポップアップ出力後のHTMLには
ポップアップ出力のjavascriptが書かれている点が出力前、正常ソート後と異なります。

<SCRIPT LANGUAGE='javascript'>if(!window.open('./ポップアップ系.aspx','self','width=800,height=600,left=300;top = 200;toolbar=no,resizable=yes,scrollbars=yes')) { location.href = './ポップアップ系.aspx' ;}</SCRIPT>


vbのスクリプトはこんな感じです。

Public Function WebpopupEvent2(ByVal Form As System.Web.UI.Page) As Boolean
Dim St As String
St = "<SCRIPT LANGUAGE='javascript'>"
'windowblock時
St &= ""
St &= "if(!window.open('" & "./POPUP.aspx" & "','_blank','width=800,height=600,left=300;top = 200;toolbar=no,resizable=yes,scrollbars=yes')) {"
'St &= " location.href = './POPUP.aspx' ;}"
St &= "alert(""ポップアップブロックがされています。CTRLキーを押しながら再度クリックしてください"");"
St &= "</SCRIPT>"

Form.Response.Write(St)
End Function


どなたか、ヒントでもありましたら、是非ご教授いただけますと、
幸いに存じます。
デューン
大ベテラン
会議室デビュー日: 2004/04/21
投稿数: 174
お住まい・勤務地: Tokyo
投稿日時: 2009-02-27 22:11
あまり検証などはしていないので、勘で申し訳ないのですが、
Form.Response.Write(St)
で出力しているのが関連していそうな気がします。

startupscriptなり、bodyのOnload属性追加なりでjavascriptを追加した場合はどうなるでしょうか?


ニセイタ
常連さん
会議室デビュー日: 2009/02/27
投稿数: 24
投稿日時: 2009-02-28 01:35
>デューン様
ご回答誠にありがとうございます。
確かに、popupを呼び出された瞬間でしたので、呼び出すタイミングが違うと
結果が変わるかもしれないという期待を抱いております。

ClientScript.RegisterStartupScript("FocusScript", St.ToString())
このような記述をして、javascriptをstartupscriptで起動しようと考えましたが、
引き受けるRegistarscriptが無いというエラーが出ていまして、ちょっと、
RegisterStartupScriptの使用法を調べてみます。

あと、bodyonload 属性からの起動も明日試してみます。
ありがとうございます。結果も分かり次第報告いたします。
ニセイタ
常連さん
会議室デビュー日: 2009/02/27
投稿数: 24
投稿日時: 2009-02-28 17:13
デューン様
>startupscriptなり、bodyのOnload属性追加なりでjavascriptを追加した場合はどうなるでしょうか?

やはり、body onload="popupdetail"
という形でも

RegisterStartupScript("startup", St)
という形で、javascriptを作動させましたが、やはり、windowがpopupで開くタイミング
で、全tabの状態が非アクティブ、非選択状態になりました。(タブ部分のみ)

ちなみに、VS2008のOPERA環境で、同処理をしましたが、popup時の親windowのタブの非アクティブ化は起こりませんでした。

VS2005+AJAX+EXTENSION で IE6 の環境時におきるようです。

今のところ、HyperlinkFieldのリンクからtarget _blankで新規windowでリンクを
開くという逃げ道を考えておりますが、HyperlinkFieldイベントはリンクを
たどるのみで、処理は行えないようなので……
必要な情報をURLで送らなければならないのが悩みです。。。




デューン
大ベテラン
会議室デビュー日: 2004/04/21
投稿数: 174
お住まい・勤務地: Tokyo
投稿日時: 2009-03-01 02:55
引用:

VS2008のOPERA環境で、同処理をしましたが



ちなみにVS2008+IE6や、VS2005+AJAX+EXTENSION+Operaの環境ではどうなりますか?
原因切り分けには、開発環境かブラウザのどちらかは揃えた方がいいと思います。


参考までにwindow.openではないですが、alertの場合はイベントの途中で後続のレンダリングが先に処理されいイベントの発生順序が狂うということがありました(IE6で)


あとは、正常に表示できているときにスクリプトレットのような形で
window.openしたらどうなるか
具体的にはアドレスバーに
コード:
javascript:(function(){window.open([パラメータ]);})()


と打ち込んでその状態になるかどうか。
それでも事象が起きるのであれば、どうしてもなってしまう事なのかもしれません。


問題が起きている状態のHTMLソースも確認してみると、何か原因が探れるかもしれませんね。



1

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