2017-04-12 19 views
1

ご協力いただきありがとうございます。カスタムjQuery関数がランダムに定義されていません

私は一握りのグラフをレンダリングするページを持っていますが、私はしばらくの間スコープの問題を経験しているようです。

私は、渡されたオプションに基づいて特定のタイプのチャートをレンダリングするために作った一連のjQuery関数を持っています。それぞれにAJAX呼び出しが含まれています。チャートコンテナ。

一部のグラフは、最初のチャートAJAXコール応答のJSON応答によってオプションが決まる2番目のチャートとペアになっています。ペアになったチャートは、AJAX success:がトリガされた後の最初のチャートのコールバックにレンダリングされます。

ほとんどの場合、これは完全にうまく動作しますが、時には "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

ありがとうShakti。答えとしてマーク。同じファイルに定義された2つの関数、つまりAJAX成功のコールバックを持つ関数が、なぜこれまでにロードされていなければならなかったファイル内で定義された関数が、もはや定義されないのはなぜですか?そのファイルがロードされる前にそのコールバック関数を実行できるシナリオは考えられません。編集*多分私はちょうどこれのすべてについて線形に考えているだけで、コールバック関数についてもっと読む必要があります。 – BigDrums

+0

ページ/ファイルの内容が部分的に読み込まれて1つの関数がロードされ、2つ目の関数がロードされる前にajaxがコールバックを呼び出す場合があります。この問題に遭遇するためには、$(document).readyアプローチがあります。その詳細はこちらhttp://stackoverflow.com/questions/6005789/when-do-you-need-to-use-document-readyおよびhttp://stackoverflow.com/questions/24930807/jquery-best-practise -use-document-ready-inside-iife –

関連する問題