2013.10.16
APIバージョン26.0から提供されているVisualforce属性に「deferLastCommandUntilReady」というものがあります。
これは、apex:page タグで指定できる属性です。
●deferLastCommandUntilReady属性
http://www.salesforce.com/us/developer/docs/pages/Content/pages_compref_page.htm
英文では、
日本語ドキュメント(PDF)によると、
日本語訳にある「クリックしないようにする」というより、原文から判断して「早すぎるクリックおよびリンクを防止する」的なニュアンスに思われます。 通常、Webブラウザに配置したボタン(submitボタン)をクリックすると、Webブラウザは指定されたURLにリクエストを送ります。最近のWebブラウザではあまり聞かなくなりましたが、ボタンを連打するとWebブラウザが複数のリクエストを送ってしまうことがあるようです。
そのため、回避策としてJavaScriptを使って、ボタンがクリックされたらまずそのボタンを無効にして(再度クリックできないようにした上で)リクエストを送るような処理を行う場合があります。
deferLastCommandUntilReady 属性は、このあたりの状況に関係するようです。 デフォルトではこの属性は false なので、この「早すぎるクリック」の処理は行われません。
どのような状況でこの属性を true にするかどうか判断が難しいところですが、 試しにVisualforceページにボタンを配置し、ボタンのクリックでページの表示内容を変更する処理を記述してみたところ、ボタンの連打によってビューステートの内容が空になってしまうことがありました(特にインターネットの回線速度が遅い場合)。
// ボタンが押されたら、次のレコードの内容を表示する public PageReference NextRecord() { System.Debug('### NextRecord()'); Integer max = accounts.Size(); if( recIndex < (max-1) ) { recIndex++; getRecord(recIndex); // Acountの内容を取得する } return null; // 同じページに戻る }
salesforceではサーバ側で実行する処理の実行状態がビューステートに保存されていますので、ビューステートがなくなってしまうとサーバ側の処理を続行できなくなります。結果的にサーバ側の処理が初期化されてsalesforceで最初にページをリクエストした(初期)状態に戻ってしまうようです。
ボタンやリンクのクリックで、予期しないページの初期化が発生してしまう場合は、deferLastCommandUntilReady を true にしてみるとよいかもしれません。