0

私はjqueryとjquery ui 1.8.7を使用しています。ページの読み込み時にインラインの日付ピッカーを作成し、ajax 成功関数で $('#mydiv').datepicker('refresh'); を呼び出しています。(以下にコードを掲載します)。

データが ajax から返された場合 (たとえば、更新時)、beforeShowDay は highlightDays() 関数を呼び出します。すべてがクラッシュして停止する前に、正しいデータで highlightDays を 2 回ヒットしていることを知っており、「TypeError: 未定義のプロパティ 0 を読み取ることができません」というエラーが表示されます。

一定時間後にイベント配列が破棄されているようですが、実際に何が起こっているのかを言うには、ajax について十分に知りません。これを修正するために誰かが私を正しい方向に向けることができますか?

        function highlightDays(date) {
                var day = date.getFullYear() + '-' + (date.getMonth() + 1) + '-' + date.getDate();
                console.log(typeof(events)); // This will return as an object twice before throwing an the above mentioned error
                if($.inArray(day, events) !== -1) {
                    return new Array(true, '');
                } else {
                    return new Array(false, '');
                }   
        }    
        function getEventData() {
                return $.ajax({
                    url: Drupal.settings.basePath + 'correct_path', 
                    data: search+'&path='+window.location.pathname,
                    dataType: 'json',
                    type: 'POST',
                    success: function(data, textStatus, jqXHR) {        
                        // save our returned data
                        events = new Object();
                        events = data;
                        $('#mydiv').datepicker("refresh");
                    }
                });
            }   

        function createDatepicker() {

            // Attach datepicker to the parent div so it returns as 
            // inline.
            $('#mydiv').datepicker({
                dateFormat: 'yy-mm-dd',
                speed: 'immediate',
                altField: '#edit-date-filter-value-datepicker-popup-1',
                beforeShowDay: function(date) {
                      if(typeof (_event_days) === 'undefined') {
                        return new Array(true, '');
                      } else {
                            highlightDays(date);
                        }
                    },
            });
            $('#myinput').hide();
        }   
getEventData();
createDatepicker();
4

1 に答える 1

0

次のコードは、私にとってうまくいったものです。2つの大きな違い。ハイライトデイズ関数を作り直し、ajax 呼び出しから返されたすべてのデータをグローバル イベント配列に追加して、後でハイライトデイズで使用できるようにします。

var events = [];
function highlightDays(date) {
        var dayClass = [true, ''];
          var date = $.datepicker.formatDate('yy-mm-dd', new Date(date));                     
                  $.each(events, function(key, value) { 
                    if (date === value[0])  {
                       dayClass = [true, "ui-state-highlight"];
                       return dayClass;

                    } else {
                        return dayClass;
                    }
                 });
              return dayClass;
          }


        function getEventData() {
            return $.ajax({
                url: 'myurl', 
                data: search+'&path='+window.location.pathname,
                dataType: 'json',
                type: 'POST',
                success: function(data, textStatus, jqXHR) {        
                    $.each(data, function (index, value) {
                       events.push([value]);
                    });
                          // popup is the date input field
                          // attaching datepicker to the parent div makes 
                          // it an inline picker    
                          popup.parent().datepicker('refresh');
                }
            });
        }


        function createDatepicker() {

           popup.parent().datepicker({
                dateFormat: 'yy-mm-dd',
                 beforeShowDay: highlightDays

            });
            popup.hide();
        }




        function getSearchString() {
            // Return a search string to pass to the ajax call
            var search = window.location.search;
            if(search !== '') {
                while(search.charAt(0) === '?') {
                    // remove the leading question mark in the search string
                    search = search.substr(1);
                }
            }
            return search;
        }

        // If our popup selector exists, create the datepicker and get event data
        if (popup.length) {     
            var search = getSearchString();
            getEventData();
            createDatepicker();
        }
于 2012-11-09T18:49:49.090 に答える