2011-07-01 8 views
6

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

Uncaught TypeError: Property 'photos' of object [object DOMWindow] is not a function 

JSON को देखते हुए वापस आ जा रहा है, यह मान्य JSON है, इसलिए यह बाहरी API की गलती नहीं है।

मैं विश्वसनीय रूप से त्रुटि को पुन: उत्पन्न नहीं कर सकता: त्रुटि को ट्रिगर करने वाला एकमात्र कारक तब होता है जब मैं अनुरोध को तेज़ी से और बार-बार कॉल करता हूं।

इस मामले में जब मैं उपयोगकर्ता को Google मानचित्र (मानचित्र पर मार्कर जोड़ने के लिए) चलाता है तो यह अजाक्स अनुरोध को कॉल कर रहा है, और ऐसा होता है यदि उपयोगकर्ता बहुत तेज़ी से घूमता है।

// Code located inside an external JS file referenced inside the head 
// Not wrapped inside document.ready - but all the code setting up 
// the map (calling a function which calls a function which adds the 
// tilesloaded listener) *is* inside document.ready 
function addMarkers() { 
    var pm_url = "http://www.cyclestreets.net/api/photos.json?key=" + MY_KEY; 
    $.ajax({ 
     url: pm_url, 
     crossDomain: true, 
     contentType: "application/json", 
     dataType: 'jsonp', 
     data: pmdata, 
     jsonpCallback: 'photos', 
     success: function(data) { 
     // TBA 
     }, 
     error: function() { 
      alert("Sorry, error retrieving photos!"); 
     } 
    }); 
} 
google.maps.event.addListener(map, 'tilesloaded', function() { 
addMarkers(map); 
}); 

थोड़ा Google पर करने के बाद, त्रुटि Uncaught TypeError: Property 'photos' of object [object DOMWindow] is not a function आम तौर पर तब होता है जब jQuery लोड नहीं की गई लगता है:

यहाँ मेरी कोड के प्रासंगिक भागों रहे हैं।

हालांकि, मुझे नहीं लगता कि यह यहां प्रासंगिक है, क्योंकि फ़ंक्शन को मानचित्र के टाइललोडेड ईवेंट से बुलाया जाता है - और यह आम तौर पर पहली बार आग नहीं लगाता है, यह पांच या छह तीव्र मानचित्र आकार के बाद आग लग जाता है । तो अगर यह एक बार काम करता है, तो पृष्ठ निश्चित रूप से jQuery के बारे में 'भूल गया' नहीं हो सकता है?

आपकी सलाह के लिए धन्यवाद।

+1

लाइन 'jsonp कॉलबैक:' फोटो 'को हटाने का प्रयास करें, और देखें कि यह काम करता है या नहीं। JQuery को उन चीजों को संभालने के लिए बेहतर है। जब आप इसमें हों, तो क्या आपको वास्तव में उस तरह के 'contentType' पैरामीटर सेट की आवश्यकता है? यह डेटा भेजने के लिए है, इसे प्राप्त नहीं कर रहा है ... – davin

+0

इसका मतलब है कि फोटो फ़ंक्शन/विधि नहीं है इसलिए आपने कॉलबैक नहीं दिया है, इसलिए कहीं आपके पास 'फ़ंक्शन फोटो() {...} ' – Val

उत्तर

2

आप नाम समारोह है कि jQuery अपने success हैंडलर से पैदा की निर्दिष्ट करने के लिए चाहते हैं, लेकिन वास्तव में परिभाषित नहीं एक अलग समारोह, you should use jsonp: 'photos' instead of jsonpCallback: photos उपयोग करने के लिए। वर्तमान में यह URL में photos का उपयोग कर रहा है जिसका अर्थ है कि यह JS12P प्रतिक्रिया वापस आने पर photos({ ...data... }) पर कॉल कर रहा है, और यह अस्तित्व में नहीं है। jsonp option on $.ajax() का उपयोग करके इसे बनाया जाएगा। आपके पास यहां कुछ विकल्प हैं।

आप इनमें से किसी दो तरीकों में से (एक वैश्विक दायरे में) कर सकते हैं:

function addMarkers() { 
    var pm_url = "http://www.cyclestreets.net/api/photos.json?key=" + MY_KEY; 
    $.ajax({ 
     url: pm_url, 
     crossDomain: true, 
     contentType: "application/json", 
     dataType: 'jsonp', 
     data: pmdata, 
     jsonpCallback: 'photos', 
     error: function() { 
      alert("Sorry, error retrieving photos!"); 
     } 
    }); 
} 
function photos(data) { 
    // TBA 
} 

या, मैं क्या आप का इरादा लगता है:

function addMarkers() { 
    var pm_url = "http://www.cyclestreets.net/api/photos.json?key=" + MY_KEY; 
    $.ajax({ 
     url: pm_url, 
     crossDomain: true, 
     contentType: "application/json", 
     dataType: 'jsonp', 
     data: pmdata, 
     jsonp: 'photos', 
     success: function(data) { 
     // TBA 
     }, 
     error: function() { 
      alert("Sorry, error retrieving photos!"); 
     } 
    }); 
} 

.... या सिर्फ दोनों छोड़ बंद करें और jQuery को success कॉलबैक नाम दें (यह डिफ़ॉल्ट रूप से होता है, टाइमस्टैम्प के आधार पर)।

+0

धन्यवाद! मैं उलझन में था, स्पष्ट रूप से: -/यह समस्या हल करता है। – Richard

+1

इससे कैश-बस्टिंग हो जाएगी क्योंकि यूआरएल हर बार बदल जाएगा। यदि कोई प्रश्न आपके गतिशील हैं तो यह कोई समस्या नहीं है। http://www.yqlblog.net/blog/2010/03/12/avoiding-rate-limits-and-getting-banned-in-yql-and-pipes-caching-is-your-friend/ –