2013-04-02 7 views
12

मैं Django के साथ एक वेब ऐप बना रहा हूं। मेरे पास जावास्क्रिप्ट में अजाक्स (jQuery v1.8.3) के माध्यम से एपीआई कॉल का एक गुच्छा है।फ़ायरफ़ॉक्स अपवाद 'जावास्क्रिप्ट घटक में कोई विधि नहीं है: "उपलब्ध"'

उनमें से ज्यादातर काम करते हैं, लेकिन एक विशेष रूप से एक statusText के रूप में स्थिति 0 के साथ एक वापसी वस्तु में परिणाम और इस संदेश:

[Exception... "'JavaScript component does not have a method named: "available"' when calling method: [nsIInputStream::available]" nsresult: "0x80570030 (NS_ERROR_XPC_JSOBJECT_HAS_NO_FUNCTION_NAMED)" location: "JS frame :: http://127.0.0.1:8000/media/js/jquery.js :: .send :: line 8434" data: no]

jQuery में इसी लाइन xhr.send((s.hasContent && s.data) || null);

है हालांकि, यह केवल फ़ायरफ़ॉक्स में होता है। क्रोम ठीक काम करता है। फिर, अन्य अनुरोध काम करते हैं। एकमात्र चीज जो इसे अलग करती है वह DELETE http विधि है।

अनुरोध का पालन के रूप में है (HTTP नेटवर्क क्रोम में दिखाया गया डेटा - Firebug Firefox में कुछ भी दिखाई नहीं देता):

Request URL: http://127.0.0.1:8000/api/reservation/13/ 
Request Method: DELETE 
Status Code: 400 BAD REQUEST (This is expected) 

Request Headers 
Accept: application/json, text/javascript, */*; q=0.01 
Content-Length: 15 
Content-Type: application/json 
Origin: http://127.0.0.1:8000 
Referer: http://127.0.0.1:8000/reservation/ 
X-Requested-With: XMLHttpRequest 

Request Payload 
[object Object] 

Response Headers 
Cache-Control: no-cache 
Content-Type: text/html; charset=utf-8 
Date: Tue, 02 Apr 2013 19:18:35 GMT 
Server: WSGIServer/0.1 Python/2.7.2 

सर्वर पर, मैं किसी भी अनुरोध प्राप्त नहीं होता।

जे एस कोड (ब्रेकप्वाइंट पर से Firebug घड़ी सीधे ले जाया) है:

options = { 
    contentType: "application/json", 
    data: Object {}, 
    dataType: "json", 
    processData: false, 
    type: "DELETE", 
    url: "/api/reservation/13/", 
    error: function(), 
    success: function() 
}; 
$.ajax(options); 

मैं भी एफएफ में सभी एक्सटेंशन को अक्षम करने की कोशिश की थी। मैं v20.0 चलाता हूँ।

+0

आपका जेएस कोड आसान होगा। – ZippyV

+0

* "बनाने का अनुरोध (" पोस्ट "या" जीईटी "), डिफ़ॉल्ट" प्राप्त करें "है। नोट: अन्य HTTP अनुरोध विधियों, जैसे कि पुट और डिलीट, का भी यहां उपयोग किया जा सकता है, *** लेकिन वे हैं सभी ब्राउज़रों द्वारा समर्थित नहीं ***। "* शायद यह संभव है कि फ़ायरफ़ॉक्स AJAX के माध्यम से DELETE का समर्थन नहीं करता है? – Zeta

+0

क्या यह एक jQuery समस्या है? [यह उत्तर] (http://stackoverflow.com/a/166501/700283) का कहना है कि सभी प्रमुख ब्राउज़र DELETEs (और वह साल पहले था) करने में सक्षम होना चाहिए। – graup

उत्तर

27

समस्या jQuery/XMLHttpRequest के साथ फ़ायरफ़ॉक्स का संयोजन था और HTTP DELETE के माध्यम से ऑब्जेक्ट भेज रहा था। एक बार JSON'ifying ऑब्जेक्ट JSON.stringify() सबकुछ काम करता है।

फिर भी, फ़ायरफ़ॉक्स को फेंकने के लिए एक अजीब अपवाद।

उस विचार के लिए freddyb के लिए धन्यवाद।

+0

देखें [मेरा जवाब] (http://stackoverflow.com/a/26007157/8946); यह मेरे लिए किसी भी अनुरोध के साथ होता है जो प्राप्त नहीं होता है और जो एक खाली वस्तु प्रदान करता है। –

0

ऐसा लगता है कि आप एक गाड़ी Firefox विस्तार स्थापित जो और नाकाम रहने XMLHttpRequest डेटा की जांच करने की कोशिश कर रहा है ....

मैं सुझाव है कि आप http://support.mozilla.org/en-US/kb/troubleshoot-firefox-issues-using-safe-mode या सिर्फ कोशिश अक्षम करने जो भी Firefox एक्सटेंशन शामिल हैं।

+0

न तो एक्सटेंशन अक्षम करना और सुरक्षित मोड में शुरू करना भी मददगार नहीं था। – graup

8

समस्या फ़ंक्शन के भीतर processData नामक संपत्ति के साथ थी। जब इस संपत्ति को "झूठी" के रूप में आपूर्ति की जाती है (पता नहीं क्यों) फ़ायरफ़ॉक्स इसे पसंद नहीं करता है, और परिणामस्वरूप, ब्राउज़र JSON अनुरोध/प्रतिक्रिया पैकेज को पच नहीं करता है। क्रोम और सफारी बस ठीक काम करता है।

+0

"डेटा": सर्वर को डेटा भेजा जाना है। यदि पहले से ही एक स्ट्रिंग नहीं है, तो इसे एक क्वेरी स्ट्रिंग में परिवर्तित कर दिया जाता है। यह जीईटी अनुरोध के लिए यूआरएल में जोड़ा गया है। इस स्वचालित प्रसंस्करण को रोकने के लिए processData विकल्प देखें। [लिंक] (http://api.jquery.com/jquery.ajax/) – Jorj

+0

यह मेरा अनुभव भी है, लेकिन केवल पोस्ट विधि के लिए। POST में x-www-form-urlencoded का उपयोग करके, processData: गलत फ़ायरफ़ॉक्स त्रुटि का कारण बनता है। – wbdarby

1

यह किसी भी गैर GET AJAX अनुरोध के साथ (फ़ायर्फ़ॉक्स 32 के साथ 2014 को) होता है जब अनुरोधdata वस्तु एक खाली वस्तु है, {} की तरह। मैं Mithril.js का उपयोग कर रहा हूं और यह इस तथ्य से संबंधित हो सकता है कि मिथिल हमेशा गैर-GET अनुरोधों के लिए सामग्री-प्रकार सेट करता है। एक बार जब मैं ट्रिगर जानता था तो यह बिल्कुल दोहराने योग्य था।

(ध्यान दें कि "गैर GET" भाग पूरी तरह से सही नहीं हो सकता - Mithril डेटा वस्तु पर ध्यान नहीं देता है, तो यह एक GET तो अंतर्निहित AJAX वस्तु का उपयोग कर भी उसी तरह से विफल हो सकता है प्राप्त के साथ एक खाली वस्तु ही भेज रहे।)

काउंटर-सहजता से, data को एक खाली स्ट्रिंग, "" पर सेट करना, इस तरह से असफल नहीं होता है, इसलिए यह मेरा काम था। जब भी कोई नहीं होता है, तो मैं वास्तव में डेटा सेट नहीं करता हूं, और यदि मैं अनुरोध भेजता हूं तो यह अनजान है (मेरे AJAX रैपर में) मैं इसे "" पर डिफ़ॉल्ट करता हूं।

+0

एफवाईआई, mithril.js अब खाली स्ट्रिंग में रूपांतरण करता है। 0.1.23 के रूप में यह एक मित्रवत त्रुटि भी फेंक देगा यदि आप इसे गलत मानते हैं (उदा। खराब धारावाहिक विकल्प के माध्यम से) – LeoHorie

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