2010-02-26 13 views
57

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

+0

संभावित डुप्लिकेट [जावास्क्रिप्ट कॉलर फ़ंक्शन लाइन नंबर कैसे प्राप्त करें? जावास्क्रिप्ट कॉलर स्रोत यूआरएल कैसे प्राप्त करें?] (Http://stackoverflow.com/questions/1340872/how-to-get-javascript-caller-function-line-number-how-to-get-javascript-caller) –

उत्तर

49

var thisline = new Error().lineNumber

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

var stack = new Error().stack

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

+2

Will आईई में काम नहीं करते, 'लाइन संख्या' संपत्ति त्रुटि वस्तुओं पर मौजूद नहीं है। न तो 'स्टैक' :-) –

+0

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

+1

चोम पर यह त्रुटि है .lineno – PanosJee

1

तुम कोशिश कर सकते हैं:

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

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

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

+1

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

+1

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

3

आप कुछ अंक की तलाश के लिए एक समारोह का एक स्रोत पार्स करने के लिए कोशिश कर सकते हैं।
यहाँ (हाँ, यह एक छोटे गड़बड़ है) एक त्वरित उदाहरण है।

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

अपने कोड में यह स्निपेट इंजेक्षन:

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

आवश्यकतानुसार प्रोटोकॉल नाम को प्रतिस्थापित करें (उदा। "Http:") – crishushu

+0

मैं इसे काम करने के लिए नहीं मिला। मुझे 'TypeError:/\ (http: [\ w \ d /.-] +: ([\ d] +) /। Exec (...) शून्य है। – Ryan

15

थोड़ा विभिन्न ब्राउज़रों और ब्राउज़र संस्करणों के बीच अधिक पोर्टेबल (फ़ायरफ़ॉक्स, क्रोम और 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]; 
} 
+0

धन्यवाद। मैंने आपके सुझाव को इस पर अनुकूलित किया: http://stackoverflow.com/a/37081135/470749 – Ryan

+0

यदि आप रेगेक्स को समायोजित करते हैं, तो आप दोनों लाइन और कॉलम संख्याएं वापस कर सकते हैं: 'var frameRE = /: (\ d +: \ d +) [^ \ d] * $/; 'जो अधिक उपयोगी है, खासकर जब जेएस को एक लंबी लाइन में छोटा किया जाता है। –

18

आप

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

अब तक का सबसे आसान समाधान और यह एमएस एज पर भी काम करता है। – Danger

-1

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

के रूप में PHP में उपलब्ध है (यही कारण है कि आप PHP कम टैग सक्षम, जाहिर है यह सोचते है।)

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

this_php_line_number = <?= __LINE__ ?>; 

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

आप यह सुनिश्चित कर सकते हैं कि लाइन नंबर एक PHP स्टेटमेंट समेत समान हैं जो सर्वर-साइड (PHP) और ब्रोवर-साइड (जावास्क्रिप्ट) लाइन नंबर सिंक्रनाइज़ करने के लिए आवश्यक नईलाइनों की सही संख्या लिखता है।

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

है जावास्क्रिप्ट के द्वारा देखा लाइन संख्या के बराबर हो बनाने के लिए पर्याप्त नई-पंक्तियों बाहर थूक कि: कुंजी

<!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 लाइन संख्या। सभी PHP फ़ंक्शन परिभाषाएं, उस पंक्ति से आगे, शीर्ष पर हैं।

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

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

(मेटा व्यूपोर्ट लाइन इस stackoverflow क्यू & एक प्रति एंड्रॉयड क्रोम "बढ़ाने फ़ॉन्ट" अक्षम कर देता है:।। Chrome on android resizes font यह बॉयलरप्लेट पर विचार करें, जो हर वेब पेज की जरूरत है)

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

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

हो जाता है:

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

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

संबंधित मुद्दे

 संबंधित मुद्दे