2017-01-02 5 views
0

私はいくつかの日(週末、休日)を持つjQueryのdatepickerを作成しました。実際には、その日を色づけすることの拒否は、月のどの日に色を付ける必要があるかを返すajax呼び出しに依存するということです。月を変えるときにjQueryのdatepickerのちらつきを防ぐにはどうすればいいですか?

月を変更するためにボタンをクリックすると、ajax呼び出しが行われ、着色する日が返され、日付線がちらつき、月が正しく表示されます。私はajax呼び出しが完了した後、新しい月を表示したいと思います。ちらつきを避ける方法はありますか? Internet Explorerでは正しく動作するようですが、Firefoxではうまく動作しません。

Image

EDIT

あなたが変更月のボタンをクリックすると、日付ピッカーは、それをレンダリングするために、月に日ごとにbeforeShowDayを呼び出します。 console.log行にブレークポイントを置くと(jsfiddleの例が下になります)、datepickerが閉じられ、毎日描画されるまでレンダリングされないことがわかります。私の場合は、新月が完全に引かれるまで、古い月を維持したい。

以下の例では、カレンダーの描画が非常に高速で、月の日が素早くレンダリングされるため、瞬時に表示されますが、データベースデータを取得するAjax呼び出しを行うと毎日の色を決定するには、月がちらつく。インターネットエクスプローラとは異なり、Firefoxではこの問題が私に起こります。

どうすれば修正できますか?

フィドル例:

http://jsfiddle.net/b6V3W/370/

beforeShowDay: tratarDiasEspeciales, 

function tratarDiasEspeciales(date){ 
    ajax call to decide the colour of the cell 

    if(condition){ 
     //colour the day with blue 
     return[true,'blue'] 
    }else{ 
    //colour the day with red 
    return[true,'red'] 
    } 
} 
+0

コードでjsfiddleを作成できますか? –

+0

@AminurRashidコードが追加されました。 – Jaime

答えて

0

問題を解決するには、ライブラリにあったがjqueryの-ui.custom-1.9.1.custom.jsと呼ばれます。そのライブラリーでは、次のコード行がされています

inst.dpDiv.empty().append(this._generateHTML(inst)); 

最初の行(月と年のデータと日とヘッダ)日付ピッカーのデータを削除してからgeneratedHTML機能と新しい月のHTMLコードを追加します。

問題を解決するために、コードを2つに分割しました。最初私は、新しいHTMLコードを取得した後、私は新しいHTMLコードを追加するdatepicker'sデータを空にする:AJAX呼び出しが最初に作られています。このソリューションにより

var quitar = this._generateHTML(inst); 
inst.dpDiv.empty().append(quitar); 

を、カレンダーは(それをdoesn't inmutableままフリッカー)、新しいコードが準備完了になると、それが挿入されます。

私はそれが問題を解決するための最良の方法ではありません(私はjqueryのバージョンを変更した場合、私はあまりにもそこにコードを変更する必要があります)が、私が見つけた唯一の方法であることを知っています。

+0

あなたは私の新しいコメントを私の答えにチェックしましたか?あなたの答えと同じものをシミュレートする必要があります(レンダリングが始まる前にajax呼び出しが行われ、ちらつきが防止されます) –

+0

はい、私はそれをチェックして意味があります。それは正解ですが、私のアプリケーションの作成方法は、コードをあるサイトから別のサイトに変更するのが難しくなります(膨大な方法です)。時間を節約するために、自分のソリューションを使用することに決めましたが、将来あなたのソリューションを使用することを諦めません。お返事ありがとうございます;あなたの時間;) – Jaime

+0

それは正しい答えを知ってうれしい:) –

0

私はあなたのを修正することにより、別のfiddleを作成しました。ここでは、onChangeMonthYearコールバック関数にビジネスロジック部分(データベースからデータを取得して色を決定するajax呼び出し)を持ってきました。ここで

$("#dater").datepicker('option', 'onChangeMonthYear', onChangeMonthYearCustom); 

あなたは着色日付のすべてのデータが含まれており、重要なことは、このコールバック関数が実行中に、現在のレンダリングされたカレンダーのUIを保つことであり、このコールバック関数が「beforeShowDay」の前に呼び出されますrenderedDatesという名前の配列を、取り込むことができますコールバック関数。私は実行中にデバッグポイントを設定し、これが本当であることを確認しました。したがって、 "beforeShowDay"コールバックでは、コードを終了するためにAjax呼び出しを待つ必要がないため、要件を満たすことができます。このソリューションをチェックして、期待どおりに動作しているかどうか教えてください。

+0

私はそれを試しましたが、renderCallendarCallBack関数の最初の行にブレークポイントを置くと、それはまだちらつきます。まず、datepickers本体の中のすべてのhtmlを削除し、新しいhtmlが準備ができたら挿入します。 – Jaime

+0

renderCallendarCallBack関数にブレークポイントを設定すると、明らかにUIレンダリングが停止し、ちらつきが発生します。 ajaxコールはこのコールバック関数には存在しなくなるため、onChangeMonthYearCustomコールバック関数にブレークポイントを設定する必要があります。 –

関連する問題