- - PR -
ポップアップについて
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2008-11-10 00:21
お世話になります。
ASP.net VS2005(VB) SPREAD for .NET 3.0J Web Forms Edition にて開発を行っているものです。 教えていただきたいのは、 スプレッドのあるセルをダブルクリックしたときに、 ポップアップ画面を表示させるというものです。 ダブルクリックのイベントは、 スプレッド名.Attributes.Add("onEditStart", "spreadEditStart()") で追加し、JavaScriptでそのイベントを拾っています。 function spreadEditStart(){ var s=document.getElementById(spr_id); s.CallBack("DblClick."+s.ActiveRow+"."+s.ActiveCol); } 単純にspreadEditStartの関数内でポップアップ画面を表示させれば 問題なく表示してくれるのですが、 ポップアップを表示させる際に、 データベースの値を読み込んだり、入力チェックを行ったり、 サーバー側で処理しなければならないことがあるため、 上記関数のように、サーバーの関数をコールバックしています。 'サーバー側の関数(一部抜粋) If e.CommandName.StartsWith("DblClick") Then Dim eargs As String() = e.CommandName.Split("."c) Dim Row As Integer = CInt(eargs(1)) 'Row Dim Col As Integer = CInt(eargs(2)) 'col Session("SELECT_ROW") = Row Session("SELECT_COL") = Col Dim scriptStr As String scriptStr = "<script type='text/javascript'>" scriptStr += "window.open('aaa.aspx','_blank','width=300,height=300');" scriptStr += "</script>" ClientScript.RegisterStartupScript(Me.GetType(), "aaa", scriptStr) End If イベント自体は発生していて、サーバー側の関数もコールされています。 なのに、ポップアップ画面が表示されません。 試しに、上記サーバー側の関数を、 ダミーで作ったボタンのクリックイベント内で行うと、 正常にポップアップ画面が表示されるため、 コードが間違っているということは無いと思うのですが・・・。 どうかご教授願います。 よろしくお願いいたします。 | ||||
|
投稿日時: 2008-11-10 10:04
RegisterStartupScriptを利用したポップアップはブラウザ側のセキュリティ強化で
弾かれるようになっていることが多いんじゃないでしょうか。 この場合、プログラム側の問題じゃないことになります。 | ||||
|
投稿日時: 2008-11-10 17:30
返答ありがとうございます。
> RegisterStartupScriptを利用したポップアップはブラウザ側のセキュリティ強化で > 弾かれるようになっていることが多いんじゃないでしょうか。 試しに、サーバー側の関数を、 ダミーで作ったボタンのクリックイベント内で行うと、 正常にポップアップ画面が表示されるので、 ブラウザのポップアップブロックが効いているのならば、 この場合もポップアップが出てこないよう気がします・・・。 う〜ん。 もう少しいろいろ試してみます。 | ||||
|
投稿日時: 2008-11-10 17:35
> 試しに、サーバー側の関数を、
> ダミーで作ったボタンのクリックイベント内で行うと、 > 正常にポップアップ画面が表示されるので、 > ブラウザのポップアップブロックが効いているのならば、 > この場合もポップアップが出てこないよう気がします・・・。 え、クリックイベントでRegisterStartupScriptを追加してるってことですか? クリックイベントでwindow.openを実行しているのであれば、これはポップアップブロックに関係なく表示される(ユーザが意識して行っている動作なのでブロックしない)ということになりますが。 もし、クリックイベントでRegisterStartupScriptを追加することで動作するのであれば、確かにポップアップブロックの問題じゃないですね。 その場合はブラウザがページを表示した時点でJavaScriptのエラーが発生していないか確認してみたほうがいいかと思います。 というか、それぐらいしか問題点が思いつかない。 | ||||
|
投稿日時: 2008-11-10 23:50
_blank はターゲットに指定できこそすれ、名前じゃないです。
top とか self とか parent とか名前に出来ない予約語を窓の名前に当てちゃうのは まずいです。 window.open("","self");ってやると自分自身になるんですけど、理解しています? 新しい窓は開きません。 | ||||
|
投稿日時: 2008-11-11 08:56
予約window名は_top _self _parent などですね。
レスポンス完了時には呼び出さない限り実行されませんよ。 | ||||
|
投稿日時: 2008-11-11 21:46
CallBackはSPREAD側のもののようですね。やはりAJAXですね。
SPREADは詳しくないですが、非同期更新が終わったときに呼び出されるscriptを 登録しなければいけません。↓これでいうadd_endRequestです。 http://www.atmarkit.co.jp/fdotnet/ajaxlib/ajaxlib02/ajaxlib02_04.html ↓これのreceiveServerDataがそれなんでしょうかね。 http://www.grapecity.com/japan/support/Search/BugContent.asp?id=24683 ちなみに上のはSPREADのバグ情報ですが、サードパーティ製品を使うときは常にこういう 情報を気にしたほうがいいです。(今回の件と関係あるかは知りませんが) ただ、サーバー側で処理することが目的なら、window.openするときに引数でもつけて openされた側のページでやるのが楽な気もします。 | ||||
|
投稿日時: 2008-11-12 01:34
どっとねっとふぁんさん
ぴあちゃんさん べるさん 返答ありがとうございます。 連絡が遅くなり申し訳ないです。 べるさんのおっしゃるとおり、CallBackはSpreadの機能で、AJAXです。 CallBackの使い方について、Spreadのバグレポートなどを調べたところ、 CallBackする前に、 s.UpdatePostbackData(); を追加し、部分的にポストバックを行ってからCallBackしなければならないと 書いてあったので記述したのですが、それでも現象は変わらず・・・。 そこで、 function spreadEditStart(){ var s=document.getElementById(spr_id); s.UpdatePostbackData(); s.CallBack("DblClick."+s.ActiveRow+"."+s.ActiveCol); window.open('aaa.aspx','_blank','width=300,height=300'); } として、必要最低限のことはサーバー側の関数で行い、 Openされた画面で残りの処理を行うようにしました。 とりあえずは何とかいけそうな気がします。 ありがとうございました。 |
1