2017-04-12 69 views
1

非常感謝您的幫助。自定義jQuery函數隨機undefined

我有一個頁面呈現一些圖表,但我似乎只是偶爾遇到一個範圍問題。

我有一系列的jQuery函數,我根據傳入的選項呈現特定類型的圖表,每個函數都包含一個AJAX調用,以根據調用圖表函數時提交的選項請求正確的數據集圖表容器。

一些圖表與第二個圖表配對,第二個圖表的選項由第一個圖表AJAX調用響應的JSON響應確定。 AJAX成功後,成對圖表在第一個圖表的回調中呈現:觸發。

大多數情況下,這個工作很好,但偶爾我會得到錯誤「TypeError:$(...)。lineChart不是函數」。每次都會渲染第一個barChart,但偶爾會在與barChart相同的文件中定義的lineChart函數不再可訪問。

我添加到代碼中的任何延遲似乎解決了這個問題。當我使用調試器時,該問題不存在,我可以捕獲該錯誤,並在超時後重新調用lineChart函數,這似乎也可以工作。

我不知道爲什麼這個函數有時不再可用,什麼看起來是隨機的。

對於沒有粘貼的確切代碼,我表示歉意。有一些評論和變量/函數名稱我不能在這裏發佈。

謝謝。

$.fn.barChart = function (options, callback) { 
    $.ajax(options["url"], { 
     method: "POST", 
     type: "json", 
     data: options.data, 
     success: function (response) { 

      // ..render this chart .. 

      var optionsForNewChart = {}; // ..generate new options to respond with base on response JSON 
      callback(optionsForNewChart); 
     } 
    }); 
}; 

$.fn.lineChart = function (options) { 
    $.ajax(options["url"], { 
     method: "POST", 
     type: "json", 
     data: options.data, 
     success: function (response) { 
      // ..render this chart .. 
     } 
    }); 
} 


$("#barChart1").barChart({ 
    url: "https://...", 
    data: { 
     //post data 
    } 
}, function (response) { 
    $('#lineChart1').lineChart(response); 
}); 

$("#barChart2").barChart({ 
    url: "https://...", 
    data: { 
     //post data 
    } 
}, function (response) { 
    $('#lineChart2').lineChart(response); 
}); 

$("#barChart3").barChart({ 
    url: "https://...", 
    data: { 
     //post data 
    } 
}, function (response) { 
    $('#lineChart3').lineChart(response); 
}); 
+0

您確定美元符號不會被其他東西覆蓋嗎?當然,我總是使用對jQuery的明確引用來保證美元符號沒有被其他圖書館「聲稱」。嘗試將'''$''''切換到'''jQuery''',如果你不確定,看看問題是否消失。我懷疑這是問題,但值得檢查。 – CPR

+0

將您的代碼放在: '$(document).ready(function(){ //您的代碼在這裏 });' –

+0

謝謝@CPR但它仍然會拋出同樣的錯誤。 – BigDrums

回答

1

附上你的代碼: $(document).ready(function(){ //YOUR CODE GOES HERE }); 這將解決該函數的是未加載的問題。

+0

謝謝沙克蒂。標記爲答案。你可能知道爲什麼當兩個函數定義在同一個文件中,一個是AJAX成功的回調函數時,爲什麼在這個回調函數中定義的那個函數爲什麼必須已經加載以獲得這麼遠呢,可能不再被定義?我不能想到這個回調函數可以在該文件被加載之前運行的場景。編輯*也許我只是想太多線性,並需要閱讀更多關於回調函數。 – BigDrums

+0

有些情況下,頁面/文件的內容部分加載使得一個函數被加載,而在第二個加載之前,ajax調用回調。遇到這個問題我們有$(document).ready方法。閱讀更多關於它在這裏http://stackoverflow.com/questions/6005789/when-do-you-need-to-use-document-ready和http://stackoverflow.com/questions/24930807/jquery-best-practise - 使用文檔準備-內包括-iife –