Ist es möglich, dynamisches Laden von JavaScript mit einem Debugger wie WebKit, FireBug oder IE8 Developer Tool zu debuggen?

90

Aus meiner letzten Frage habe ich bereits eine JavaScript-Funktion zum dynamischen Laden einer Teilansicht erstellt. Daher kann ich kein dynamisches Laden von JavaScript debuggen. Weil das gesamte geladene JavaScript von der Funktion "eval" ausgewertet wird.

Ich habe jedoch eine Möglichkeit gefunden, neues JavaScript mithilfe des folgenden Skripts zu erstellen, um ein Skript dynamisch in den Header des aktuellen Dokuments zu erstellen. Alle geladenen Skripte werden im HTML-DOM angezeigt (Sie können jeden Debugger verwenden, um sie zu finden).

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

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

Übrigens können die meisten Debugger (IE8 Developer Toolbar, Firebug und Google Chrome) in keinem dynamischen Skript einen Haltepunkt setzen. Weil das debuggbare Skript beim ersten Laden nach dem Laden der Seite geladen werden muss.

Haben Sie eine Idee zum Debuggen in dynamischen Skriptinhalten oder -dateien?

Update 1 - Quellcode zum Testen hinzufügen

Sie können die folgende xhtml-Datei verwenden, um zu versuchen, einen variablen Wert zu debuggen.

<!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>

Nach der Antwort teste ich es einfach in FireBug. Das Ergebnis sollte wie unten abgebildet angezeigt werden.

Alternativtext http://d7cgnq.bay.livefilestore.com/y1pJGV27qEARXzZhsMMhPD5z0OxAtnkQK8eKeEXMAxuHjsuWeAq1aGl7sTISRNqVv3lw8ghyxE_GorlwSug.0

Bitte schauen Sie sich das Skript "dynamicLoadingScript" an, das nach dem Laden der Seite hinzugefügt wird.

Alternativtext http://d7cgnq.bay.livefilestore.com/y1pz_RwqjgeVqe2mAlUZha0PalpPdP0X5AiwJcQhYahERlnbPDdZpb-_d1e96Q-14raSDMJOBsdcV9jsi4bugcgybbyybyb

Es wird jedoch nicht in der Skriptregisterkarte von FireBug gefunden

Update 2 - Debug-Haltepunkt im dynamischen Ladeskript erstellen

Alternativtext http://d7cgnq.bay.livefilestore.com/y1peKdIMOztXss-pc8PlJEmaGov_0ShYnLsuDdK5OLETbCG0UpkX6Te29w0YW2pNKaD_0ANAiizh2GdGPAAp_1Q

Alternativtext http://d7cgnq.bay.livefilestore.com/y1pUeHaHoTXj0WBl74fnTrXwdr_y7s7h8jNKfslSONgshzZBpUddGHNBWA9cXRabo3HAl3QazeozrCABo7pNVxGG

Beide obigen Bilder zeigen das Einfügen von "Debugger". Die Anweisung in einer Skriptzeile kann einen Haltepunkt im dynamischen Ladeskript auslösen. Beide Debugger zeigen jedoch keinen Code am Haltepunkt an. Daher ist es dafür nutzlos.

Vielen Dank,

Seelen Meister
quelle
Haben Sie zufällig eine Lösung dafür gefunden? Ich bin hier mit dem gleichen Problem.
AdamJLev
Versuchen Sie, eine separate Datei dynamisch zu laden, dh sehen Sie hier eine Implementierung. Queryj.com/2011/03/11/a-lightweight-script-loader - Ich finde, dass die Debugger das viel einfacher handhaben.
James Westgate
@ unfinity, überprüfen Sie meine Lösung
Molecular Man
3
2014 und deine Bilder sind immer noch tot - Kannst du sie wiederholen?
TheGeekZn
Ich habe eine ähnliche Frage, kann sie aber nicht sagen, da die Bilder kaputt sind. Können Sie sie aktualisieren?
Eric

Antworten:

117

Es wäre auch möglich, Chrom für dasselbe zu verwenden. Chrome verfügt über eine Funktion, mit der Sie ein Parser-Attribut angeben und das dynamische JS als Teil einer Datei anzeigen können, die dann durchsucht und Haltepunkte festgelegt werden können.

Das Attribut, das festgelegt werden muss, ist

//# sourceURL=dynamicScript.js

Dabei ist dynamicScript.js der Name der Datei, die im Skriptdateibrowser angezeigt werden soll.

Weitere Informationen hier

Paul Irish spricht auch kurz darüber in seinem ausgezeichneten Vortrag über Tooling & The Webapp Development Stack

Eiswürfel
quelle
5
Wenn jemand Probleme mit MVC3 / Razor hat, denken Sie daran, das @ -Symbol zu maskieren, also so etwas wie // @@ sourceURL = dynamiccript.js. Und nur zu Ihrer Information, das oben Genannte funktioniert auch in Firebug.
Parsh
1
Sie können diese Funktion auch für dynamische Inline-Javascripts verwenden. Wenn Sie jedoch eine Ausnahme in diesem Skript haben, wird diese nicht in der Quellenliste angezeigt.
Roman Snitko
4
Beachten Sie, dass die neue Syntax "// # sourceURL = dynamicScript.js" von @ nach #
geändert wird
3
Der aktualisierte Link zum Abschnitt mit den Chrome-Entwicklertools auf den
Quellkarten
3
Für mich wurde die js-Datei in der Quellenliste innerhalb einer Gruppe namens "(keine Domäne)" angezeigt. Könnte erwähnenswert sein, da ich es zuerst verpasst habe!
JMac
21

Versuchen Sie, einen "Debugger" hinzuzufügen. Anweisung in dem Javascript, das Sie dynamisch hinzufügen. Dies sollte dazu führen, dass es unabhängig von den Haltepunkteinstellungen an dieser Zeile angehalten wird.

Joeri Sebrechts
quelle
Ich kann nur Folgendes finden: code.google.com/p/fbug/issues/detail?id=1259 . Übrigens verwende ich ein Skript-Tag, das an den Kopf angehängt wird, um Skripte dynamisch zu laden (aber mit einem src-Attribut), und der auf diese Weise hinzugefügte Code ist für mich in allen Browsern debuggbar, auch wenn er nicht zusammen mit der Startseite geladen wird.
Joeri Sebrechts
Mit welchem ​​genauen Code fügen Sie das Skript-Tag hinzu? Ich habe das gleiche Problem wie das OP, wodurch es unmöglich wird, dynamisch geladene JS-Dateien in Chrome zu debuggen. Vielen Dank!
AdamJLev
var loaderNode = document.createElement ("script"); loaderNode.setAttribute ("Typ", "Text / Javascript"); loaderNode.setAttribute ("src", url); document.getElementsByTagName ("head") [0] .appendChild (loaderNode);
Joeri Sebrechts
18

Ja, es ist (jetzt) ​​möglich, dynamisch geladenes JavaScript mit Google Chrome zu debuggen!

debugger;Für dynamisch geladene JS-Dateien müssen keine zusätzlichen oder anderen Attribute hinzugefügt werden. Führen Sie zum Debuggen einfach die folgenden Schritte aus:

Methode 1:

Mein technischer Leiter zeigte nur eine super einfache Möglichkeit, dynamisch geladene Javascript-Methoden zu debuggen.

  1. Öffnen Sie die Chrome-Konsole, schreiben Sie den Namen der Methode und drücken Sie die Eingabetaste.
    In meinem Fall ist es GetAdvancedSearchConditonRowNew
    Wenn die JS-Methode geladen wurde, wird die Definition der Methode angezeigt.

Geben Sie hier die Bildbeschreibung ein


  1. Klicken Sie auf die Definition der Methode und die gesamte JS-Datei wird zum Debuggen geöffnet :)

Geben Sie hier die Bildbeschreibung ein


Methode 2:

Als Beispiel lade ich eine JS-Datei, wenn ich mit einem ajaxAufruf auf eine Schaltfläche klicke.

  1. Öffnen Sie den networkTab in den Google Chrome Dev Tools
  2. Klicken Sie auf ein Steuerelement (z. B. Schaltfläche), das eine Javascript-Datei lädt und eine Javascript-Funktion aufruft.
  3. Beobachten Sie die Registerkarte "Netzwerk" und suchen Sie nach dieser JS-Funktion (in meinem Fall RetrieveAllTags?_=1451974716935)
  4. Bewegen Sie den Mauszeiger darüber initiaterund Sie finden Ihre dynamisch geladene JS-Datei (mit Präfix VM*).

Debuggen Sie das dynamische Laden von JavaScript in Chrome -1


  1. Klicken Sie auf diese VM*Datei, um sie zu öffnen.
  2. Fügen Sie den Debugger in diese Datei ein, wo immer Sie möchten: D.

Debuggen Sie das dynamische Laden von JavaScript in Chrome -1


JerryGoyal
quelle
Schade bei Google, dass dies so stumpf ist. 1 / Shame = Kudos (die Umkehrung der Schande) an Sie für das Herausziehen :)
Toddmo
16

Ich verwende zu diesem Zweck Google Chrome.

In Chrome auf der Registerkarte "Skripte" können Sie "Bei allen Ausnahmen pausieren" aktivieren.

Geben Sie hier die Bildbeschreibung ein

Und dann irgendwo in Ihre Codezeile einfügen try{throw ''} catch(e){}. Chrome stoppt die Ausführung, wenn diese Zeile erreicht ist.

BEARBEITEN: Das Bild wurde geändert, damit klarer wird, wovon ich spreche.

Molecular Man
quelle
Für die Entwicklung in Google Chrome sollten Sie einen Text einfügen, der den Namen des aktuellen dynamischen Skripts angibt, wenn jQuery oder ein anderes Ladeskript ein Skript an DOM anhängt, wie ich es dem jQuery-Team gemeldet habe. Aber ich habe keine Zeit, daran zu arbeiten. bugs.jquery.com/ticket/8292
Soul_Master
@Soul_Master, aber mit meiner Methode müssen Sie keinen Text einfügen. Sie fügen in Ihre dynamische Skriptzeile ein try{throw ''} catch(e){}und aktivieren dann den Modus "Bei allen Ausnahmen pausieren". Chrome stoppt die Ausführung, wenn eine Ausnahme ausgelöst wird. Ich habe es oft überprüft. Ich habe ein anderes Bild geladen. Dort ist klarer, wovon ich spreche.
Molecular Man
In Chrome können Sie die Anweisung "debugger;" verwenden, um eine Anweisung zu unterbrechen, wenn das Debugger-Bedienfeld geöffnet ist. Chrome ignoriert dies einfach, wenn das Debugger-Panel geschlossen ist.
Dinesh Ygv
@ Dineshygv, du kannst ... jetzt. Aber vor 3 Jahren konnte man nicht. debuggerwürde damals nicht in dynamisch erstellten Skripten funktionieren.
Molecular Man
10

Ich denke, Sie müssen dem eval'd-Code möglicherweise einen "Namen" wie diesen geben:

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

Wenn Sie dies tun, ist es wahrscheinlich, dass der debuggerAnsatz von "Update 2" dann funktionieren sollte.

Kyle Simpson
quelle
Ja. Ich sehe es. Ich habe diesen Fehler bereits lange Zeit dem jQuery-Team gemeldet. bugs.jquery.com/ticket/8292
Soul_Master
1
Warnung! Die beschriebene Technik verursacht einen Fehler in IE7. Lassen Sie die Technik also nicht //@ sourceURL=blahin der Produktion.
Jethro Larson
Es ist wahrscheinlich der debuggerTeil, der Probleme verursacht, nicht der Quellkommentar (der von JS sicherlich ignoriert wird)
Kyle Simpson
Dies kann zu Problemen bei der bedingten Kompilierung führen. Beispiel: javascriptkit.com/javatutors/conditionalcompile.shtml
Jethro Larson
5

UPDATE : Die Syntax für sourceUrl wurde geändert (@ wird durch # ersetzt), um Fehler in nicht unterstützten Browsern zu vermeiden (lesen Sie: IE). Einzelheiten

DJ_HOEK
quelle
2

Verwenden von Chrome (12.0.742.112) mit dem von Ihnen angegebenen Code und einer solchen Debugger-Anweisung

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

chrome_debugger

funktioniert bei mir.

Ich muss etwas JavaScript ändern (den Umfang aller jQuery-Selektoren auf das aktuelle partielle> view div beschränken), bevor ich es ausführe.

Möglicherweise ist es greifbarer, wenn Sie die Selektoränderung an ein Ereignis in Ihrer Teilansicht binden, anstatt Skriptelemente im HTML-Text zu erstellen (fühlt sich nicht richtig an).

Sie könnten so etwas tun

   (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)

Dieser Code fügt allen jQuery-Auswahlvorgängen, die ausgeführt werden, während sich die Maus in einem bestimmten Element befindet, immer einen einschränkenden Selektor hinzu, da der HTML-Code nicht durcheinander gebracht werden soll.

(Scheint immer noch hackerisch, vielleicht hat jemand eine bessere Lösung)

Prost

krichard
quelle
1

In Firebug sollten Sie dieses Skript sehen können, nachdem die Seite geladen und das Skript eingefügt wurde. Wenn Sie dies tun, können Sie an der entsprechenden Stelle einen Haltepunkt festlegen, der beim Aktualisieren der Seite erhalten bleibt.

Moishe Lettvin
quelle
Du hast recht. Das geht nicht Ich habe es mit eval () versucht und mit Firebug können Sie einen Haltepunkt setzen, wenn Sie diesen verwenden. Gibt es einen Grund, warum Sie eval () nicht verwenden können und ein Skript-Tag festlegen müssen? Gibt es einen Grund, warum Sie dieses dynamische Javascript nicht als separate .js-Datei auf Ihrem Server bereitstellen können? Welches Problem versuchen Sie zu lösen?
Moishe Lettvin
Ich muss etwas JavaScript ändern (den Umfang aller jQuery-Selektoren auf das aktuelle Teilansicht-Div beschränken), bevor ich es ausführe. Oder Sie haben eine Idee zur Lösung meiner letzten Frage. Weitere Informationen finden Sie in meiner letzten Frage.
Soul_Master
1

Dynamisch geladenes Javascript muss noch vom Browser analysiert werden. Hier befindet sich WebKit oder der FireBug-Debugger, sodass es dem Debugger unterliegt, egal was passiert. Ich denke, dies gilt auch für die Entwicklertools in IE8.

Ihr Code unterliegt also dem Debugger. Wenn Sie also ein Problem haben, befindet es sich nicht in dieser Datei oder diesem Text, wenn kein Fehler auftritt

Die andere Sache ist script.text = "alert('Test!');";nicht gültig, so dass es nicht in allen Browsern funktioniert, was Sie wollenscript.innerHTML = "alert('Test!');";

Obwohl es sich um innerHTML handelt, bedeutet es, dass Code in den HTML-Tags nicht der HTML-Code in den am häufigsten verwendeten Personen ist, sodass er falsch erklärt wird

BEARBEITET FÜR UPDATE ZWEI

Und beim zweiten Update mit Chrome habe ich das gemacht

Gehe zu ungefähr: leer Öffne die Konsole und gehe hinein

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

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

dann wird es kaputt gehen und die Skript-Registerkarte mit ungefähr: leer angezeigt (nichts zu sehen)

Zeigen Sie dann auf der rechten Seite die Liste der Aufrufstapel an, klicken Sie dann auf die zweite (anonyme Funktion) und es wird Ihnen angezeigt.

In Ihrer Datei befindet sich also eine (anonyme) Funktion, die der von Ihnen ausgeführte Code ist, und Sie sehen dort den Haltepunkt. Sie wissen also, dass Sie im richtigen sind.

Barkermn01
quelle
0

Mit dem Google Chrome (oder Safari ) Developers Tool können Sie JavaScript Zeile für Zeile ausführen.

Developer Tool- >Skripte >Wählen Sie >auf der rechten Seite das Skript aus, für das Sie das Pausenzeichen debuggen möchten, oder legen Sie Haltepunkte fest, indem Sie auf die Zeilennummer klicken

Derek 朕 會 功夫
quelle
0

Eine Option, die ich gerne verwende, um eine console.log ('') - Anweisung in meinen Code einzufügen. Sobald diese Anweisung in der Konsole angezeigt wird, wird ihr eine Zeilennummer zugeordnet. Sie können auf diese Nummer klicken, um zum Speicherort in der Quelle zu gelangen und einen Haltepunkt festzulegen. Der Nachteil dieses Ansatzes besteht darin, dass Haltepunkte beim erneuten Laden von Seiten nicht beibehalten werden und Sie den Code durchlaufen müssen, bevor Sie einen Debugger hinzufügen können.

IcedDante
quelle
0

Für aktuelle Google Chrome-Browser oder andere moderne Browser können Sie mit dem Entwicklertool wie den folgenden Bildern problemlos nach ausgewertetem Code suchen.

  1. Simulieren Sie eine dynamische Ladedatei.

Geben Sie hier die Bildbeschreibung ein

  1. Drücken Sie Strg + Umschalt + F auf der Registerkarte Quelle und suchen Sie nach der obigen Funktion.

Geben Sie hier die Bildbeschreibung ein

Erstellen Sie einen Haltepunkt und führen Sie die Funktion aus, um ihn zu testen.

Geben Sie hier die Bildbeschreibung ein

Seelen Meister
quelle