2010-07-26 10 views
17

मैं जब कोई उपयोगकर्ता एक निश्चित वेब पेज प्रिंट कुछ जानकारी वापस मेरी डेटाबेस के लिए भेजना चाहते हैं के लिए बराबर है। मैं इसे आईई में onbeforeprint() और onafterprint() के साथ कर सकता हूं लेकिन मैं एक ही काम करने के अज्ञेय तरीके से ब्राउज़र करना चाहता हूं। ध्यान न दें कि मुझे किस तकनीक का उपयोग करना है (PHP, MySQL, जावास्क्रिप्ट, एचटीएमएल) जब तक यह हो जाता है। कोई विचार?onbeforeprint() और onafterprint() गैर IE ब्राउज़र

संपादित करें:

अभी भी इस के साथ कुछ समस्या हो रही है। मैंने अपने काम को Print.css में एक छवि के रूप में डालने का प्रयास किया, लेकिन मैं इसे कुछ गड़बड़ कर रहा हूं। तब मैंने सिर्फ एक ईवेंट श्रोता जोड़ने की कोशिश की, लेकिन मैं इसे ठीक से काम करने के लिए नहीं मिल सकता। यदि कोई भी ब्राउज़र पर मुद्रित करने से पहले किसी फ़ंक्शन को सही तरीके से कॉल करने के बारे में कुछ और जानकारी प्रदान कर सकता है तो मैं इसकी सराहना करता हूं।

संपादित करें:

मैं अभी के लिए इस पर दे रहा हूँ, मैं मेरा इच्छित का एक और तरीका के साथ आकर बस गए हैं। मैं उस दिन की प्रतीक्षा करता हूं जब फ़ायरफ़ॉक्स ऑनफ्रॉप्रप्रिंट() और उसके बाद के निशान() का समर्थन करता है।

उत्तर

6

मैं sure other browsers will allow you to नहीं हूँ। आप निश्चित रूप से एक छवि एक प्रिंट स्टाइलशीट, जो शायद ही एक प्रिंट पर बुलाया जाएगा में कहीं निर्दिष्ट कर सकते हैं ... के लिए मास्किंग onbeforeprint

+0

क्या आप इस तरह कुछ सुझाव दे रहे हैं? http://www.siteexperts.com/forums/viewConverse.asp?d_id = 19568 – ubiquibacon

+1

पता नहीं है कि यह काम करेगा या नहीं। मैं एक सर्वर-पक्षीय स्क्रिप्ट को छवि स्रोत के रूप में बुलावा देने का सुझाव दूंगा जो वास्तव में एक छवि देता है, और केवल वही सामान करता है जो आपको पसंद है (एक प्रिंट एक्शन लॉग करें, संभवतः पृष्ठ पर एक सत्र परिवर्तनीय अन्य जेएस सेट कर सकते हैं/आदि के लिए मतदान कर सकते हैं) – Wrikken

+0

onbeforeprint संस्करण 6 के बाद से फ़ायरफ़ॉक्स द्वारा समर्थित है, https://developer.mozilla.org/en/DOM/window.onbeforeprint देख –

4

कोशिश देशी window.print() अपने स्वयं के साथ,

// hide our vars from the global scope 
(function(){ 

    // make a copy of the native window.print 
    var _print = this.print; 

    // create a new window.print 
    this.print = function() { 
    // if `onbeforeprint` exists, call it. 
    if (this.onbeforeprint) onbeforeprint(this); 
    // call the original `window.print`. 
    _print(); 
    // if `onafterprint` exists, call it. 
    if (this.onafterprint) onafterprint(this); 
    } 

}()) 

अपडेट किया गया: टिप्पणियाँ।

+0

धन्यवाद @no, लेकिन मैं एक कठिन समय अपने कोड निम्न हो रहा है। आप कहते हैं कि यह किसी भी ब्राउज़र में देशी प्रिंट फ़ंक्शन को मुखौटा करेगा? यह मेरे लिए एक और सवाल उठाता है, क्या मैं सिर्फ एक जावास्क्रिप्ट फ़ंक्शन कर सकता हूं जिसने प्रत्येक विंडो ईवेंट की जांच की है और फिर उस विंडो को निष्पादित करें जिसे मैं 'window.print == true' प्रिंट करने से पहले निष्पादित करना चाहता हूं? – ubiquibacon

+0

@typoknig: यह होगा; इसके कारण आप 'onbeforeprint' और' onafterprint' के लिए अलग-अलग नाम चुनना चाहेंगे। मुझे लगता है कि आप अपनी स्क्रिप्ट के अलावा अन्य स्क्रिप्ट से 'window.print' पर कॉल पकड़ना चाहते हैं। अपने प्रश्न के दूसरे भाग के बारे में, मुझे लगता है कि यह काम करेगा, लेकिन यह overkill ... –

+0

@typoknig की तरह लगता है: मैं अपने जवाब देने के लिए कोड टिप्पणियां जोड़ीं, मदद करनी चाहिए समझाने क्या हो रहा है। –

0

मुझे लगता है कि यह बस संभव नहीं यह करने के लिए ठीक से है। या कम से कम - किसी भी तकनीक के साथ मैं नहीं जानता और न ही पहले दिए गए उत्तरों में से किसी के साथ।

दोनों onafterprint का उपयोग करने और serverside गतिशील छवि पैदा स्क्रिप्ट का उपयोग कर आप कहते थे कि पेज भी छपा था जब आगंतुक केवल पूर्वावलोकन मोड मुद्रित करने के लिए चला गया और फिर वहां से रद्द कर दिया।

हालांकि, मैं सीखना चाहता हूं कि उचित जानकारी कैसे प्राप्त करें, ताकि मैं सुनिश्चित कर सकूं कि वह पृष्ठ वास्तव में मुद्रित था।

30

Many browsers अब window.matchMedia समर्थन करते हैं। यह एपीआई आपको यह पता लगाने की अनुमति देता है कि जब सीएसएस मीडिया प्रश्न प्रभावी होते हैं (उदाहरण के लिए, स्क्रीन को घुमाएं या दस्तावेज़ मुद्रित करें)। एक क्रॉस-ब्राउज़र दृष्टिकोण के लिए, window.onbeforeprint/window.onafterprint साथ window.matchMedia गठबंधन।

निम्नलिखित beforePrint() और afterPrint() (उदाहरण के लिए, Chrome fires the listener every time the print preview is regenerated) करने के लिए कई कॉल में हो सकता है। प्रिंट के जवाब में आप जो विशेष प्रसंस्करण कर रहे हैं उसके आधार पर यह वांछनीय हो सकता है या नहीं।

if ('matchMedia' in window) { 
    // Chrome, Firefox, and IE 10 support mediaMatch listeners 
    window.matchMedia('print').addListener(function(media) { 
     if (media.matches) { 
      beforePrint(); 
     } else { 
      // Fires immediately, so wait for the first mouse movement 
      $(document).one('mouseover', afterPrint); 
     } 
    }); 
} else { 
    // IE and Firefox fire before/after events 
    $(window).on('beforeprint', beforePrint); 
    $(window).on('afterprint', afterPrint); 
} 

अधिक: http://tjvantoll.com/2012/06/15/detecting-print-requests-with-javascript/

+3

यह ध्यान देने योग्य है कि क्रोम प्रिंट ईवेंट को दो बार आग लग रहा है। – jlarson

+0

... वास्तव में चार बार - एक बार media.matches = true के साथ, तो media.matches = झूठी, फिर media.matches = true, then media.matches = false। – jlarson

+0

यह काम नहीं करता है जब मैं क्रोम में "सिस्टम संवाद का उपयोग कर प्रिंट करें" का उपयोग करता हूं। खिड़की बंद हो जाती है लेकिन प्रिंटिंग विफल हो जाती है। बस रिपोर्टिंग। :) – Augiwan

0
(function() { 
var beforePrint = function() { 
    if($('.modal').hasClass('in')){ 
     $('body').removeClass('modal-open'); 
    } 
}; 
var afterPrint = function() { 
    if($('.modal').hasClass('in')){ 
     $('body').addClass('modal-open'); 
    } 
}; 

if (window.matchMedia) { 
    var mediaQueryList = window.matchMedia('print'); 
    mediaQueryList.addListener(function(mql) { 
     if (mql.matches) { 
      beforePrint(); 
     } else { 
      afterPrint(); 
     } 
    }); 
} 
window.onbeforeprint = beforePrint; 
window.onafterprint = afterPrint;}()); 

इस कोड को प्रिंट घटनाओं का पता लगाने के लिए सभी ब्राउज़र पर काम करता है।