2010-02-26 12 views
57

Est-ce que JavaScript a un mécanisme pour déterminer le numéro de ligne de l'instruction en cours d'exécution (et si oui, de quoi s'agit-il)?Comment puis-je déterminer le numéro de ligne en cours dans JavaScript?

+0

Copie possible de [Comment obtenir le numéro de ligne de la fonction d'appelant JavaScript? Comment obtenir l'URL de la source de l'appelant JavaScript?] (Http://stackoverflow.com/questions/1340872/how-to-get-javascript-caller-function-line-number-how-to-get-javascript-caller) –

Répondre

49

var thisline = new Error().lineNumber

Si cela ne fonctionne pas dans tout l'environnement que vous utilisez, vous pouvez essayer:

var stack = new Error().stack

chasser ensuite par la cheminée pour le numéro de ligne.

+2

Will ne fonctionne pas dans IE, la propriété 'lineNumber' n'existe pas sur les objets d'erreur. La pile n'est pas non plus :-) –

+0

il y a un numéro de ligne quelque part sur IE. Je sais cela parce que quand mon javascript jette une erreur, il dit qu'il est sur une ligne avec un nombre supérieur à 100 millions. – Malfist

+1

sur Chome est-il error.lineno – PanosJee

1

vous pouvez essayer:

window.onerror = handleError; 
function handleError(err, url, line){ 
    alert(err + '\n on page: ' + url + '\n on line: ' + line); 
} 

puis lancer une erreur où vous voulez savoir (pas trop désiré, mais il peut vous aider si vous déboguez

Note:. window.onerror ne définit pas/traitées dans WebKit ou Opera (la dernière fois que j'ai vérifié)

+1

Notez que window.onerror ne fonctionne pas dans webkit: https://bugs.webkit.org/show_bug.cgi?id=8519 – Annie

+1

Intéressant. Vous pouvez même créer une fonction spéciale 'throwAndResume (resumeFunction);' qui va stocker resumeFunction, lancer l'erreur, et dans votre gestionnaire d'erreurs, consigner les détails, puis appeler resumeFunction pour continuer votre programme. – z5h

3

Vous pouvez essayer d'analyser une source d'une fonction de rechercher des marques.
Voici un exemple rapide (oui, il est un peu foiré).

function foo() 
{  
    alert(line(1)); 
    var a; 
    var b;  
    alert(line(2)); 
} 
foo(); 

function line(mark) 
{ 
    var token = 'line\\(' + mark + '\\)';  
    var m = line.caller.toString().match(
     new RegExp('(^(?!.*' + token + '))|(' + token + ')', 'gm')) || []; 
    var i = 0; 
    for (; i < m.length; i++) if (m[i]) break; 
    return i + 1; 
} 
1

injectent l'extrait suivant à votre code:

console.debug("line:", /\(file:[\w\d/.-]+:([\d]+)/.exec(new Error().stack)[1]); 
+0

remplacez le nom du protocole si nécessaire (par exemple "http:") – crishushu

+0

Je ne pouvais pas obtenir ce travail. Je reçois 'TypeError:/\ (http: [\ w \ d /.-] +: ([\ d] +) /. Exec (...) est nul. ' – Ryan

15

Un peu plus portable entre différents navigateurs et versions de navigateur (devrait fonctionner dans Firefox, Chrome et IE10 +):

function ln() { 
    var e = new Error(); 
    if (!e.stack) try { 
    // IE requires the Error to actually be throw or else the Error's 'stack' 
    // property is undefined. 
    throw e; 
    } catch (e) { 
    if (!e.stack) { 
     return 0; // IE < 10, likely 
    } 
    } 
    var stack = e.stack.toString().split(/\r\n|\n/); 
    // We want our caller's frame. It's index into |stack| depends on the 
    // browser and browser version, so we need to search for the second frame: 
    var frameRE = /:(\d+):(?:\d+)[^\d]*$/; 
    do { 
    var frame = stack.shift(); 
    } while (!frameRE.exec(frame) && stack.length); 
    return frameRE.exec(stack.shift())[1]; 
} 
+0

Merci J'ai adapté votre suggestion à ceci: http://stackoverflow.com/a/37081135/470749 – Ryan

+0

Si vous ajustez la regex, vous pouvez retourner les numéros de ligne et de colonne: 'var frameRE = /: (\ d +: \ d +) [^ \ d] * $/; 'ce qui est beaucoup plus utile, en particulier lorsque le JS est minifié en une longue ligne –

18

vous pouvez utiliser

function test(){ 
    console.trace(); 
} 
test(); 
+1

De loin la solution la plus simple et il fonctionne même sur MS Edge. – Danger

-1

Si votre code est javascript + PHP, puis le numéro de ligne de PHP est disponible en javascript comme une constante littérale, car il est disponible en PHP comme   <?= __LINE__ ?>

(Cela suppose que vous avez des balises PHP courtes activées, évidemment.)

donc , par exemple, en javascript vous pouvez dire:

this_php_line_number = <?= __LINE__ ?>; 

Cependant, si vous ne faites pas attention, le numéro de ligne de PHP peut être différent du numéro de ligne javascript, parce que PHP « mange » des lignes de source avant que le navigateur voit jamais leur. Donc le problème devient de s'assurer que vos numéros de ligne PHP et javascript sont les mêmes. Si elles sont différentes, cela rend l'utilisation du débogueur javascript du navigateur beaucoup moins agréable.

Vous pouvez vous assurer que les numéros de ligne sont les mêmes en incluant une instruction PHP qui écrit le nombre correct de nouvelles lignes nécessaires pour synchroniser les numéros de ligne côté serveur (PHP) et côté navigateur (javascript).

Voici ce que mon code ressemble à:

<!DOCTYPE html> 
<html lang="en"> 
<!-- Copyright 2016, 2017, me and my web site --> 
<head> 
    <meta charset="utf-8"> 
    <meta name="viewport" content="initial-scale=1, user-scalable=yes"> 

<?php 

...lottsa PHP stuff here, including all PHP function definitions ... 

echo str_repeat("\n",__LINE__-6); # synchronize PHP and Javascript line numbers 
?> 
<!-- *** this is line <?php echo __LINE__ . ' of ' . basename(__FILE__); ?> *** --> 

    <title>My web page title</title> 

...lottsa HTML & Javascript stuff here... 

</body> 
</html> 
<!-- *** this is line <?php echo __LINE__ . ' of ' . basename(__FILE__); ?> *** --> 

La clé est cette déclaration de PHP:

echo str_repeat("\n",__LINE__-6); 

C'est recrache assez nouvelles lignes pour rendre le numéro de ligne vu par javascript être le même que le Numéro de ligne PHP. Toutes les définitions de fonctions PHP, etc. sont en haut, en avant de cette ligne. Après cette ligne, je restreins mon utilisation de PHP au code qui ne change pas les numéros de ligne. Le "-6" explique que mon code PHP commence à la ligne 8. Si vous commencez votre code PHP plus tôt, vous réduirez ce nombre. Certaines personnes mettent leur PHP directement au sommet, même avant le DOCTYPE.

(La ligne meta viewport désactive "font booster" Android Chrome par ce stackoverflow Q & A:.. Chrome on android resizes font Considérez-passe-partout, qui tous les besoins de la page Web)

La ligne suivante est juste pour vérifier que havre de paix I pas fait une erreur. Vu dans le débogueur du navigateur ou par un clic droit/enregistrer-page web, il devient un commentaire HTML qui affiche le nom et le numéro de ligne du fichier source correcte:

<!-- *** this is line <?php echo __LINE__ . ' of ' . basename(__FILE__); ?> *** --> 

devient:

<!-- *** this is line 1234 of my_file.php *** --> 

Maintenant, partout où je vois un numéro de ligne, que ce soit dans un message d'erreur ou dans le débogueur javascript, c'est correct. Les numéros de ligne PHP et les numéros de ligne javascript sont toujours cohérents et identiques.