2010-02-26 17 views
57

¿Tiene JavaScript un mecanismo para determinar el número de línea de la instrucción que se está ejecutando actualmente (y si es así, de qué se trata)?¿Cómo puedo determinar el número de línea actual en JavaScript?

+0

Posible duplicado de [¿Cómo obtener el número de línea de la función de llamante de JavaScript? ¿Cómo obtener la URL de origen del llamador de JavaScript?] (Http://stackoverflow.com/questions/1340872/how-to-get-javascript-caller-function-line-number-how-to-get-javascript- calller) –

Respuesta

49

var thisline = new Error().lineNumber

Si eso no funciona en cualquier ambiente que está utilizando, puede intentar:

var stack = new Error().stack

A continuación, buscar a través de la pila para obtener el número de línea.

+2

Will no funciona en IE, la propiedad 'lineNumber' no existe en los objetos de error. Tampoco 'stack' :-) –

+0

hay un número de línea en IE. Lo sé porque cuando mi javascript arroja un error, dice que está en una línea con un número superior a 100 millones. – Malfist

+1

en Chome es error.lineno – PanosJee

1

que puede probar:

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

luego tirar un error en el que desea saber (no desea demasiado, pero podría ayudarle si está depurando

Nota:. window.onerror no está definido/manejados en WebKit u Opera (última vez que revisé)

+1

Tenga en cuenta que window.onerror no funciona en webkit: https://bugs.webkit.org/show_bug.cgi?id=8519 – Annie

+1

Interesante. Incluso podría crear una función especial 'throwAndResume (resumeFunction);' que almacenaría resumeFunction, arrojaría el error, y en su manejador de errores registrará los detalles y luego llamará a resumeFunction para continuar con su programa. – z5h

3

Usted puede tratar de analizar una fuente de una función de buscar algunas marcas.
Aquí está un ejemplo rápido (sí, es un poco en mal estado).

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

inyectar el siguiente fragmento de código:

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

reemplace el nombre del protocolo según sea necesario (por ejemplo, "http:") – crishushu

+0

No pude hacer que esto funcione. Obtengo 'TypeError:/\ (http: [\ w \ d /.-] +: ([\ d] +) /. Exec (...) es nulo'. – Ryan

15

Un poco más portable entre diferentes navegadores y versiones de navegadores (debería funcionar en Firefox, Chrome y 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

Gracias. He adaptado su sugerencia a esto: http://stackoverflow.com/a/37081135/470749 – Ryan

+0

Si ajusta la expresión regular, puede devolver los números de línea y columna: 'var frameRE = /: (\ d +: \ d +) [^ \ d] * $/; 'que es mucho más útil, particularmente cuando el JS se reduce a una sola línea larga. –

18

puede usar

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

Con mucho, la solución más simple e incluso funciona en MS Edge. – Danger

-1

Si su código es Javascript + PHP, entonces el número de línea actual de PHP está disponible en javascript como una constante literal, ya que está disponible en PHP como   <?= __LINE__ ?>

(Eso suponiendo que tiene las etiquetas cortas PHP habilitado, obviamente.)

Así por ejemplo, en javascript que se puede decir:

this_php_line_number = <?= __LINE__ ?>; 

sin embargo, si no se tiene cuidado, el número de línea de PHP puede ser diferente del número de línea de javascript, porque PHP "come" líneas de código antes de que el navegador lo ve ellos. Entonces, el problema es asegurarse de que sus números de línea PHP y JavaScript sean los mismos. Si son diferentes, el uso del depurador de JavaScript del navegador es mucho menos agradable.

Puede asegurarse de que los números de línea sean los mismos al incluir una instrucción PHP que escriba el número correcto de líneas nuevas necesarias para sincronizar los números de línea del lado del servidor (PHP) y del lado del navegador (javascript).

Esto es lo que se ve mi código como:

<!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 clave es esta declaración PHP:

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

Eso es escupe suficientes saltos de línea para hacer el número de línea vista por javascript sea el mismo que el Número de línea PHP. Todas las definiciones de función PHP, etc. están en la parte superior, delante de esa línea.

Después de esa línea, restrinjo el uso de PHP a un código que no cambia los números de línea.

El "-6" representa el hecho de que mi código PHP comienza en la línea 8. Si inicia su código PHP anteriormente, reducirá ese número. Algunas personas ponen su PHP justo en la parte superior, incluso antes del DOCTYPE.

(La línea de visualización meta desactiva Android Chrome "font impulsar" por este stackoverflow Q & A:.. Chrome on android resizes font Consideramos que es repetitivo, que todas las páginas web de las necesidades)

La siguiente línea es sólo para verificar que no he cometió un error Visto de depurador del navegador, o haciendo clic con el botón/Parada en página web, se convierte en un comentario HTML que muestra el nombre correcto archivo de origen y número de línea:

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

se convierte en:

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

Ahora, donde sea que vea un número de línea, ya sea en un mensaje de error o en el depurador de JavaScript, es correcto. Los números de línea de PHP y los números de línea de JavaScript son siempre consistentes e idénticos.

Cuestiones relacionadas