deferLastCommandUntilReady 属性について | 株式会社アースリンク

Engineer Blog開発者ブログ

2013.10.16

deferLastCommandUntilReady 属性について

APIバージョン26.0から提供されているVisualforce属性に「deferLastCommandUntilReady」というものがあります。
これは、apex:page タグで指定できる属性です。
 

●deferLastCommandUntilReady属性
http://www.salesforce.com/us/developer/docs/pages/Content/pages_compref_page.htm

英文では、
 

A Boolean value that specifies whether to prevent premature clicking on command buttons and links. If true, the last click on a button or link will be enqueued and processed when page is ready. This value defaults to false.

 

日本語ドキュメント(PDF)によると、
 

ページの準備ができる前にコマンドボタンおよびリンクをクリックしないようにするかどうかを指定する boolean 値。true に設定すると、ボタンまたはリンクの最後のクリックがエンキューされ、ページの準備ができたときに処理されます。この値のデフォルトは false です。

日本語訳にある「クリックしないようにする」というより、原文から判断して「早すぎるクリックおよびリンクを防止する」的なニュアンスに思われます。 通常、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 にしてみるとよいかもしれません。

 

Contact
お問い合わせ

電話番号0120 - 889 - 236

受付時間:平日 9:00-18:00