- PR -

二度押し禁止処理について(DHTML編)

投稿者投稿内容
未記入
常連さん
会議室デビュー日: 2006/04/11
投稿数: 23
投稿日時: 2006-07-10 16:36
既に解決しているようですが、私も同様に悩んだことがあったので、他にこんな手法もありますよって感じで投下しておきます。
コード:

<html>
<head>
<style>
.execStyle { DISPLAY: none;
TOP: 0px;
LEFT: 0px;
POSITION: absolute;
BACKGROUND-IMAGE: url(http://localhost/images/透過.gif);
WIDTH: 100%;
HEIGHT: 100%;
TEXT-ALIGN: center; }
</style>
<script language="javascript" type="text/javascript">
<!--
function _onSubmit() {
document.body.style.cursor = 'wait';
document.getElementById('execMsg').style.display = 'block';
return true;
}
// -->
</script>
</head>
<form onsubmit="return _onSubmit()" id="Form1">
<script language="javascript" type="text/javascript">
<!--
function __doPostBack(eventTarget, eventArgument) {
var theform;
if (window.navigator.appName.toLowerCase().indexOf("microsoft") > -1) {
theform = document.Form1;
}
else {
theform = document.forms["Form1"];
}
theform.__EVENTTARGET.value = eventTarget.split("$").join(":");
theform.__EVENTARGUMENT.value = eventArgument;
_onSubmit();
theform.submit();
}
// -->
</script>
<div id="execMsg" class="execStyle"><BR>
<iframe src="/images/実行中画像.gif" frameborder="0" scrolling="no"></iframe>
</div>
</form>
</html>



[適当な説明]
・RegisterOnSubmitStatement にて <form> の onsubmit を捕捉し、クライアントスクリプトを呼び出すようにする
・Render をオーバーライドし __doPostBack へ クライアントスクリプトを呼び出すように追記する

[欠点]
・DropDownList の AutoPostBack までは抑制できない。

[追記]
> ぜうす さん
揚げ足取りしかできない人は、放置しておくことをお勧めします。


[ メッセージ編集済み 編集者: 未記入 編集日時 2006-07-10 16:52 ]
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2006-07-10 17:11
引用:

ぜうすさんの書き込み (2006-07-10 15:21) より:
そうだ、どっとねっとふぁんさんに褒められちゃったから図と僕なりの回答を書いておきますね。


OK。見直した。
他に有用なものも思い出した限りでいいから書いてちょ。
カタナ
大ベテラン
会議室デビュー日: 2006/05/25
投稿数: 110
投稿日時: 2006-07-10 17:27
ぜうすさん>で、もし解決できたのであれば、その方法を教えていただけないでしょうか?

ゼウスさん方式でもjittaさん方式でも私の思い通り二度押しを防ぐことができましたので報告いたします。未記入様のやりかたは、まだ試していないのですが・・・。
皆様本当にありがとうございました。
▼ゼウスさん方式
1.button0,button1をHTMLフォームで作成
2.button0,button1にonclickイベントとstyle属性を追加する
<input type="button" id="Button0" style="display:none" runat="server">
<input type="button" id="Button1" onclick="Button0.click();this.disable=true;">
▼jittaさん方式
1.VB.NET コードのPage_Loadの中に
Me.Button1.Attributes.Add("onclick", "return beforePost(this);")
を追加する
2.aspxファイル中にJavaScriptを記述する(勿論外部参照のjavascriptファイルでも可)
<script language="javascript">
function beforePost(sender) {
sender.disabled = true;
return true;
}
</script>



カタナ
大ベテラン
会議室デビュー日: 2006/05/25
投稿数: 110
投稿日時: 2006-07-10 18:01
たびたびすみません。先ほどのjittaさん方式のソースは間違えていました。
これだと、vb側のイベントが走りません。
もう少し調べてみます。

▼jittaさん方式
1.VB.NET コードのPage_Loadの中に
Me.Button1.Attributes.Add("onclick", "return beforePost(this);")
を追加する
2.aspxファイル中にJavaScriptを記述する(勿論外部参照のjavascriptファイルでも可)
<script language="javascript">
function beforePost(sender) {
sender.disabled = true;
return true;
}
</script>
カタナ
大ベテラン
会議室デビュー日: 2006/05/25
投稿数: 110
投稿日時: 2006-07-10 19:17
本当にたびたびすみません。jittaさんの言われていることをやりたいのですが、分かりません。なにかヒントを頂ければ・・・。

>そうではなく、クリックして、ポストする直前に、JavaScript にて disabled にして、
>その後、disabled = false の設定の(というか、書かれていない) HTML をサーバから
>流してきて、それによって上書きしちゃおう、ということです。
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2006-07-10 20:33
ココが参考になりませんか?
http://osada.bz/PermaLink.aspx?guid=b01b5502-5e06-4e87-a616-16c01610c08e
カタナ
大ベテラン
会議室デビュー日: 2006/05/25
投稿数: 110
投稿日時: 2006-07-11 09:35
かるあさんありがとうございました。できました。
対応としましては、

Page_Loadの箇所に
Me.Button1.Attributes.Add("onclick", "this.disabled='disabled';" + GetPostBackEventReference(Me.Button1).ToString())
を追加する
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-07-12 21:37
 職場が変わって外が見にくくなっている間に進んでしまいましたね。申し訳ない。

引用:

→はい。その通りです。その本を呼んで参考にしています。なんの本かまで分かるとは・・・。


「2.3.16 画面遷移制御とアプリケーション コントローラ」ですね。
ここでは、ブラウザの「進む」「戻る」にも対応できる、かつ、攻撃者からの攻撃に対しても防御効果の高い、ワンタイム・トークン、業務設計の工夫、アプリケーション コントローラの実装、を薦めています。その為、DHTML の実装については、端折っていると思われます。JavaScript を切られていると、使えませんし。。。
元々、エンタープライズ、大規模かつ一般公開されるものを対象に書かれていますから、より効果の望める方を優先していると考えられます。

たまたま、読んだんですよ(^-^; Web アプリの教科書的な本ですし。
ただ、今後、何かの本やサイトに書いてあったことから疑問を感じたなら、出典を明らかにしてください。同じ本を持っている、サイトを見た人が、読み飛ばしたり、理解できなかったところを補足してくれるかもしれません。
あるいは、その本、サイトが間違っているかもしれません。そのときは、著者に連絡してあげるべきだと思います。


かるあさん、フォローどうも。勉強になりました。
そっか、disabled だと、イベント登録しないのか。

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