2012-04-19 16 views
15

संभव डुप्लिकेट:
window.open(url) different behavior - same code, different timingwindow.open() AJAX सफलता पर अलग अलग काम करता है

यह मुझे समस्या की व्याख्या करने के लिए करता है, तो मैं सिर्फ आपको लगता है कि उदाहरण दिखाने के और अधिक आसान हो जाएगा - >http://jsfiddle.net/RU2SM/
जैसा कि आप देख सकते हैं कि 2 बटन हैं, जिन्हें 'एजेक्स' कहा जाता है और जिसे 'डायरेक्ट' कहा जाता है ... तो यदि आप 'डायरेक्ट' पर क्लिक करते हैं तो यह विंडो खोलता है (क्रोम पर नया टैब) लेकिन अगर मैं इसे बनाने की कोशिश करता हूं AJAX सफलता हैंडलर पर window.open(), यह काम नहीं करता है उसी तरह।
मुझे यकीन है कि समस्या AJAX से है लेकिन मुझे नहीं पता कि इसे कैसे ठीक किया जाए।
किसी भी अच्छे विचार की सराहना करेंगे। धन्यवाद

+0

[window.open (url) अलग-अलग व्यवहार के संभावित डुप्लिकेट - एक ही कोड, अलग-अलग समय] (http://stackoverflow.com/questions/9793774/window-openurl- अलग-अलग- व्यवहार- कोड- अलग- समय) और [extjs 4.0 असंगत window.open() व्यवहार जब Ext.Ajax.request()] के भीतर बुलाया जाता है (http://stackoverflow.com/questions/10049172/extjs-4-0-inconsistent-window-open-behavior -उथ-कॉल-इन-एक्स-एजेक्स-आवश्यकताएं) –

उत्तर

26

यह एक आकर्षण की तरह काम करता है:

// Direct window.open() 
$('#btnDirect').on('click',function(){ 
    window.open('http://google.com') 
}) 
var success = false; //NOTE THIS 

// AJAX window.open() 
$('#btnAJAX').on("click", function(){ 
    $.ajax({ 
     url: "/user/login/", 
     context: document.body, 
     async:false, //NOTE THIS 
     success: function(){ //THIS ALSO CHANGED 
     success = true 
     } 
    }); 
    if(success){ //AND THIS CHANGED 
     window.open('http://google.com') 
    } 
}) 

यह क्या करता है जब अजाक्स कॉल सफलता है यह सच करने के लिए चर सफलता निर्धारित करता है।
async:false प्रोपर्टीटी यह सुनिश्चित करता है कि अजाक्स कॉल पूरा होने के बाद अगर कथन निकाल दिया गया हो।
तो विंडो.ऑपेन को आपके सीधा लिंक के समान परिस्थितियों में निकाल दिया गया है।

+1

गैर-एसिंक अनुरोधों के साथ कुछ समस्याएं हैं, यदि आप अनुरोध कर रहे पृष्ठ के साथ कोई देरी हो सकती है तो आपको उनका उपयोग नहीं करना चाहिए। [JQuery दस्तावेज़ीकरण] से (http://api.jquery.com/jQuery.ajax/): "ध्यान दें कि अनुरोध सक्रिय होने पर सिंक्रोनस अनुरोध अस्थायी रूप से ब्राउज़र को लॉक कर सकते हैं, किसी भी क्रिया को अक्षम कर सकते हैं।" – Gareth

+0

यह सच है, आपको इस समाधान का उपयोग करते समय सावधान रहना होगा, लेकिन एक ही परिस्थिति में दोनों कार्यों को निष्पादित करने के लिए यह एकमात्र तरीका है (जहां तक ​​मुझे पता है)। क्योंकि यदि आप अजाक्स संस्करण के साथ पॉप-अप को अनुमति देते हैं यह एक पॉप-अप बनाता है, यह प्रत्यक्ष कॉल की तरह एक और टैब नहीं खोलता है। मुझे नहीं पता कि व्यवहार में कोई अंतर क्यों है, लेकिन ऐसा लगता है कि यह चाल चल रहा है। –

+0

धन्यवाद, जैसा कि आप कहते हैं "काम करता है एक आकर्षण ":) ब्राउज़र के लंबे फ्रीज को रोकने के लिए मैंने टाइमआउट = 2000 जोड़ा है ... – T1000

12

समस्या यह है कि ब्राउज़र अक्सर window.opens को अवरुद्ध करेंगे जब तक कि उन्हें उपयोगकर्ता कार्रवाई के प्रत्यक्ष प्रतिक्रिया में नहीं कहा जाता है। यही कारण है कि आपका क्लिक हैंडलर काम करता है (एक क्लिक एक उपयोगकर्ता कार्रवाई है) लेकिन आपका AJAX हैंडलर नहीं करता है।

एक समाधान प्रारंभिक क्लिक कार्रवाई के दौरान विंडो खोलना है, फिर AJAX सफलता पर अपना स्थान अपडेट करें (या AJAX विफलता पर इसे फिर से बंद करें)।

अन्यथा आपको उपयोगकर्ता को अपने ब्राउज़र से अपने डोमेन से पॉपअप को स्पष्ट रूप से अनुमति देने की आवश्यकता होगी।

+1

हां, यह भी समाधान है, लेकिन अगर मुझे responce में कुछ विशिष्ट जानकारी है तो मुझे केवल एक विंडो खोलनी होगी ... इसलिए यह मेरे लिए अच्छा समाधान नहीं है, लेकिन शायद किसी और के लिए सहायक होगा (1+) – T1000

0

एक अतिरिक्त के रूप में यह भी उल्लेखनीय है कि async का उपयोग करके: झूठी और फिर कॉलिंग विंडो। ओपन क्रोम और फ़ायरफ़ॉक्स में काम करता है लेकिन सफारी में परेशानी का कारण बन सकता है ... यह एक जानकारी भी नहीं देता है कि एक पॉपअप अवरुद्ध किया गया था

1

बेहतर तरीका ajax कॉल की सफलता के बाद किसी भी तर्क को लागू है, वहाँ यानी .ajax.Request.done $ और $ .ajax.Request.fail हर ajax कॉल निष्पादन पर गोली चलाई एक घटना है। $ .ajax.Request.done (फ़ंक्शन() {अगर (सफलता) {// तर्क लागू करें}});

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