2012-05-01 19 views
19

मुझे पता है कि इससे पहले यहां चर्चा की गई है, फिर भी मुझे इसके लिए कोई व्यावहारिक समाधान/कामकाज नहीं मिला, मुझे उम्मीद है कि अगर किसी को इस समस्या को हल करने का कोई विचार है तो!जावास्क्रिप्ट प्रिंट क्रोम द्वारा अवरुद्ध, वर्कअराउंड?

यहाँ यह है:

आप window.print() विधि अक्सर (जैसे कि एक उपयोगकर्ता एक प्रिंट बटन पर क्लिक करता है) गूगल क्रोम में एक पृष्ठ में कॉल करने के लिए कोशिश करते हैं, ब्राउज़र कंसोल में एक चेतावनी संदेश फेंकता है, बताते हुए :

भी अक्सर कॉल की उपेक्षा कर मुद्रित करने के लिए()

और कुछ नहीं होता! कई सेकंड के बाद, चीज़ें सामान्य पर वापस जाती हैं और प्रिंट संवाद तब दिखाई देता है जब आप window.print() कमांड को फिर से कॉल करते हैं! मामलों को और भी खराब बनाने के लिए, अच्छे क्रोम लोग प्रिंट पेज को कॉल करने वाले पृष्ठ के लिए घातीय प्रतीक्षा समय का उपयोग करते हैं, जिसका अर्थ प्रिंट करने के लिए बटन पर अधिक उपयोगकर्ता क्लिक होता है, उतना ही उसे प्रिंट संवाद के लिए इंतजार करना पड़ता है!

यह समस्या काफी कुछ समय (14 बाद के संस्करणों) और यह एक Area-UI बग होने के रूप में की पुष्टि की है के लिए क्रोम में किया गया है, मैं posted it again for google team कल उम्मीद कर रहा है, तो Chrome टीम की कोई पुष्टि कर सकते हैं जब इस अविश्वसनीय कष्टप्रद सुविधा जा रहा है निर्धारित होना!

हालांकि, मैं यहां जो खोज रहा हूं वह इस समस्या के लिए एक समाधान है, क्या कुछ भी मैं यह काम करने में सक्षम हो सकता हूं? मेरी कंपनी एक बहुत ही लेन-देन वाली वित्तीय प्रणाली विकसित कर रही है जिसमें प्रिंटिंग की ज़रूरत है, और केवल एक छोटी सी गड़बड़ी के लिए, पूरी परियोजना को मेरे पसंदीदा Google क्रोम ब्राउज़र में चलाने का खतरा है!

अद्यतन:

Here's the code in Chrome browser कि इस सुविधा का कारण बनता है और इससे पहले कि किसी को फिर से प्रिंट आदेश कहता है, तो UI में 2 सेकंड अंतराल के एक टाइमर संभवतः एक अनंत प्रतीक्षा में हो रही रोकने सकता है यह है कि कम से कम 2 सेकंड की तरह दिखता है की जरूरत है वापस कॉल करें! कोई अन्य विचार?

+2

मैं चारों ओर केवल काम एक आंतरिक टाइमर (ट्रैक प्रिंट करने के लिए ठीक होने पर ट्रैक करने के लिए) के बारे में सोच सकता है और जब प्रिंट बटन दबाया जाता है तो एक एनीमेशन एक एनीक्स के समान होता है जब तक कि प्रिंट वास्तव में नहीं कहा जाता है। यह बहुत अच्छा नहीं है क्योंकि यह अभी भी प्रिंट प्रक्रिया में देरी कर रहा है लेकिन यह पॉप-आउट से बेहतर और त्रुटि दिखाई देगा। – GillesC

+2

@gillesc: हाँ, बटन पर क्लिक करते समय "कुछ नहीं" होने से बेहतर है और आप बार-बार इसे और भी खराब बनाते हैं! मुझे क्रोम ब्राउज़र में कोड की रेखा मिली जो इस सुविधा का कारण बनती है: http: //git.chromium.org/gitweb/? P = chromium.git; a = commitdiff_plain; h = 8a86b38e5c593998369f4c3a789489e3fd9e8354 और ऐसा लगता है कि कम से कम 2 सेकंड है किसी को प्रिंट कमांड को दोबारा कॉल करने से पहले जरूरी है, इसलिए 2 सेकेंड अंतराल का टाइमर संभवतः अनंत प्रतीक्षा कॉलबैक में आने से रोक सकता है! –

+1

क्या एक ही पृष्ठ या विभिन्न पृष्ठों पर 'window.print' पर कॉल हैं? यदि अलग है, तो क्या वे एक नई विंडो/टैब या आईफ्रेम में हैं?या एक ही टैब, एक रीडायरेक्ट के माध्यम से? – apsillers

उत्तर

19

आप सशर्त window.print() समारोह की जगह सकता है:

// detect if browser is Chrome 
if(navigator.userAgent.toLowerCase().indexOf("chrome") > -1) { 
    // wrap private vars in a closure 
    (function() { 
     var realPrintFunc = window.print; 
     var interval = 2500; // 2.5 secs 
     var nextAvailableTime = +new Date(); // when we can safely print again 

     // overwrite window.print function 
     window.print = function() { 
      var now = +new Date(); 
      // if the next available time is in the past, print now 
      if(now > nextAvailableTime) { 
       realPrintFunc(); 
       nextAvailableTime = now + interval; 
      } else { 
       // print when next available 
       setTimeout(realPrintFunc, nextAvailableTime - now); 
       nextAvailableTime += interval; 
      } 
     } 
    })(); 
} 

इसके बजाय एक बाहरी सुरक्षा टाइमर/आवरण का उपयोग करने का, आप एक आंतरिक एक का उपयोग कर सकते हैं। बस इसे जोड़ें और window.print क्रोम में और आमतौर पर हर जगह सुरक्षित रूप से व्यवहार करता है। (इसके अलावा, बंद का मतलब है आप एक से अधिक फंसाया पृष्ठों के बीच window.print के लिए कॉल समन्वय करने के लिए की जरूरत है realPrintFunc, interval और nextAvailableTime नई window.print

के लिए निजी हैं, तो आप पैरेंट पृष्ठ में nextAvailableTime सेट कर सकते हैं, बल्कि बंद की तुलना में है, इसलिए कि सभी फ्रेम window.parent.nextAvailableTime का उपयोग करके साझा मूल्य तक पहुंच सकते हैं।

+0

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

+0

क्या यह स्निपेट अभी भी कुछ लोगों के लिए काम करता है? मुझे लगता है कि मैं अभी भी कोड को मुद्रित करने के लिए बहुत बार कॉल को अनदेखा कर रहा हूं, जबकि कोड को दिए गए शब्द के रूप में दोनों कोड का उपयोग करते हुए, और फ्लैग/टाइमआउट के लिए देखे जाने वाले कुछ बदलावों में आगे टाइमआउट फ़ंक्शंस सेट नहीं करना है। क्रोम 22.0.122 9.9 4 का उपयोग करना। –

1

मेरा समाधान window.print() कम बार कॉल करना होगा। आप window.print() को अपने तरीके से लपेटने का प्रयास कर सकते हैं और window.print() को फिर से निष्पादित करने से पहले पास करने के लिए न्यूनतम समय अंतराल डाल सकते हैं। यूआई में आपके पास कुछ प्रकार का परिवर्तन/एनीमेशन हो सकता है यह इंगित करने के लिए कि काम किया जा रहा है।

"कार्य"

जब तक आपको लगता है कि यह वास्तव में प्रिंट बटन को एक बार एक दूसरे/हर कुछ सेकंड में मदद करता है और अधिक से अधिक दबाने लगता है? मेरा मतलब है कि window.print() ऑपरेशन लंबे समय तक लेता है, यह आपके कोड की गलती नहीं है और यूआई में वैसे भी "प्रतीक्षा करें और धैर्य रखें" -इंडिकेटर होना चाहिए।

+1

हां, मैंने अभी तक जो किया है, एक दूसरा प्रिंट कमांड –

1

यदि आपके सभी प्रिंटर नेटवर्क-संगत हैं, तो आप प्रिंट बटन पर क्लिक करते समय क्या बदल सकते हैं बदल सकते हैं। पृष्ठ को मुद्रित करने के बजाय, आपका एप्लिकेशन पृष्ठ के यूआरएल के साथ प्रिंट करने के लिए और प्रिंटर प्रिंट करने के बारे में जानकारी के साथ एक सर्वर को एक अनुरोध भेज सकता है।

सर्वर तब प्रिंट प्रक्रिया को मैन्युअल रूप से लॉन्च करता है और इसमें कोई ब्राउज़र नहीं होगा, जो आपको ऐसा करने से रोक सकता है।

+1

साफ समाधान भेजने से पहले 2 सेकंड अंतराल न्यूनतम प्रतीक्षा समय है, मैं ऐसा करूँगा कार्यक्रम स्थानीय नेटवर्क में स्थापित है, लेकिन दुर्भाग्यवश सॉफ्टवेयर स्थानीय और व्यापक क्षेत्र नेटवर्क दोनों पर लक्षित है! –

3

मैं एक ही मुद्दे के खिलाफ उछाल रहा हूं, और मेरे लिए सबसे सीधा समाधान सिर्फ एक नई विंडो बनाना था, लिखना कि मुझे इसकी क्या ज़रूरत है, बंद करें इसे, और प्रिंट करें। मुझे क्रोम की सीमा से निपटना नहीं पड़ा क्योंकि मैंने इसे इस तरह से काम करने के लिए बदल दिया है, और मुझे कोई ट्रैकिंग करने की आवश्यकता नहीं है।

print_window= window.open(); 
print_window.document.write(print_css + divToPrint[0].outerHTML+"</html>"); 
print_window.document.close(); 
print_window.focus(); 
print_window.print(); 
print_window.close(); 
1

हर जगह जहां मैं इस मुद्दे का उल्लेख करता हूं, टाइमर का उपयोग करने का सुझाव देता है। हालांकि वे इस मुद्दे को हल नहीं करते हैं और मुझे लगता है कि कामयार एकमात्र ऐसा व्यक्ति है जो वास्तव में स्रोत पढ़ता है और समस्या को समझता है, इसलिए मुझे आश्चर्य है कि उसने जवाब क्यों स्वीकार कर लिया।

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

अबाथुर का समाधान वास्तव में आपके अपेक्षा से बेहतर काम करता है। मुझे यकीन नहीं है कि मैं इसका इस्तेमाल करूंगा लेकिन यह काम करता है।

अच्छी खबर:

1) देरी वास्तव में क्रोम के नवीनतम संस्करण में कम है। अब यह जाता है: [2, 2, 2, 4, 8, 16, 32, 32, ...]

2) किसी ने 28 अगस्त को इस मुद्दे को उठाया: http://code.google.com/p/chromium/issues/detail?id=50186 यदि आप इस समस्या को हल करना चाहते हैं तो कृपया इसे तारांकित करें।

1

कोई और काम-आसपास नहीं! अगर मैं गलत नहीं हूं तो v.23 के हिस्से के रूप में fixed बग।

तो अगर रिलीज चक्र हर 6 सप्ताह है और क्रोम 22 नवंबर की 6 वीं से सितम्बर की 25 वीं जारी किया गया था, तो (aprox।) ठीक Chrome स्थिर संस्करण में होगा

+3

मेरे पास 23 है और यह अभी भी एक समस्या है। –

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