- PR -

ポップアップについて

1
投稿者投稿内容
スプリンガー
会議室デビュー日: 2008/09/14
投稿数: 6
投稿日時: 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

イベント自体は発生していて、サーバー側の関数もコールされています。
なのに、ポップアップ画面が表示されません。

試しに、上記サーバー側の関数を、
ダミーで作ったボタンのクリックイベント内で行うと、
正常にポップアップ画面が表示されるため、
コードが間違っているということは無いと思うのですが・・・。

どうかご教授願います。

よろしくお願いいたします。


どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2008-11-10 10:04
RegisterStartupScriptを利用したポップアップはブラウザ側のセキュリティ強化で
弾かれるようになっていることが多いんじゃないでしょうか。
この場合、プログラム側の問題じゃないことになります。
スプリンガー
会議室デビュー日: 2008/09/14
投稿数: 6
投稿日時: 2008-11-10 17:30
返答ありがとうございます。

> RegisterStartupScriptを利用したポップアップはブラウザ側のセキュリティ強化で
> 弾かれるようになっていることが多いんじゃないでしょうか。

試しに、サーバー側の関数を、
ダミーで作ったボタンのクリックイベント内で行うと、
正常にポップアップ画面が表示されるので、
ブラウザのポップアップブロックが効いているのならば、
この場合もポップアップが出てこないよう気がします・・・。

う〜ん。
もう少しいろいろ試してみます。
どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2008-11-10 17:35
> 試しに、サーバー側の関数を、
> ダミーで作ったボタンのクリックイベント内で行うと、
> 正常にポップアップ画面が表示されるので、
> ブラウザのポップアップブロックが効いているのならば、
> この場合もポップアップが出てこないよう気がします・・・。

え、クリックイベントでRegisterStartupScriptを追加してるってことですか?
クリックイベントでwindow.openを実行しているのであれば、これはポップアップブロックに関係なく表示される(ユーザが意識して行っている動作なのでブロックしない)ということになりますが。

もし、クリックイベントでRegisterStartupScriptを追加することで動作するのであれば、確かにポップアップブロックの問題じゃないですね。
その場合はブラウザがページを表示した時点でJavaScriptのエラーが発生していないか確認してみたほうがいいかと思います。
というか、それぐらいしか問題点が思いつかない。
ぴあちゃん
ぬし
会議室デビュー日: 2008/02/07
投稿数: 287
投稿日時: 2008-11-10 23:50
_blank はターゲットに指定できこそすれ、名前じゃないです。

top とか self とか parent とか名前に出来ない予約語を窓の名前に当てちゃうのは
まずいです。

window.open("","self");ってやると自分自身になるんですけど、理解しています?
新しい窓は開きません。

べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2008-11-11 08:56
予約window名は_top _self _parent などですね。

引用:
s.CallBack("DblClick."+s.ActiveRow+"."+s.ActiveCol);

これはなんですか。もしかしてAJAXですか。だとしたら、AJAXのレスポンスによって出力されたJavascriptは
レスポンス完了時には呼び出さない限り実行されませんよ。
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 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/09/14
投稿数: 6
投稿日時: 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

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