Home > 開発者ブログ > salesforce > deferLastCommandUntilReady 属性について

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 にしてみるとよいかもしれません。

 

2013年10月16日(水)

テレマーケティングシステムsakuraトライアル

コールセンターシステム sakuraCTI

資料請求

お問合わせ

コラム

用語集

開発者ブログ

イントラマート

Sakuraテレマーケティングシステム

 

 

営業リスト

インフラソリューションのご案内

導入事例

テレアポノウハウ本プレゼントキャンペーン

認証マーク

アースリンクは
プライバシーマークを
取得しています。

プライバシーポリシー


SSLとは?

当サイトでは、実在性の証明とプライバシー 保護のためSSLサーバ証明書を使用しSSL 暗号化通信を実現しています。

このページの先頭へ