我如何确定JavaScript中的当前行号?
JavaScript是否有确定当前正在执行的语句的行号的机制(如果是这样,它是什么)?
var thisline = new Error().lineNumber
如果在您使用的任何环境下都不起作用,您可以尝试:
var stack = new Error().stack
然后通过堆栈search行号。
您可以使用
function test(){ console.trace(); } test();
在不同的浏览器和浏览器版本之间可移植一点(可以在Firefox,Chrome和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]; }
你可以尝试parsing一个函数的来源来寻找一些标记。
这是一个简单的例子(是的,这是一个小小的混乱)。
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; }
你可以试试:
window.onerror = handleError; function handleError(err, url, line){ alert(err + '\n on page: ' + url + '\n on line: ' + line); }
然后在你想知道的地方抛出一个错误(不是太想要,但是如果你正在debugging,它可能会帮助你。
注意: window.onerror
没有在WebKit或Opera中定义/处理(上次我选中)
将以下代码片段注入您的代码中:
console.debug("line:", /\(file:[\w\d/.-]+:([\d]+)/.exec(new Error().stack)[1]);
如果您的代码是javascript + PHP,那么当前的PHP行号在javascript中可用作字面常量,因为它在PHP中可用为<?= __LINE__ ?>
(这是假设你有PHP短标签启用,显然。)
所以,例如,在JavaScript中你可以说:
this_php_line_number = <?= __LINE__ ?>;
然而,如果你不小心,PHP的行号可能会不同于JavaScript的行号,因为在浏览器看到它们之前,PHP会“吃掉”源代码行。 所以问题就变成确保你的PHP和javascript行号是一样的。 如果它们不同,那么使用浏览器的JavaScriptdebugging器就不那么令人愉快了。
您可以通过包含一个PHP语句来确保行号相同,该语句写入了同步服务器端(PHP)和浏览器端(javascript)行号所需的正确数量的换行符。
这是我的代码看起来像:
<!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__); ?> *** -->
关键是这个PHP语句:
echo str_repeat("\n",__LINE__-6);
这是吐出足够多的换行符,使得由JavaScript看到的行号与PHP行号相同。 所有的PHP函数定义等都位居前列。
在那一行之后,我限制了PHP的使用,不改变行号的代码。
“-6”表示我的PHP代码从第8行开始。如果你之前启动了你的PHP代码,你将会减less这个数字。 有些人把他们的PHP放在最前面,甚至在DOCTYPE之前。
(元视口行禁用Android Chrome“字体提升”每个这个stackoverflow问题和答案 : Android上的Chrome调整字体大小,考虑它样板,每个网页需要。
下面这行只是为了validation我没有犯错。 在浏览器的debugging器中查看,或通过右键单击/ save-web-page,它将成为一个HTML注释,显示正确的源文件名和行号:
<!-- *** this is line <?php echo __LINE__ . ' of ' . basename(__FILE__); ?> *** -->
变为:
<!-- *** this is line 1234 of my_file.php *** -->
现在,无论我在哪里看到行号,无论是在错误消息还是在javascriptdebugging器中,都是正确的。 PHP行号和javascript行号总是一致的。