JavaScript'teki mevcut satır numarasını nasıl belirleyebilirim?


Yanıtlar:


69

var thisline = new Error().lineNumber

Bu, kullandığınız ortamda işe yaramazsa, deneyebilirsiniz:

var stack = new Error().stack

Ardından satır numarası için yığında avlayın.


3
IE'de lineNumberçalışmaz , özellik hata nesnelerinde mevcut değildir. Ne yapar stack:-)
Andy E

1
IE'de bir yerde bir satır numarası var. Bunu biliyorum çünkü javascript'im bir hata attığında, 100 milyondan büyük bir sayıya sahip bir satırda olduğunu söylüyor.
Malfist

Doğru sayıyı tam olarak alamıyorum, 1250 olması gerektiğinde
1350'dir.

1
Sorun: PHP kullanıyorsanız, javascript tarafından görülen "kaynak kodu" orijinal kaynak kodu değildir, dolayısıyla yanlış satır numaralarına sahiptir. (Muhtemelen Hermann'a olan budur.) Javascript'in orijinal PHP kaynak kodu satır numaralarını görmesini bilen var mı? Çözüm muhtemelen bir tür "kaynak haritası" üretimi içeriyor, ancak bunu nasıl yapacağımı bulamıyorum. Elbette bu çözülmüş bir problem, değil mi?
Dave Burton

Not: Bazen, Error nesnesi oluşturulduğunda yığın / satır numarası kullanılamaz, yalnızca atıldığında, örneğin Google Apps Komut Dosyası'nda kullanılabilir - bu durumda çözüm için bu yanıta bakın .
user202729

38

Kullanabilirsiniz:

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

test();

1
Açık farkla en basit çözüm ve hatta MS Edge'de çalışıyor.
Tehlike

27

Farklı tarayıcılar ve tarayıcı sürümleri arasında biraz daha taşınabilir (Firefox, Chrome ve IE10 + 'da çalışmalıdır):

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

Teşekkürler. Önerinizi buna uyarladım: stackoverflow.com/a/37081135/470749
Ryan

1
Normal ifadeyi ayarlarsanız, hem satır hem de sütun numaralarını döndürebilirsiniz: var frameRE = /:(\d+:\d+)[^\d]*$/;bu, özellikle JS tek bir uzun satıra küçültüldüğünde çok daha kullanışlıdır.
Quinn Comendant

Uyarı, Chrome için ViolentMonkey komut dosyalarında çalışmaz - sahte bir numara alırsınız, nedenini bilmiyorum.
hanshenrik

5

Bazı işaretleri aramak için bir işlevin kaynağını ayrıştırmayı deneyebilirsiniz.
İşte hızlı bir örnek (evet, biraz karışık).

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

Aşağıdaki parçacığı kodunuza enjekte edin:

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

protokol adını gerektiği gibi değiştirin (ör. "http:")
crishushu

1
Bunu işe alamadım. Anlıyorum TypeError: /\(http:[\w\d/.-]+:([\d]+)/.exec(...) is null.
Ryan

2

Deneyebilirsin:

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

Sonra bilmek istediğiniz yere bir hata atın (aşırı istenmez, ancak hata ayıklıyorsanız size yardımcı olabilir.

Not: WebKit veya Opera'dawindow.onerror tanımlanmamış / işlenmemiş (en son kontrol ettiğimde)


1
Window.onerror'ın webkit'te
Annie

1
İlginç. Hatta throwAndResume(resumeFunction);resumeFunction'ı depolayan, hatayı atan ve hata işleyicinizde ayrıntıları günlüğe kaydedip ardından programınıza devam etmek için resumeFunction'ı çağıran özel bir işlev oluşturabilirsiniz .
z5h


-2

Kodunuz JavaScript + PHP ise, geçerli PHP satır numarası JavaScript'te değişmez sabit olarak bulunur, çünkü PHP'de şu şekilde mevcuttur:   <?= __LINE__ ?>

(Açıkçası, PHP kısa etiketlerinin etkinleştirildiğini varsayıyoruz.)

Dolayısıyla, örneğin JavaScript'te şunu söyleyebilirsiniz:

this_php_line_number = <?= __LINE__ ?>;

Ancak, dikkatli değilseniz, PHP satır numarası JavaScript satır numarasından farklı olabilir, çünkü PHP kaynak satırlarını tarayıcı görmeden önce "yiyor". Dolayısıyla sorun, PHP ve JavaScript satır numaralarınızın aynı olmasını sağlamaya dönüşür. Farklılarsa, tarayıcının JavaScript hata ayıklayıcısını kullanmayı çok daha az keyifli hale getirir.

Sunucu tarafı (PHP) ve tarayıcı tarafı (JavaScript) satır numaralarını senkronize etmek için gereken doğru sayıda satırsonu satırını yazan bir PHP ifadesi ekleyerek satır numaralarının aynı olmasını sağlayabilirsiniz.

Kodum şöyle görünüyor:

<!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__); ?> *** -->

Anahtar şu PHP ifadesidir:

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

Bu, JavaScript tarafından görülen satır numarasının PHP satır numarasıyla aynı olmasını sağlayacak kadar yeni satırlar çıkarır. Tüm PHP işlev tanımları vb. Bu satırın en üstünde, önündedir.

Bu satırdan sonra, PHP kullanımımı satır numaralarını değiştirmeyen bir kodla kısıtlıyorum.

"-6", PHP kodumun 8. satırda başladığını açıklar. PHP kodunuzu daha önce başlatırsanız, bu sayıyı azaltırsınız. Bazı insanlar PHP'lerini en tepeye, hatta DOCTYPE'ın önüne koyarlar.

(Meta görüntü alanı satırı, bu Yığın Taşması Soru-Cevap başına Android Chrome "yazı tipi artırmayı" devre dışı bırakır: Android'de Chrome, yazı tipini yeniden boyutlandırır . Her web sayfasının ihtiyaç duyduğu ortak metni düşünün.)

Aşağıdaki satır sadece hata yapmadığımı doğrulamak içindir. Tarayıcının hata ayıklayıcısında veya sağ tıklama / kaydetme-web sayfası ile görüntülendiğinde, doğru kaynak dosya adını ve satır numarasını gösteren bir HTML yorumu haline gelir:

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

şu hale gelir:

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

Şimdi, bir hata mesajında ​​veya JavaScript hata ayıklayıcıda bir satır numarası gördüğüm her yerde doğru. PHP satır numaraları ve JavaScript satır numaraları her zaman tutarlı ve aynıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.