2010-12-28 13 views
7

मुझे जावा जेएसएफ एप्लिकेशन में कोई समस्या है: एक निश्चित मामले में, उपयोगकर्ता कार्रवाई एक अजाक्स HTTP अनुरोध का कारण बनती है जो यूआई को सही तरीके से अपडेट करती है, लेकिन फिर तुरंत दूसरा अनुरोध ट्रिगर होता है, जिससे दूसरा, गलत अपडेट होता है।मैं कैसे पता लगा सकता हूं कि जावास्क्रिप्ट एक अजाक्स अनुरोध का कारण बनता है?

मैं कैसे पता लगा सकता हूं (अधिमानतः फायरबग का उपयोग कर रहा हूं) जहां वास्तव में दूसरा अनुरोध ट्रिगर किया गया है? बहुत सारे मिनीफाइड फ्रेमवर्क जेएस कोड हैं, इसलिए मुझे नहीं पता कि ब्रेकपॉइंट्स कहां रखना है। फॉर्म onsubmit हैंडलर को console.trace पर सेट करने में मदद नहीं मिली, मुझे लगता है क्योंकि ये स्वतंत्र अजाक्स अनुरोध हैं।

उत्तर

5

में सुझावों का प्रयास करते समय उत्तर, मैंने पाया कि फायरबग में पहले से ही मुझे बॉक्स से बाहर की ज़रूरत है: कंसोल टैब सभी अनुरोधों को प्रदर्शित करता है, और अजाक्स अनुरोधों के लिए यह फ़ाइल और लाइन नंबर दिखाता है जहां वे उत्पन्न होते हैं, जो मुझे बताता है कि मेरा ब्रेकपॉइंट कहां सेट करें ...

+0

यह 'क्रोम डेवलपर टूल में लागू नहीं है? – eugene

+0

@ यूजीन: काफी संभवतः, हाँ। –

+3

धन्यवाद माइकल। रिकॉर्ड के लिए, यह नेटवर्क - इनिशिएटर टैब में है।लिंक पर होवर करें और यह कॉलिंग स्टैक दिखाएगा। – eugene

0

फ़ायरबग का उपयोग करके आप Breakpoints on DOM (HTML) Mutation Events सेट कर सकते हैं यदि आपके पास अपने UI अपडेट में कुछ HTML परिवर्तन हैं।

+0

लेकिन * प्रतिक्रिया * प्राप्त होने पर यह ट्रिगर होगा, है ना? मुझे यह पता लगाना होगा कि * अनुरोध * कहां उत्पन्न होता है। –

+0

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

0

यदि ढांचा AJAX अनुरोधों को सारणीबद्ध करता है, तो आप अबास्ट्रक्शंस को कॉल का पता लगाने में सक्षम होना चाहिए। उदाहरण के लिए, jQuery इसे global AJAX event handlers के माध्यम से अनुमति देता है।

समस्या से निपटने के लिए एक और अधिक मजबूत तरीका replace the XHR object होगा और इसमें किए गए कॉल का पता लगाया जाएगा (यानी यदि ढांचा उपरोक्त अमूर्तता प्रदान नहीं करता है या यदि आप जिन कॉलों का उपयोग करना चाहते हैं, वे अमूर्तता का उपयोग नहीं करते हैं) । पेज के अंत में स्क्रिप्ट में console.trace के साथ बस GM_log को प्रतिस्थापित करें और इसे उस पृष्ठ में शामिल करें जिसमें आप परीक्षण कर रहे हैं।

0

मैंने इन मामलों में व्यक्तिगत रूप से क्या किया है, एक HTTP प्रॉक्सी का उपयोग कर रहा है जो अनुरोध या प्रतिक्रिया 'होल्ड पर रख सकता है'। जैसे Burp Proxy(यह वास्तव में एक सुरक्षा उपकरण है, लेकिन यह डिबगिंग उद्देश्यों के लिए बहुत अच्छा काम करता है)

प्रॉक्सी शुरू करें और इसका उपयोग करने के लिए अपने ब्राउज़र को कॉन्फ़िगर करें। उस पृष्ठ पर नेविगेट करें जहां roque अनुरोध प्रारंभ होते हैं और अवरोध अनुरोध सक्रिय करते हैं (यह कुछ अभ्यास ले सकता है क्योंकि Burp प्रॉक्सी एक जटिल उपकरण हो सकता है)।

अब उपयोगकर्ता कार्रवाई करें, अगर सब ठीक हो जाए तो प्रॉक्सी इसे रोकता है और इसे आपकी पुष्टि के लिए प्रतीक्षा करता है। यह करो। फिर आप शायद दूसरा अनुरोध देखेंगे और प्रॉक्सी द्वारा भी अवरुद्ध किया जा रहा है। इसे एक के माध्यम से मत दो, बल्कि इसके बजाय फायरबग पर स्विच करें और डीबगर में निलंबित करें। उम्मीद है कि आप यह देखने में सक्षम होंगे कि यह कहां से निकलता है। संपादित करें: दूसरे विचारों पर, AJAX की असीमित प्रकृति का अर्थ है कि आप यह देखने में सक्षम नहीं होंगे कि इस विधि के माध्यम से सटीक स्थान क्या है ... :(

कम से कम आप इसे प्रतिक्रियाओं को रोकने के लिए भी कॉन्फ़िगर कर सकते हैं। दोनों अनुरोध और प्रतिक्रियाओं मक्खी, जो प्रयोग करने और डीबगिंग के लिए महान हो सकता है और समस्या की संख्या कम में मदद कर सकता है पर संपादित किया जा सकता।

0

इस में मदद मिलेगी सकता है, फोन करने वाले जावास्क्रिप्ट समारोह वस्तु में एक विधि है।

console.log (arguments.callee.caller.toString());

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

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