0

Lors de la création dynamique d'un élément de script et de son ajout à la page, mes erreurs ne me donnent pas les numéros de ligne du script, mais plutôt le numéro de ligne auquel j'ajoute le script.Comment puis-je obtenir le numéro de ligne d'une erreur dans une balise <script> ajoutée dynamiquement?

Le code ci-dessous dans un fichier .js vous donnera une erreur de numéro de ligne de la ligne document.appendChild(script) activée. L'extrait de code, s'il est exécuté, renvoie le bon numéro de ligne. comment font-ils ça?

var script = document.createElement("script"); 
 
script.innerHTML = "\n\n\n\n\n\n\nfoo.bar"; //error should be on line 8 
 

 
document.head.appendChild(script)

+0

http://meta.stackoverflow.com/questions/336082/the-searchbar-works-better-with-tags-than-questions-explaining-this-could-reduc?noredirect=1#comment403450_336082 –

+0

quelque chose est apparu dans la barre latérale http://stackoverflow.com/questions/20838067/catch-js-errors-when-adding-a-script-dynamically?rq=1 –

+0

la question précédente a inspiré la réponse à celui-ci, même si elle ne le fait pas vraiment le montrer. –

Répondre

0

Vous l'avez. Ajout d'une prise d'essai autour du code fonctionne très bien

catchableScript = function(scriptText) { 
    var scriptText = "try {\n"+scriptText+"\n} \n catch(ex){console.log(ex.lineNumber-1)}"; 

    var script = document.createElement("script"); 
    script.innerHTML = scriptText; 

    document.head.appendChild(script) 

} 

catchableScript("\n\n\n\n\n\n\nfoo.bar"); 

Sortie: 8

En outre, l'exception a plus d'informations qui est utile, mais c'est la réponse à la question.

EDIT:

Pour ceux qui le souhaitent, en ajoutant ce code:

window.CURRENTLY_EVALED_SCRIPT = scriptText; 
var scriptText = "try {\n"+scriptText 
    +"\n} catch(ex){\n" 
    +"var lineNumber = ex.lineNumber-1;\n" 
    +"var errorOut = {};\n" 
    +"errorOut.exception = ex;\n" 
    +"errorOut.lines = window.CURRENTLY_EVALED_SCRIPT.split('\\n');\n" 
    +"var line = errorOut.lines[lineNumber-1];\n" 
    +"console.log(ex.message+' on line\\n'+line+' :: '+lineNumber, window.CURRENTLY_EVALED_SCRIPT_ELEMENT, errorOut);\n" 
      +"}"; 

    ... 

window.CURRENTLY_EVALED_SCRIPT_ELEMENT = script 

Amènerons à cette sortie dans la console:

foo is not defined on line 
foo.bar :: 8, <script>, Object { exception: ReferenceError, lines: Array[8] } 

Et vous pouvez cliquer sur <script> pour aller élément ajouté, ou lines juste pour voir un tableau de toutes les lignes.

Fonctionne comme un charme.

-1

Quand vous dites "numéro de ligne", vous voulez dire probablement le numéro de la ligne d'un fichier. Mais dans ce cas, quel est le fichier? Vous créez le script dynamiquement, donc il n'y en a vraiment pas.

Le script que vous créez ne vit que dans le DOM, c'est-à-dire la représentation en mémoire de votre code. Il semble se comporter exactement comme je m'y attends.

+0

Je suppose que oui, mais vous pouvez obtenir un linenumber d'un eval si vous attrapez l'erreur. Je vérifie actuellement si je peux utiliser window ... onerror pour l'attraper, puis obtenir le numéro de ligne –

+0

non. appels window.onerror avec juste une chaîne qui est l'erreur –