web-dev-qa-db-fra.com

Comment puis-je déterminer le numéro de ligne actuel en JavaScript?

JavaScript dispose-t-il d'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)?

71
Matthew Murdoch

var thisline = new Error().lineNumber

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

var stack = new Error().stack

Ensuite, recherchez le numéro de ligne dans la pile.

55
z5h

vous pouvez utiliser

function test(){
    console.trace();
}
test();
25
baligena

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];
}
21
jwatt

Vous pouvez essayer d'analyser une source d'une fonction pour rechercher des marques.
Voici un exemple rapide (oui, c'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;
}
3
Mikhail Nasyrov

tu peux essayer:

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

puis jetez une erreur où vous voulez savoir (pas trop désiré, mais cela pourrait vous aider si vous êtes en train de déboguer.

Remarque: window.onerror n'est pas défini/géré dans WebKit ou Opera (la dernière fois que j'ai vérifié)

1
scunliffe

injectez l'extrait suivant dans votre code:

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

Si votre code est javascript + PHP, le numéro de ligne actuel PHP est disponible en javascript sous forme de constante littérale, car il est disponible dans PHP en tant que <?= __LINE__ ?>.

(En supposant que vous avez PHP de courtes balises activées, évidemment).

Ainsi, par exemple, en javascript, vous pouvez dire:

this_php_line_number = <?= __LINE__ ?>;

Toutefois, si vous ne faites pas attention, le numéro de ligne PHP peut être différent du numéro de ligne javascript, car PHP "mange" les lignes sources avant que le navigateur ne les voie. Le problème consiste donc à s'assurer que vos numéros de ligne PHP et javascript sont identiques. S'ils sont différents, l'utilisation du débogueur javascript du navigateur est 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é bas (javascript).

Voici à quoi ressemble mon code:

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

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

Cela crache suffisamment de nouvelles lignes pour que le numéro de ligne vu par javascript soit 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 limite mon utilisation de PHP à un code qui ne modifie pas les numéros de ligne.

Le "-6" indique que mon code PHP commence à la ligne 8. Si vous commencez votre code PHP plus tôt, vous réduisez ce nombre. Certaines personnes placent leur PHP tout en haut, même devant le DOCTYPE.

(La ligne Meta Viewport désactive l’accroissement de la police de caractères d’Android Chrome, conformément à ce Q & A: Chrome sur Android redimensionne la police . Considérez-la comme une passe-passe, dont chaque page Web a besoin.)

La ligne suivante sert uniquement à vérifier que je n'ai pas commis d'erreur. Vus dans le débogueur du navigateur ou par un clic droit/page Web, cela devient un commentaire HTML indiquant le nom du fichier source et le numéro de ligne corrects:

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

0
Dave Burton