Ajax呼び出しで返されたコードのデバッグにいくつか問題があります-具体的には、jsonで返された関数(Firefoxではエラーはトラップされません)-Internet Explorerでこれらの問題のデバッグを開始するまで(私はそれがVenkmanもこれらのエラーを検出しないため、Firefox関連の問題)Ajax呼び出しからjsonで返されたコードをデバッグする方法を知っていますか?
2009年3月4日15:05編集
ご回答ありがとうございましたが、説明が足りなかったと思います。基本的なデバッグを行うのに十分なFirebugを知っていますが、問題のあるAjax呼び出しでコードをフェッチすると問題が発生します。次のHTMLファイルがあるとします(正しく機能させるには、同じフォルダーにプロトタイプが必要です)。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<script type="text/javascript" src="prototype.js"></script>
</head>
<body>
<script>
function ajaxErrorTest()
{
new Ajax.Request('data.json', {
'method': 'get',
'onSuccess': function(data){
if(data.responseJSON.func)
data.responseJSON.func();}});
}
</script>
<input type="button" value="test" onclick="ajaxErrorTest();" />
</body>
</html>
そして、data.jsonファイルの内容は次のとおりです。
{'func':function(){console.log('loaded...');alert('hey');}}
ブラウザにページをロードして[テスト]ボタンをクリックすると(すべてがうまくいく)、コンソールに何かが表示され、「ねえ」という警告ボックスが表示されます。次に、data.jsonファイルを次のように変更します。
{'func':function(){console.log('loaded...');alerts('hey');}}
...そして[テスト]ボタンをもう一度クリックします(ページをリロードする必要はありません;-)コンソール行は表示されますが、アラートボックスは表示されません...エラーはありません!!!これは私がデバッグしようとしている種類のエラーです。
「コンソール」パネル(タブ)をクリックして有効にしてみてください。 HTTPリクエストは、それらに含まれる情報とともにキャッチされることがわかります。これを使用して、リクエストに保存されているJSONとエラー(500/404/etc)を表示します。
また、ドメインごとにコンソールパネルを有効にする必要があることにも注意してください。通常、ヘッダー、投稿、応答の3つのサブタブがあります。 AJAXをデバッグするときは、通常、投稿/応答タブをかなり使用します。
[ネット]タブ を使用して、XMLHttpRequests(XHR)のみのリクエストをフィルタリングすることをお勧めします。
私が思いついた唯一の方法は、コードを(醜い)try/catchで囲むことです。コードが別の javascriptコンテキスト で実行されているためだと思います
<script>
function ajaxErrorTest()
{
new Ajax.Request('data.json', {
'method': 'get',
'onSuccess': function(data){
try{
if(data.responseJSON.func)
data.responseJSON.func();}});
} catch (err) {
console.dir(err);
}
}
</script>
このコードは詳細なエラーメッセージを表示します:
ReferenceError: alerts is not defined
実行コンテキストを変更することで問題が解決するかどうかは本当に疑問です。プロトタイプでこれを行う方法はわかりませんが、jqueryを使用すると簡単に実行できます。
$.ajax({
url: "test.html",
context: document.body,
success: function(){
$(this).addClass("done");
}
});
この問題に、取得される実際のJSONが関係しているかどうかはわかりません。 onSuccess
ハンドラーで直接エラーをスローして、Firebugコンソールに表示されるかどうかを確認できますか?このようなもの:
onSuccess: function() { alerts('hey'); }
この場合、Firebug 1.7ではこの問題は 修正済み であるはずです。
Firefoxのネット/コンソールタブを組み合わせて使用します。
Firefoxの[ネット]タブからjsonの結果をコピーします。
次に、結果をコンソールの変数に貼り付けて、問題のある関数を実行してみてください。
この場合、私はこれを貼り付けました:
var x = {'func':function(){console.log('loaded...');alerts('hey');}}
x.func();
これを実行すると、firebugでこのエラーが発生します。 ReferenceError:アラートが定義されていません
他の人が言及しているように、[コンソール]タブでAJAX URLを展開して返されるJSON/Javascriptを表示します。
次に、それを[コンソール]タブの実行/評価パネルにコピーすると(右下に上/下矢印があり、上をクリックすると右側のテキスト領域に変わります。下をクリックすると、1行が実行されます。ボトム)。
Ajax呼び出しが戻った場合:function(){alert("hello")}
次に、次のようなものを使用できます。
x = eval('function(){alert("hello")}')
x();
これにより、返されたajaxを実行できます。
ブレークポイントを使用してデバッグするには、HTMLビューを使用してタグを作成し(FirebugのHTMLビューを使用)、コードをこのタグ内の関数に貼り付けるだけです。次に、run '/ evalパネルから前の関数を呼び出すことにより、ブレークポイントを設定して起動できます。
これが正常に機能する場合は、明らかに制御できないバグがありますが、jsonをtext/plainとして返送し、変数に割り当ててから評価することで、簡単に回避できます。
これは単純です。私は常に [〜#〜] fiddler [〜#〜] を使用してajax呼び出しをデバッグします。
Fiddlerは、コンピューターとインターネット間のすべてのHTTP(S)トラフィックをログに記録するWebデバッグプロキシです。 Fiddlerを使用すると、すべてのHTTP(S)トラフィックを検査し、ブレークポイントを設定し、着信データまたは発信データを「いじる」ことができます。 Fiddlerには、強力なイベントベースのスクリプトサブシステムが含まれており、任意の.NET言語を使用して拡張できます。
デバッグしようとしているエラーは、ネイティブのFirefoxコンソールでかなり目に見えます。それは:「ツール」-「エラーコンソール」
もちろん、発生した後に表示されますが、行番号が間違っています(無限の類似性)
私はfiddlerと呼ばれるHTTPプロキシデバッガーを使用しています。これは私のAJAX問題をデバッグするために常に正常に機能します。すべてのHTTP要求と応答をキャプチャして表示します。 http: //www.fiddlertool.com/
動的にロードしたライブラリまたはJavaScriptコードを使用する場合は、JavaScriptコードの先頭に// @ sourceURL = foo.jsというフレーズを使用できますfoo.jsはそれを割り当てる名前です。デバッガーはその名前でそれを表示します。これは、firebugで私が考えるchromeに当てはまります。この場合、動的にロードされるjavascript(またはjson)コードにブレークポイントを設定できます。
投稿で言及されている特定の問題はFirefoxに関するものであることを私は知っています。 Java AJAX呼び出しから来るスクリプトをデバッグする方法を一般的にグーグルで調べているときにこのページにたどり着きました。他の多くの人もそうするでしょう。
私の場合、スクリプトタグが含まれているHTMLを返していました。たとえば、FirebugのAJAXリクエストから発生したjavascriptにsytaxエラーがあった場合、何も表示されません。例外、またはエラー。AJAXコンテンツはレンダリングされません。
グーグルchromeビルドされたデバッガーでは、発生したエラーが発生しますが、コードをステップスルーすることはできません。ステップスルーしたくない場合は、そのためのダミーページを作成する必要があります。
それは私がこれまでにそれを得ることができた中で最高です。