JavaScript'in şu anda yürütülmekte olan ifadenin satır numarasını belirlemek için bir mekanizması var mı (ve eğer öyleyse, nedir)?
JavaScript'in şu anda yürütülmekte olan ifadenin satır numarasını belirlemek için bir mekanizması var mı (ve eğer öyleyse, nedir)?
Yanıtlar:
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.
lineNumber
çalışmaz , özellik hata nesnelerinde mevcut değildir. Ne yapar stack
:-)
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];
}
var frameRE = /:(\d+:\d+)[^\d]*$/;
bu, özellikle JS tek bir uzun satıra küçültüldüğünde çok daha kullanışlıdır.
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;
}
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)
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 .
Hata.stack'ten satır numarası tamamen çıkarılamaz çünkü Angular'da satır numarası derlenen kodun satır numarasıdır. Ancak hatanın hangi yöntemde oluşturulduğu bilgisi alınabilir. Bu kod parçacığındaki sınıf Logger, bu bilgi parçasını yeni bir günlük defteri girişine ekler.
https://stackblitz.com/edit/angular-logger?file=src/app/Logger/logger.ts
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.