2012-06-12 16 views
6

मैं पृष्ठों के एक सेट पर UI घटकों के सेट पर माउस क्लिक ईवेंट को ट्रैक करना चाहता हूं। ऐसा करने के लिए, मैं निम्नलिखित jquery/AJAX कॉल का उपयोग कर रहा हूं (आपको छंटनी):jquery AJAX पोस्ट

1. AJAX कॉल जो क्लिक लॉगिंग जोड़ देगा।

myClickLogger = { 
    endpoint: '/path/to/my/logging/endpoint.html', 
    logClickEvent: function(clickCode) { 
    $.ajax({ 
     'type': 'POST', 
     'url':  this.endpoint, 
     'async': true, 
     'cache': false, 
     'global': false, 
     'data': { 
      'clickCode':clickCode 
     }, 
     'error': function(xhr,status,err){ 
      alert("DEBUG: status"+status+" \nError:"+err); 
     }, 
     'success': function(data){ 
      if(data.status!=200){ 
       alert("Error occured!"); 
      } 
     } 
    }); 
    } 
}; 

2.JQuery क्लिक करें घटना जो ajax लकड़हारा फोन करेगा (clickCode एक पहचानकर्ता जिसके लिए बटन/छवि पर क्लिक किया गया है): (। 1)

$(document).ready(function() { 
    $(".myClickEvent[clickName]").click(function() { 
     var clickCode = $(this).attr("clickName"); 
     myClickLogger.logClickEvent(clickCode); 
    }); 
}); 

ऊपर ajax कॉल है " रद्द किया गया "जब भी बटन ट्रैक किया जा रहा क्लिक करें ब्राउज़र द्वारा एक नए पृष्ठ पर ले जाता है।

यदि मैं 'aysnc' को 'false' में बदलता हूं, तो AJAX कॉल सफल होता है।

इसके अलावा, उन ईवेंट पर क्लिक करें जो एक नए पृष्ठ पर सफल नहीं होते हैं। केवल नए पेज पर जाने वाली क्लिक घटनाओं को रद्द कर दिया जा रहा है।

मैं कॉल को तुल्यकालिक बनाना नहीं चाहता हूं।

कोई विचार, समस्या क्या हो सकती है? मैं कैसे गारंटी दे सकता हूं कि जब क्लिक ईवेंट किसी नए पृष्ठ पर ले जाता है तो पहले एसिंक्रोनस कॉल समाप्त हो जाता है?

+0

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

+0

क्या कोई मुझे एकल कोट्स '' 'के बारे में बता सकता है जो AJAX कॉल में उपयोग कर रहा है ?? एकल उद्धरण के साथ भी काम करता है '' टाइप 'या' सफलता'' और सब क्योंकि मैंने एकल उद्धरण के बिना उपयोग किया .. –

+1

आपको सिंक्रोनस कॉल का उपयोग करने की ज़रूरत नहीं है, आपको बस यह सुनिश्चित करना होगा कि काम नहीं है ' एसिंक कॉल समाप्त होने के बाद तक नहीं किया। –

उत्तर

3

क्योंकि यह async है, कोड लॉगिंग होने से पहले पूरा हो जाएगा। आप क्या करना चाहते हैं एसिंक कॉल में कॉलबैक पास करें। यह एसिंक गुणों को संरक्षित रखेगा, लेकिन फिर भी आपको छोड़ने की अनुमति देगा। कुछ इस तरह:

logClickEvent: function(clickCode, callback) { 
    $.ajax({ 
     'type': 'POST', 
     'url':  this.endpoint, 
     'async': true, 
     'cache': false, 
     'global': false, 
     'data': { 
      'clickCode':clickCode 
     }, 
     'error': function(xhr,status,err){ 
      alert("DEBUG: status"+status+" \nError:"+err); 
     }, 
     'success': function(data){ 
      if(data.status!=200){ 
       alert("Error occured!"); 
      } else { 
       callback(); 
      } 
     } 
    }); 
    } 

$(document).ready(function() { 
    $(".myClickEvent[clickName]").click(function(e) { 
     e.preventDefault(); // This will prevent the link from actually leaving right away 
     var clickCode = $(this).attr("clickName"); 
     var href = $(this).attr('href'); 
     myClickLogger.logClickEvent(clickCode, function(href){ 
      if (href) 
       window.location = href; 
     }); 
    }); 
}); 

आप शायद किसी भी लिंक है कि पृष्ठ छोड़ने नहीं कर रहे हैं, जब यह आवश्यक नहीं है के लिए कॉलबैक संशोधित करने के लिए चाहता हूँ।

0

क्या आप अनुरोधों को ट्रैक करने के लिए फ़ायरबग का उपयोग कर रहे हैं? यदि ऐसा है, तो यह पूरी तरह से सही नहीं है। यदि आप अनुरोधों की जांच करने के लिए फिडलर का उपयोग करते हैं, तो आप देख सकते हैं कि वे सफल हैं। रद्द की गई स्थिति का अर्थ है "ब्राउज़र प्रतिक्रिया के लिए प्रतीक्षा रद्द कर दिया गया है", जिसे आप वास्तव में किसी भी तरह से परवाह नहीं करते हैं।

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