मैं जावास्क्रिप्ट में वर्तमान लाइन संख्या कैसे निर्धारित कर सकता हूं?


97

क्या जावास्क्रिप्ट में वर्तमान में निष्पादित कथन की लाइन संख्या निर्धारित करने के लिए एक तंत्र है (और यदि हां, तो यह क्या है)?


जवाबों:


71

var thisline = new Error().lineNumber

यदि वह आपके द्वारा उपयोग किए जा रहे वातावरण में काम नहीं करता है, तो आप कोशिश कर सकते हैं:

var stack = new Error().stack

फिर लाइन नंबर के लिए स्टैक के माध्यम से शिकार करें।


3
IE में काम नहीं करेगा, lineNumberसंपत्ति त्रुटि वस्तुओं पर मौजूद नहीं है। न ही stack:-)
एंडी ई

1
IE पर कहीं एक पंक्ति संख्या है। मुझे यह पता है क्योंकि जब मेरी जावास्क्रिप्ट एक त्रुटि फेंकता है तो यह 100 मिलियन से अधिक की संख्या वाली लाइन पर है।
मलफिस्ट

मैं काफी सही संख्या नहीं मिलता है, इसकी 1350 जब यह 1250 होनी चाहिए।
Fzs2

1
समस्या: यदि आप PHP का उपयोग कर रहे हैं, तो जावास्क्रिप्ट द्वारा देखा गया "स्रोत कोड" मूल स्रोत कोड नहीं है, इसलिए इसमें गलत लाइन नंबर हैं। (यही शायद हरमन के लिए हो रहा है।) क्या किसी को पता है कि जावास्क्रिप्ट बनाने के लिए मूल PHP स्रोत कोड लाइन नंबर कैसे देखें? समाधान में शायद "स्रोत मानचित्र" पीढ़ी के कुछ प्रकार शामिल हैं, लेकिन मैं यह नहीं कर सकता कि यह कैसे करना है। निश्चित रूप से यह एक हल समस्या है, है ना ??
डेव बर्टन

नोट: कभी-कभी जब त्रुटि ऑब्जेक्ट का निर्माण होता है तो स्टैक / लाइन नंबर उपलब्ध नहीं होता है, केवल जब इसे फेंका जाता है, उदाहरण के लिए Google Apps स्क्रिप्ट में - इस मामले में समाधान के लिए इस उत्तर को देखें ।
user202729

39

आप उपयोग कर सकते हैं:

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

test();

1
अब तक का सबसे सरल उपाय और यह MS Edge पर भी काम करता है।
डेंजर

27

विभिन्न ब्राउज़रों और ब्राउज़र संस्करणों के बीच थोड़ा अधिक पोर्टेबल (फ़ायरफ़ॉक्स, क्रोम और 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]*$/;जो कि अधिक उपयोगी है, खासकर जब जेएस को एक लंबी लाइन में छोटा किया जाता है।
क्विन कॉमेंडेंट

चेतावनी, Chrome के लिए ViolentMonkey स्क्रिप्ट में काम नहीं करता है - आपको एक फर्जी नंबर मिलेगा, पता नहीं क्यों।
हैनसेनरिक

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

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

फिर एक त्रुटि जहां आप जानना चाहते हैं (अत्यधिक वांछित नहीं है, लेकिन यह आपकी मदद कर सकता है यदि आप डीबगिंग कर रहे हैं।

नोट: वेबकीट या ओपेराwindow.onerror में परिभाषित / संभाला नहीं है (पिछली बार जब मैंने जाँच की थी)


1
ध्यान दें कि window.onerror webkit में काम नहीं करता है: bugs.webkit.org/show_bug.cgi?id=8519
Annie

1
दिलचस्प। आप एक विशेष फ़ंक्शन भी बना सकते हैं throwAndResume(resumeFunction);जो फिर से शुरू करेगा, त्रुटि को जमा करेगा, और आपकी त्रुटि में हैंडलर विवरण लॉग करेगा फिर अपना कार्यक्रम जारी रखने के लिए फिर से शुरू करें।
z5h

0

विशुद्ध रूप से किसी को भी Error.stack से लाइन नंबर नहीं मिल सकता है, क्योंकि कोणीय में लाइन नंबर संकलित कोड की लाइन संख्या है। लेकिन किसी को यह जानकारी मिल सकती है कि त्रुटि किस पद्धति में बनाई गई थी। इस कोड स्निपेट में वर्ग लकड़हारा जानकारी के इस टुकड़े को एक नई लॉगबुक प्रविष्टि में जोड़ता है।

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


-2

यदि आपका कोड JavaScript + PHP है, तो जावास्क्रिप्ट में वर्तमान PHP लाइन नंबर शाब्दिक स्थिरांक के रूप में उपलब्ध है, क्योंकि यह PHP में उपलब्ध है।   <?= __LINE__ ?>

(यह मानते हुए कि आपके पास PHP लघु टैग सक्षम हैं, जाहिर है।)

उदाहरण के लिए, जावास्क्रिप्ट में आप कह सकते हैं:

this_php_line_number = <?= __LINE__ ?>;

हालाँकि, अगर आप सावधान नहीं हैं, तो PHP लाइन नंबर जावास्क्रिप्ट लाइन नंबर से अलग हो सकता है, क्योंकि PHP कभी ब्राउज़र को देखने से पहले "स्रोत खाती है"। तो समस्या यह सुनिश्चित करती है कि आपके PHP और जावास्क्रिप्ट लाइन नंबर समान हों। यदि वे अलग हैं तो यह ब्राउज़र के जावास्क्रिप्ट डीबगर का उपयोग करके बहुत कम सुखद बनाता है।

आप यह सुनिश्चित कर सकते हैं कि लाइन नंबर एक PHP स्टेटमेंट को शामिल करके समान हैं जो सर्वर-साइड (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);

जावास्क्रिप्ट द्वारा देखे गए लाइन नंबर को PHP लाइन नंबर के समान बनाने के लिए पर्याप्त नई सुर्खियाँ बिखेरता है। सभी PHP फ़ंक्शन परिभाषाएँ, आदि उस रेखा से आगे हैं।

उस लाइन के बाद, मैंने अपने PHP का उपयोग कोड को प्रतिबंधित कर दिया है जो लाइन नंबर नहीं बदलता है।

इस तथ्य के लिए "-6" खाता है कि मेरा PHP कोड 8 पर शुरू होता है। यदि आप अपना PHP कोड पहले शुरू करते हैं, तो आप उस संख्या को कम कर देंगे। कुछ लोग अपने PHP को DOCTYPE से भी आगे, बहुत ऊपर रखते हैं।

(मेटा व्यूपोर्ट लाइन एंड्रॉइड क्रोम को इस स्टैक ओवरफ्लो Q & A के अनुसार "फॉंट बूस्टिंग" को निष्क्रिय कर देती है: क्रोम ऑन फ़ॉन्ट का आकार बदल जाता है । इसे बॉयलरप्लेट पर विचार करें, जिसे हर वेब पेज की जरूरत है।)

निम्नलिखित लाइन सिर्फ यह सत्यापित करने के लिए है कि मैंने कोई गलती नहीं की है। ब्राउज़र के डिबगर में, या राइट-क्लिक / सेव-वेब-पेज द्वारा देखे जाने पर, यह एक HTML टिप्पणी बन जाती है, जो सही स्रोत फ़ाइल नाम और लाइन नंबर दिखाती है:

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

हो जाता है:

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

अब, जहाँ भी मुझे एक पंक्ति संख्या दिखाई देती है, चाहे वह त्रुटि संदेश में हो या जावास्क्रिप्ट डीबगर में, यह सही है। PHP लाइन नंबर और जावास्क्रिप्ट लाइन नंबर हमेशा सुसंगत और समान होते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.