2011-03-18 14 views
85

मैं एक अलर्ट बॉक्स में ऑब्जेक्ट का निरीक्षण कैसे कर सकता हूं? सामान्य रूप से एक वस्तु को चेतावनी सिर्फ nodename फेंकता है:जावास्क्रिप्ट ऑब्जेक्ट्स का निरीक्षण कैसे करें

alert(document); 

लेकिन मैं अलर्ट बॉक्स में गुण और वस्तु के तरीकों प्राप्त करना चाहते हैं। यदि संभव हो, तो मैं इस कार्यक्षमता को कैसे प्राप्त कर सकता हूं? या क्या कोई अन्य सुझाव हैं?

विशेष रूप से, मैं एक उत्पादन वातावरण के लिए एक समाधान की तलाश कर रहा हूं जहां console.log और Firebug उपलब्ध नहीं हैं।

+9

फ़ायरफ़ॉक्स या क्रोम – kjy112

+1

मैं उलझन में हूँ पर console.log' कर '। एक उत्पादन वातावरण में, आपके पास वास्तविक उपयोगकर्ता हैं, है ना? तो आप वस्तु गुणों के साथ एक चेतावनी क्यों फेंकना चाहते हैं? हो सकता है कि ऑब्जेक्ट को क्रमबद्ध करना और फ़ाइल में लॉग इन करना या ईमेल भेजना बेहतर समाधान है? –

+0

शायद उसे एक उपकरण के रूप में अलर्ट की आवश्यकता है, लेकिन कुछ और करने के लिए वास्तविक कार्यक्षमता। ऑब्जेक्ट का निरीक्षण करने के लिए जो कुछ भी वह/वह उपयोग कर रहा है, उसे ऑब्जेक्ट पास करके, ऐसा करने के कारण सभी प्रकार के कारण हो सकते हैं, जैसे आंकड़े, या एक त्रुटि घटना, या दोनों को करना। – Christian

उत्तर

54

for - एक वस्तु या सरणी में प्रत्येक प्रॉपर्टी के लिए in छोरों। आप इस संपत्ति का उपयोग मूल्य प्राप्त करने के साथ-साथ इसे बदलने के लिए भी कर सकते हैं।

नोट: निजी गुण निरीक्षण के लिए उपलब्ध नहीं हैं, जब तक कि आप "जासूसी" का उपयोग न करें; मूल रूप से, आप ऑब्जेक्ट को ओवरराइड करते हैं और कुछ कोड लिखते हैं जो ऑब्जेक्ट के संदर्भ में फॉर-इन लूप करता है।

की तरह दिखता में लिए:

for (var property in object) loop(); 

कुछ नमूना कोड:

function xinspect(o,i){ 
    if(typeof i=='undefined')i=''; 
    if(i.length>50)return '[MAX ITERATIONS]'; 
    var r=[]; 
    for(var p in o){ 
     var t=typeof o[p]; 
     r.push(i+'"'+p+'" ('+t+') => '+(t=='object' ? 'object:'+xinspect(o[p],i+' ') : o[p]+'')); 
    } 
    return r.join(i+'\n'); 
} 

// example of use: 
alert(xinspect(document)); 

संपादित करें: कुछ समय पहले, मैं अपने ही निरीक्षक ने लिखा है, अगर आप रुचि रखते हैं, मैं कर रहा हूँ साझा करने में खुशी हुई।

संपादित करें 2: ठीक है, मैंने वैसे भी एक लिखा है।

+0

किसी भी तरह से रिकर्सन से संरक्षित किया जाना चाहिए। कुछ आंतरिक एचटीएमएल-रेंडरर आईडी के साथ हैश (* शब्दकोश *)? इस चेक को कोड में धक्का देने के लिए नोबस के लिए उपयोगी हो सकता है। – Nakilon

+0

@ नाकिलॉन मैंने हमेशा अनंत रिकर्सन के साथ समस्या उठाई है, खासकर PHP में। इसे ठीक करने के दो तरीके हैं: गहराई पैरामीटर का उपयोग करके, या हैश को संशोधित करना और अपनी खुद की संपत्ति जोड़ें जिसे आप रिकर्सन के लिए जांचते हैं। गहराई शायद एक सुरक्षित है। – Christian

+0

मुझे लाइन 7 के इस संस्करण को बेहतर पसंद है। यह रूबी की तरह थोड़ा और दिखता है और कुछ अच्छा सफेद स्थान r.push (i + '' + p + '' => '+ (टी ==' ऑब्जेक्ट '?' {\ N '+ xinspect (o [p] , मैं + '') + ('\ n' + i + '},'): ओ [पी] + '')); –

8
var str = ""; 
for(var k in obj) 
    if (obj.hasOwnProperty(k)) //omit this test if you want to see built-in properties 
     str += k + " = " + obj[k] + "\n"; 
alert(str); 
+0

console.log() यह कैसे करता है? :) – Christian

+0

फ़ायरफ़ॉक्स या क्रोम का उपयोग करें। फ़ायरफ़ॉक्स के लिए फायरबग प्राप्त करें। एक – moe

+0

होना चाहिए मैं व्यंग्यात्मक था। ओपी ने विशेष रूप से जेएस कोड के लिए कहा, और जब तक कि आप सुझाव नहीं दे रहे हैं कि वह फायरबग/फॉक्स/क्रोम में पहुंचा है, मुझे नहीं पता कि उसे जवाब कहां मिलेगा। – Christian

180

एक आधुनिक ब्राउज़र के साथ alert(JSON.stringify(object)) कैसे?

TypeError: Converting circular structure to JSON के मामले में, यहाँ और अधिक विकल्प हैं: How to serialize DOM node to JSON even if there are circular references?

प्रलेखन: JSON.stringify() स्वरूपण या उत्पादन prettifying पर जानकारी प्रदान करता है।

+0

+1 अच्छा सुझाव। मैं जोड़ता हूं कि वह इसे अच्छी तरह से देखने के लिए jsonview (http://jsonviewer.stack.hu/) का उपयोग कर सकता है। – Christian

+2

यदि आप इसे अच्छी तरह से स्वरूपित करना चाहते हैं तो आप कॉल कर सकते हैं: 'चेतावनी (JSON.stringify (ऑब्जेक्ट, शून्य, 4)', जहां '4' इंडेंटेशन के लिए उपयोग की जाने वाली रिक्त स्थान की संख्या है। –

+0

इससे मुझे 'अपरिभाषित' आउटपुट। मैं कर्म परीक्षण डीबग करने की कोशिश कर रहा हूं। –

34

उपयोग console.dir(object) और Firebug प्लगइन

+4

इसने मुझे जो कुछ भी किया उसके लिए मुझे सबसे पूर्ण और उपयोगी जानकारी दी। धन्यवाद। –

+1

मुझे 'console.dir' सुविधा से अवगत नहीं था। मैं काम नहीं कर सका कि मैं अब फायरबग में पूरी वस्तु क्यों नहीं देख सकता था। अब यह मेरे लिए इसे हल कर चुका है। धन्यवाद! –

+0

मुझे यह जानने की ज़रूरत है कि प्रदर्शन सुविधा के अलावा 'console.log' पर इसके अन्य फायदे हैं या नहीं। , कृपया – user10089632

13

अपने कंसोल का उपयोग:

console.log(object); 
+0

उन प्रदर्शित मानों को गतिशील रूप से बदलते हैं, वास्तविक समय में जो डीबगिंग उद्देश्यों के लिए भ्रामक हो सकता है – user10089632

+0

क्रोम में आपकी कंसोल प्राथमिकताओं का उपयोग करें और प्रेज़र पर क्लिक करें लॉग इन अब भी यदि आपकी स्क्रिप्ट आपको किसी अन्य पृष्ठ पर रीडायरेक्ट करती है, तो भी आपका कंसोल साफ़ नहीं होता है। –

+0

ऐसा लगता है कि यह समस्या फ़ायरफ़ॉक्स से संबंधित है क्योंकि क्रोम में जब तक आप console.log() प्रदर्शित मान नहीं रखते हैं। आप क्रोम पर जाने का सुझाव दे सकते हैं लेकिन कभी-कभी आप ब्राउज़र सुविधाओं की उपलब्धता का परीक्षण कर रहे हैं। वैसे भी टिप के लिए धन्यवाद जो उपयोगी हो सकता है। – user10089632

15

कुछ तरीके हैं:

1. typeof tells you which one of the 6 javascript types is the object. 
2. instanceof tells you if the object is an instance of another object. 
3. List properties with for(var k in obj) 
4. Object.getOwnPropertyNames(anObjectToInspect) 
5. Object.getPrototypeOf(anObject) 
6. anObject.hasOwnProperty(aProperty) 

एक कंसोल संदर्भ में, कभी कभी .constructor या शायद .prototype उपयोगी:

console.log(anObject.constructor); 
console.log(anObject.prototype) ; 
4

यह ईसाई के उत्कृष्ट उत्तर की स्पष्ट चीर है। मैंने इसे थोड़ा और अधिक पठनीय बना दिया है:

/** 
* objectInspector digs through a Javascript object 
* to display all its properties 
* 
* @param object - a Javascript object to inspect 
* @param result - a string of properties with datatypes 
* 
* @return result - the concatenated description of all object properties 
*/ 
function objectInspector(object, result) { 
    if (typeof object != "object") 
     return "Invalid object"; 
    if (typeof result == "undefined") 
     result = ''; 

    if (result.length > 50) 
     return "[RECURSION TOO DEEP. ABORTING.]"; 

    var rows = []; 
    for (var property in object) { 
     var datatype = typeof object[property]; 

     var tempDescription = result+'"'+property+'"'; 
     tempDescription += ' ('+datatype+') => '; 
     if (datatype == "object") 
      tempDescription += 'object: '+objectInspector(object[property],result+' '); 
     else 
      tempDescription += object[property]; 

     rows.push(tempDescription); 
    }//Close for 

    return rows.join(result+"\n"); 
}//End objectInspector 
4

यहां मेरा ऑब्जेक्ट इंस्पेक्टर है जो अधिक पठनीय है।कोड लंबा करने के लिए ले जाता है क्योंकि यहाँ लिख आप इस तरह से http://etto-aa-js.googlecode.com/svn/trunk/inspector.js

उपयोग इसे डाउनलोड कर सकते हैं:

document.write(inspect(object)); 
+2

आमतौर पर यह मामला है (और यह निश्चित रूप से आधिकारिक मार्गदर्शन है - लिंक पोस्ट न करें), ओटीओएच, इस तरह के संस्करण के लिए, यह बहुत अच्छा हो सकता है, क्योंकि आप जानते हैं कि आप हमेशा देख रहे हैं नवीनतम कोड, और कुछ साल पहले पोस्ट नहीं किया गया था और शायद अब काम नहीं कर सकता ... - इसके अलावा, कोड का विशाल ब्लॉक पाठ की दीवार में चिपका हुआ बहुत भयानक लग रहा है SO उत्तर ... - ** विषय: ** यह अच्छा होगा अगर एसओ पर "spoiler" जैसे कोड के लिए एक तरीका था और बाहरी स्रोत से लिंक करने में सक्षम हो और इसे ऑटो अपडेट (जब संभव हो) हो, – BrainSlugs83

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