2011-10-04 11 views
7

मेरे पास एक उपकरण है, जो JSFiddle के तरीकों के समान है, जो मुझे गतिशील रूप से जावास्क्रिप्ट में टाइप करने और इसे पृष्ठ पर चलाने की अनुमति देता है। कोड कई लाइनें हो सकती है, और आमतौर पर होगी।गतिशील रूप से कोड लोड करें और पार्स त्रुटि की लाइन संख्या प्राप्त करें

दुर्भाग्यवश यदि कोड में टाइप किया गया अपवाद है तो मुझे अपवाद की लाइन संख्या नहीं मिल सकती है अगर मैं कोड चलाने के लिए eval() का उपयोग करता हूं।

मैं एक आंशिक समाधान, बजाय

try{ 
eval(code); 
} 
catch(e) { 
processException(e); 
} 
का उपयोग कर

बजाय इस तरह कुछ करने के लिए की है जिसमें पाया गया: अब

var s = document.createElement('script'); 
s.appendChild(document.createTextNode(
    "try{\n" + 
    code + 
    "}catch(e){processException(e)}")); 
document.body.appendChild(s); 

, अगर कोड एक अपवाद फेंकता है, और मैं देखो स्टैक ट्रेस (मेरी प्रक्रिया अपवाद() फ़ंक्शन में) मुझे अपवाद की एक पंक्ति संख्या मिल सकती है (फ़ायरफ़ॉक्स और क्रोम में, वैसे भी)।

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

क्या इसके लिए कोई पागल कामकाज है, जो कम से कम फ़ायरफ़ॉक्स और क्रोम पर काम करता है? फंक्शन ऑब्जेक्ट के भीतर स्क्रिप्ट टैग के भीतर eval के भीतर eval? मैं सबकुछ कोशिश कर रहा हूं और कुछ भी नहीं मिला जो काम करता है।

उत्तर

2

मुझे अंततः एक उचित समाधान मिला।

सबसे पहले, मैंने कुछ फ़ंक्शन पर विंडो सेट किया। यह एक पूर्ण स्टैक ट्रेस नहीं मिलता है, लेकिन एक फ़ाइल और लाइन नंबर मिलेगा।

फिर, मैं यह कर:

var s = document.createElement('script'); 
s.appendChild(document.createTextNode(
    "var someUniqueGlobalName = function() {\n" + 
    code + 
    "\n};"; 
document.body.appendChild(s); 

ध्यान दें कि यह वास्तव में नाम के साथ, मेरे कोड नहीं चलता है के रूप में यह बस (एक समारोह बनाता है वैश्विक क्षेत्र में, 'someUniqueGlobalName' - निश्चित रूप से जो हर बार जब मैं ऐसा करता हूं तो मैं वास्तव में एक अलग नाम के साथ आऊंगा)।

यदि कोई वाक्यविन्यास त्रुटि है, तो इसे विंडो में पकड़ा जाएगा। आतंक समारोह, और मुझे त्रुटि प्रकार और रेखा संख्या मिल सकती है (निश्चित रूप से मुझे एक से घटा देना होगा, क्योंकि मैंने एक पंक्ति जोड़ दी है शुरू में)।

अब, मैं खिड़की को अनसेट करता हूं। आतंक।

अंत में, मैं कोशिश/पकड़ ब्लॉक में कुछUniqueGlobalName() को कॉल करके कोड चलाता हूं। रनटाइम त्रुटि होने पर मैं लाइन नंबरों के साथ एक पूर्ण स्टैक ट्रेस प्राप्त कर सकता हूं।

+0

में बनाया गया ब्राउज़र पसंद करेगा यह वास्तव में उपयोगी सिद्धांत है। धन्यवाद। – SystemParadox

1

आप इसे एक कदम आगे ले और एकीकृत सकता JSLINT: https://github.com/douglascrockford/JSLint

यह बिल्कुल स्पष्ट .. यहाँ एक त्वरित परीक्षण है ...

डाउनलोड: https://raw.github.com/douglascrockford/JSLint/master/jslint.js

jshint_test.html:

<script type="text/javascript" src="jslint.js"></script> 
<script> 

var result = JSLINT("var some = true;\nif (some) {"); 

if (result) 
{ 
    alert('Looking good'); 
} 
else 
{ 
    var error_message = ''; 
    for (i in JSLINT.errors) 
    { 
    var error = JSLINT.errors[i]; 
    error_message += error.reason + ' on line: ' + error.line + ' character: ' + error.character + "\n"; 
    } 
    alert(error_message); 
} 
</script> 

दस्तावेज़ीकरण देखें। JSLINT पर दूसरा तर्क एक विकल्प वस्तु है .. विकल्पों के टन हैं।

+0

रचनात्मक विचार का उपयोग, लेकिन मैं के लिए क्या नहीं देख रहा हूँ। – rob

+1

उत्सुक .. आप तब क्या देख रहे हैं? जैसा कि आपने मूल रूप से अनुरोध किया था, यह आपको पार्स और सिंटैक्स त्रुटियों देता है। – Jake

+0

मैं शुद्धता के बाद हूं, क्रॉकफोर्ड की राय नहीं कि जेएस किस तरह दिखना चाहिए। इसके अलावा मैं जो भी कर रहा हूं उसके लिए यह भारी है, इसलिए सिंटैक्स चेकिंग – rob

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