JavaScriptで現在の行番号を確認するにはどうすればよいですか?


回答:


69

var thisline = new Error().lineNumber

使用している環境でそれが機能しない場合は、次のことを試してください。

var stack = new Error().stack

次に、スタックを調べて行番号を探します。


3
IEではlineNumber機能しません。プロパティはエラーオブジェクトに存在しません。どちらもしません:stack
Andy E

1
IEのどこかに行番号があります。私のjavascriptがエラーをスローすると、1億を超える数の行にあると表示されるため、これを知っています。
マルフィスト2010

私はそれが1250であるべきときはかなり正確な数、その1350を取得いけない
Fzs2

1
問題:PHPを使用している場合、javascriptに表示される「ソースコード」は元のソースコードではないため、行番号が間違っています。(それはおそらくHermannに起こっていることです。)javascriptに元のPHPソースコードの行番号を表示させる方法を知っている人はいますか?解決策にはおそらく何らかの「ソースマップ」の生成が含まれますが、その方法がわかりません。確かにこれは解決された問題ですよね?
デイブバートン

注:エラーオブジェクトが作成されたときにスタック/行番号が使用できない場合があります。たとえば、Google Apps Scriptでスローされた場合のみです。その場合は、解決策についてこの回答を参照してください。
user2027 2919年

38

次を使用できます。

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

test();

1
はるかに単純なソリューションであり、MSEdgeでも機能します。
危険

27

異なるブラウザとブラウザバージョン間でもう少し移植性があります(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];
}

ありがとう。私はあなたの提案をこれに適合させました:stackoverflow.com/a/37081135/470749
ライアン

1
正規表現を調整すると、行番号と列番号の両方を返すことができます。var frameRE = /:(\d+:\d+)[^\d]*$/;これは、特にJSが1つの長い行に縮小されている場合に非常に便利です。
クインコメンダント2017年

警告、ChromeのViolentMonkeyスクリプトでは機能しません-偽の番号が表示されますが、理由はわかりません。
hanshenrik

5

関数のソースを解析して、いくつかのマークを探すことができます。
これが簡単な例です(はい、少し混乱しています)。

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

次のスニペットをコードに挿入します。

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

必要に応じてプロトコル名を置き換えます(例:「http:」)
crishushu 2014年

1
これを機能させることができませんでした。取得しTypeError: /\(http:[\w\d/.-]+:([\d]+)/.exec(...) is nullます。
ライアン

2

あなたが試すことができます:

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

次に、知りたい場所にエラーをスローします(あまり望ましくはありませんが、デバッグしている場合に役立つことがあります。

注:WebKitまたはOperawindow.onerrorでは定義/処理されていません(前回チェックしたとき)


1
window.onerrorはwebkitでは機能しないことに注意してください:bugs.webkit.org/show_bug.cgi?id
Annie

1
面白い。throwAndResume(resumeFunction);resumeFunctionを格納してエラーをスローし、エラーハンドラーに詳細を記録してから、resumeFunctionを呼び出してプログラムを続行する特別な関数を作成することもできます。
z5h 2010

0

Angularでは行番号はコンパイルされたコードの行番号であるため、純粋にError.stackから行番号を取得することはできません。しかし、エラーが作成されたメソッドの情報を取得できます。このコードスニペットのクラスLoggerは、この情報を新しいログブックエントリに追加します。

https://stackblitz.com/edit/angular-logger?file=src/app/Logger/logger.ts


-2

コードがJavaScript + PHPの場合、現在のPHPの行番号はJavaScriptでリテラル定数として使用できます。これは、PHPでは   <?= __LINE__ ?>

(これは、明らかにPHPの短いタグが有効になっていることを前提としています。)

したがって、たとえば、JavaScriptでは次のように言うことができます。

this_php_line_number = <?= __LINE__ ?>;

ただし、注意しないと、PHPの行番号がJavaScriptの行番号と異なる場合があります。これは、PHPがソース行をブラウザに表示される前に「食べる」ためです。したがって、問題は、PHPとJavaScriptの行番号が同じであることを確認することです。それらが異なると、ブラウザーのJavaScriptデバッガーの使用が非常に快適になりません。

サーバー側(PHP)とブラウザー側(JavaScript)の行番号を同期するために必要な正しい数の改行を書き込むPHPステートメントを含めることにより、行番号が同じであることを確認できます。

私のコードは次のようになります。

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

...lots of 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>

...lots of HTML and 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コードを先に開始すると、その数が減ります。DOCTYPEの前でさえ、PHPを一番上に置く人もいます。

(メタビューポート行は、このスタックオーバーフローQ&Aに従ってAndroid Chromeの「フォントブースト」を無効にします:Android上のChromeはフォントのサイズを変更します。すべてのWebページに必要な定型文と考えてください。)

次の行は、私が間違いを犯していないことを確認するためのものです。ブラウザのデバッガで表示するか、右クリック/ save-web-pageで表示すると、正しいソースファイル名と行番号を示すHTMLコメントになります。

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

になります:

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

これで、エラーメッセージにあるか、JavaScriptデバッガーにあるかに関係なく、行番号が表示される場所はどこでも正しいです。PHPの行番号とJavaScriptの行番号は常に一貫しており、同一です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.