WebKit、FireBug、IE8 Developer Toolなどのデバッガーで動的ロードJavaScriptをデバッグできますか?


90

私の最近の質問から動的ビューの部分ビュー用のJavaScript関数をすでに作成しました。そのため、動的読み込みJavaScriptをデバッグできません。ロードされたすべてのJavaScriptは「eval」関数によって評価されるためです。

ただし、次のスクリプトを使用してスクリプトを動的に作成し、現在のドキュメントのヘッダーに新しいJavaScriptを作成する方法を見つけました。ロードされたすべてのスクリプトはHTML DOMで表示されます(任意のデバッガーを使用して検索できます)。

var script = document.createElement('script')
script.setAttribute("type","text/javascript")
script.text = "alert('Test!');";

document.getElementsByTagName('head')[0].appendChild(script);

ちなみに、ほとんどのデバッガー(IE8 Developer Toolbar、Firebug、Google Chrome)は、動的スクリプトにブレークポイントを設定できません。デバッグ可能なスクリプトは、ページが読み込まれた後、最初に読み込まれる必要があるためです。

動的スクリプトのコンテンツまたはファイルでデバッグするアイデアはありますか?

アップデート1-テスト用のソースコードを追加

someVariable値をデバッグするには、次のxhtmlファイルを使用できます。

<!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">
<head>    
    <title>Dynamic Loading Script Testing</title>
    <script type="text/javascript">
    function page_load()
    {       
        var script = document.createElement('script')
        script.setAttribute("id", "dynamicLoadingScript");
        script.setAttribute("type","text/javascript");
        script.text =   "var someVariable = 0;\n" +
                        "someVariable = window.outerWidth;\n" +
                        "alert(someVariable);";

        document.getElementsByTagName('head')[0].appendChild(script);
    }
    </script>
</head>
<body onload="page_load();">
</body>
</html>

答えから、FireBugでテストするだけです。結果は以下の画像のように表示されます。

代替テキストhttp://d7cgnq.bay.livefilestore.com/y1pJGV27qEARXzZhsMMhPD5z0OxAtnkQK8eKeEXMAxuHjsuWeAq1aGl7sTISRNqVv3lw8ghyxE_GorlwSJDvTql0m-ugngugugug-htmlPaug

ページ読み込み後に追加される「dynamicLoadingScript」スクリプトをご覧ください。

代替テキストhttp://d7cgnq.bay.livefilestore.com/y1pz_RwqjgeVqe2mAlUZha0PalpPdP0X5AiwJcQhYahERlnbPDdZpb-_d1e96Q-14raSDMJOBsdcV9jsi4B5yCUDqable-kugbugbugbugbugbugug

ただし、FireBugのスクリプトタブにはありません。

更新2-動的読み込みスクリプトでデバッグブレークポイントを作成する

代替テキストhttp://d7cgnq.bay.livefilestore.com/y1peKdIMOztXss-pc8PlJEmaGov_0ShYnLsuDdK5OLETbCG0UpkX6Te29w0YW2pNKaD_0ANAiizh2GdGPAAp_1q0JWAETo4Qoiw.png

代替テキストhttp://d7cgnq.bay.livefilestore.com/y1pUeHaHoTXj0WBl74fnTrXwdr_y7s7h8jNKfs​​lSONgshzZBpUddGHNBWA9cXRabo3HAl3QazeozrCABo7pNVQc1Acl-UXXbHFE/Debugger-Google

上記の両方の画像は、「デバッガ」の挿入を示しています。スクリプトの一部の行のステートメントは、動的ロードスクリプトでブレークポイントを起動できます。ただし、どちらのデバッガーもブレークポイントにコードを表示しません。したがって、これを行うのは無意味です。

おかげで、


たまたまこれの解決策を見つけましたか?私は同じ問題でここにいます。
adamJLev 2010

別のファイルを動的にロードしてみてください。つまり、実装についてはこちらを参照してくださいqueryj.com/2011/03/11/a-lightweight-script-loader-デバッガーの方がはるかに簡単に処理できます。
James Westgate、


3
2014年、あなたの画像はまだ死んでいます-あなたはそれらを元に戻すことができますか?
TheGeekZn 2014年

同様の質問がありますが、画像が壊れているためわかりません。それらを更新できますか?
エリック

回答:


117

同じようにクロムを使用することも可能です。Chromeには、パーサー属性を指定して、動的JSの一部をファイルとして表示させ、ファイルを参照してブレークポイントを設定できる機能があります。

設定する必要がある属性は

//# sourceURL=dynamicScript.js

ここで、dynamicScript.jsは、スクリプトファイルブラウザーに表示されるファイルの名前です。

詳細はこちら

Paul Irishは、Tooling&The Webapp Development Stackに関する彼の優れた講演で簡単にそれについても語っています


5
誰かがMVC3 / Razorで問題を抱えている場合は、@記号をエスケープすることを忘れないでください。たとえば、// @@ sourceURL = dynamicscript.jsのようにします。また、上記のように、Firebugでも動作します。
parsh 2013

1
この機能は、動的インラインJavaScriptにも使用できます。ただし、そのスクリプトに例外がある場合は、ソースリストに表示されません。
Roman Snitko 2013

4
新しい構文は "//#sourceURL = dynamicScript.js"です。@から#に変更してください
Cekk

3
ソースマップ上のChromeデベロッパーツールのセクションに更新されたリンクは- developer.chrome.com/devtools/docs/...
chrismarx

3
私にとって、jsファイルは「(ドメインなし)」というグループ内のソースリストに表示されていました。私は最初にそれを逃したので、言及する価値があるかもしれません!
JMac 2015年

21

「デバッガ」を追加してみてください。動的に追加するJavaScriptのステートメント。これにより、ブレークポイントの設定に関係なく、その行で停止します。


私が見つけることができるのはこれだけです:code.google.com/p/fbug/issues/detail?id=1259。ちなみに、ヘッドに追加するスクリプトタグを使用してスクリプトを動的に読み込みます(ただし、src属性を使用します)。この方法で追加したコードは、最初のページと一緒に読み込まれていなくても、すべてのブラウザーでデバッグできます。
Joeri Sebrechts、2009年

スクリプトタグを追加するために使用している正確なコードは何ですか?OPと同じ問題が発生しているため、Chromeで動的に読み込まれたJSファイルをデバッグできません。どうも!
adamJLev 2010

var loaderNode = document.createElement( "script"); loaderNode.setAttribute( "type"、 "text / javascript"); loaderNode.setAttribute( "src"、url); document.getElementsByTagName( "head")[0] .appendChild(loaderNode);
Joeri Sebrechts、2010

18

はい、Google Chromeを使用して動的に読み込まれたJavaScriptをデバッグできるようになりました。

debugger;動的にロードされたJSファイルに追加の属性やその他の属性を追加する必要はありません。デバッグするには、以下の手順に従ってください。

方法1:

私の技術リーダーは、動的に読み込まれたJavaScriptメソッドをデバッグする非常に簡単な方法を示しました。

  1. Chromeのコンソールを開き、メソッドの名前を入力してEnterキーを押します。
    私の場合はGetAdvancedSearchConditonRowNew
    、JSメソッドが読み込まれている場合は、メソッドの定義が表示されます。

ここに画像の説明を入力してください


  1. メソッドの定義をクリックすると、JSファイル全体がデバッグ用に開きます。

ここに画像の説明を入力してください


方法2:

例として、ajaxcall を使用してボタンをクリックしたときにJSファイルをロードしています 。

  1. networkGoogle Chrome開発ツールでタブを開く
  2. いくつかのJavaScriptファイルをロードし、いくつかのJavaScript関数を呼び出すコントロール(ボタンなど)をクリックします。
  3. ネットワークタブを観察し、そのJS関数を探します(私の場合はそれですRetrieveAllTags?_=1451974716935
  4. その上にカーソルを合わせるinitiaterと、動的にロードされたJSファイル(プレフィックス付きVM*)が見つかります。

Chrome -1での動的読み込みJavaScriptのデバッグ


  1. そのVM*ファイルをクリックして開きます。
  2. そのファイルのどこにでもデバッガを置きます:D

Chrome -1での動的読み込みJavaScriptのデバッグ



Googleでこれを鈍くしているのは残念です。1 / Shame = Kudos(恥の逆)を引き出してくれた:)
toddmo

16

私はその目的のためにグーグルクロムを使っています。

スクリプトタブのクロムでは、「すべての例外で一時停止」を有効にすることができます

ここに画像の説明を入力してください

次に、コード行のどこかに配置しますtry{throw ''} catch(e){}。Chromeはこの行に到達すると実行を停止します。

編集:私が話していることがより明確になるように画像を修正しました。


Google Chromeで開発するには、jQueryまたは他の読み込みスクリプトがDOMにスクリプトを追加するときに、jQueryチームに報告したように、現在の動的スクリプトの名前を示すテキストを挿入する必要があります。しかし、それに取り組む時間はありません。 bugs.jquery.com/ticket/8292
Soul_Master

@Soul_Master、しかし私の方法ではテキストを挿入する必要はありません。動的スクリプト行に挿入し、try{throw ''} catch(e){}「すべての例外で一時停止」モードを有効にすると、例外がスローされたときにChromeが実行を停止します。何度もチェックしました。別の画像をロードしました。私が何を話しているのかがはっきりしています。
モレキュラーマン

Chromeでは、「debugger;」ステートメントを使用して、デバッガーパネルが開いているときにステートメントで中断できます。デバッガーパネルが閉じている場合、Chromeはこれを単に無視します。
dinesh ygv 2014

@dineshygv、できます...今。しかし、3年前はできませんでした。debuggerそのとき、動的に作成されたスクリプトでは機能しませんでした。
モレキュラーマン

10

評価したコードに次のような「名前」を付ける必要があるかもしれません。

http://blog.getfirebug.com/2009/08/11/give-your-eval-a-name-with-sourceurl/

もしそうなら、debugger「アップデート2」からのアプローチがうまくいくと思います。


はい。分かった。私はすでにこのバグをjQueryチームに長い間報告してきました。bugs.jquery.com/ticket/8292
Soul_Master

1
警告!説明されている手法ではIE7でエラーが発生するため、//@ sourceURL=blahを本稼働状態のままにしないでください。
Jethro Larson

debugger問題の原因はおそらくソースのコメントではなく、おそらくJSによって無視されます
カイルシンプソン、

つまり、条件付きコンパイルで問題が発生する可能性があります。例:javascriptkit.com/javatutors/conditionalcompile.shtml
Jethro Larson、

5

UPDATE:sourceUrlの構文が変更され(@が#に置き換えられました)、サポートされていないブラウザーでのエラーが回避されます(読み取り:IE)。詳細


2

提供したコードと次のようなデバッガーステートメントでChrome(12.0.742.112)を使用する

    script.text =   "debugger;var someVariable = 0;\n" +
    "someVariable = window.outerWidth;\n" +
    "alert(someVariable);";

chrome_debugger

私のために働く。

それを実行する前に、JavaScript(すべてのjQueryセレクターのスコープを現在のパーシャル> view divに制限する)を変更する必要があります。

HTMLボディにスクリプト要素を作成する代わりに、セレクターの変更を部分ビューのイベントにバインドすると、より具体的になります(正しくないと思います)。

あなたはこのようなことをすることができます

   (function(j)(
      var limiting_selector = '';
      j(".partial_views").bind('focusin over',function(e){
         limiting_selector = j(this).attr('someattr') // or j(this).data('limiting-selector')
      }).bind('focusout out',function(e){
         limiting_selector = '';
      });
      // And then go on with
      // j(limiting_selector+' .someclass')
   ))(jQuery)

このコードは、HTMLがめちゃくちゃにならないことを前提として、マウスが特定の要素内にあるときに行われるすべてのjQuery選択操作に常に制限セレクターを追加します。

(まだハッカーっぽいようですが、誰かがより良い解決策を持っている可能性があります)

乾杯


1

Firebugでは、ページが読み込まれ、スクリプトが挿入された後、そのスクリプトを確認できるはずです。その場合、適切な場所にブレークポイントを設定でき、ページを更新したときにそれが保持されます。


あなたが正しい。それはうまくいきません。eval()で試しましたが、Firebugを使用すると、ブレークポイントを設定できます。eval()を使用できず、スクリプトタグを設定する必要がある理由はありますか?さらに一般的には、この動的なJavaScriptをサーバー上の個別の.jsファイルとして提供できない理由はありますか?どのような問題を解決しようとしていますか?
Moishe Lettvin 2009

実行する前に、JavaScript(すべてのjQueryセレクターのスコープを現在の部分ビューdivに制限する)を変更する必要があります。または、私の最近の質問を解決するためのアイデアがあります。詳細については、最近の質問をご覧ください。
Soul_Master 2009年

1

動的に読み込まれたJavascriptは引き続きブラウザーで解析する必要があります。これはWebKitまたはFireBugデバッガーが置かれる場所なので、デバッガーの対象になります。これはIE8の開発者ツールでも同じだと思います。

したがって、コードはデバッガーの対象となるため、エラーが発生しない場合、問題が発生するのはそのファイルまたはテキストではありません。

もう1つscript.text = "alert('Test!');";は有効ではないため、すべてのブラウザで機能するわけではありません。script.innerHTML = "alert('Test!');";

innerHTMLであっても、HTMLタグ内のコードを意味します。これは、最もよく使用されるHTML内のHTMLではなく、このために使用されるため、誤って説明されます

2つの更新用に編集

そしてChromeを使った2回目のアップデートで私はこれをしました

about:blankに移動し、コンソールを開いてください

var script = document.createElement('script')
script.setAttribute("type","text/javascript")
script.innerHTML = "alert('Test!');debugger;";

document.getElementsByTagName('head')[0].appendChild(script);

その後、壊れて、スクリプトタブが開き、about:blankが表示されます(何も表示されません)。

次に、右側にコールスタックリストを表示し、2番目の(無名関数)をクリックすると、表示されます。

したがって、ファイルには実行中のコードである(無名関数)があり、そこにブレークポイントが表示されます。だからあなたは正しいものを知っています。


0

使用するGoogle Chromeの(またはSafariの)開発者ツールを、あなたはラインでJavaScriptの行を実行することができます。

開発者ツール>スクリプト>デバッグするスクリプトを選択>する右側の一時停止記号または行番号をクリックしてブレークポイントを設定する


0

私のコードにconsole.log( '')ステートメントを追加して使用したい1つのオプション。このステートメントがコンソールに表示されると、行番号が関連付けられます。その番号をクリックしてソース内の場所に移動し、ブレークポイントを設定できます。このアプローチの欠点は、ページの再読み込み後もブレークポイントが保持されず、デバッガーを追加する前にコードを実行する必要があることです。


0

現在のGoogle Chromeブラウザーまたはその他の最新のブラウザーでは、次の画像のような開発者ツールを使用して、評価されたコードを簡単に検索できます。

  1. 動的ロードファイルをシミュレートします。

ここに画像の説明を入力してください

  1. 押してCtrlキー+ Shiftキー+ Fソースタブと上記の関数を検索します。

ここに画像の説明を入力してください

ブレークポイントを作成し、関数を実行してテストします。

ここに画像の説明を入力してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.