6

मेरे पास एक सामग्री स्क्रिप्ट है जो उपयोगकर्ता कितनी देर तक एक पृष्ठ देखती है। ऐसा करने के लिए, मैं प्रत्येक पृष्ठ में एक सामग्री स्क्रिप्ट इंजेक्ट करता हूं, टाइमर शुरू करता हूं और फिर onbeforeunload ईवेंट ट्रिगर होने पर एड-ऑन पर एक संदेश वापस छोड़ देता है।सामग्री स्क्रिप्ट से ऐड-ऑन पर एडिट संदेश पर क्लिक करें?

संदेश कभी भी पृष्ठभूमि स्क्रिप्ट को पारित नहीं लगता है।

यह देखते हुए कि मेरी main.js इस तरह दिखता है:

var pageMod = require('page-mod'), 
    self = require("self"); 

pageMod.PageMod({ 
    include: "http://*", 
    contentScriptFile: [self.data.url('jquery.min.js'), 
         self.data.url('content.js')], 
    onAttach: function(worker) { 
    worker.port.on('pageView', function(request) { 
     console.log("Request received"); 
    }); 
    } 
}); 

मैं निम्नलिखित कोड का उपयोग कर कोई समस्या नहीं main.js के लिए एक संदेश भेज सकते हैं।

self.port.emit('pageView', { visitTime: time }); 

जब मैं उपयोगकर्ता को पृष्ठ छोड़ देता हूं तो मैं इसे करने की कोशिश करता हूं। संदेश प्राप्त नहीं होता है जब मैं इसे इस तरह कार्य करें:

$(window).bind('onbeforeunload', function(e) { 
    self.port.emit('pageView', { visitTime: time }); 
    // This should prevent the user from seeing a dialog. 
    return undefined; 
}); 

मैं beforeunload के लिए भी सुनने की कोशिश की है, कि या तो काम नहीं करता। क्या समस्या हो सकती है?

+0

क्या आप दस्तावेज़ तैयार होने के बाद 'onbeforeunload' को बाध्यकारी कर रहे हैं? दूसरा, क्या आपने सीधे ईवेंट संलग्न करने की कोशिश की? 'window.onbeforeunload = function (e) { self.port.emit ('पृष्ठ दृश्य', {विज़िटटाइम: समय}); // यह उपयोगकर्ता को एक संवाद देखने से रोकना चाहिए। वापस अपरिभाषित; }; 'jsfiddle में jQuery के साथ' onbeforeunload 'को बाध्यकारी काम नहीं करता है, सीधा तरीका काम करता है –

+0

मुझे पूरा यकीन है कि मैंने प्रत्यक्ष तरीके से प्रयास किया है (कुछ दिन पहले प्रश्न बनाया था) लेकिन मैं फिर कोशिश करूंगा और आपके पास वापस आता हूँ। JQuery तैयार होने के बाद बाध्यकारी हो रहा है ताकि ठीक होना चाहिए। –

+0

[इस पहेली को आजमाएं] (http://jsfiddle.net/CD6DV/1/) और jquery और जावास्क्रिप्ट को विभिन्न क्रम में रखें। अगर मैं jquery में 'onbeforeunload' डालता हूं तो मुझे जावास्क्रिप्ट द्वारा 100% हैंडलिंग दिखाई देती है और jQuery द्वारा कोई हैंडलिंग नहीं होती है। यदि jQuery में 'preunload' का उपयोग किया जाता है तो मैं अड़चन व्यवहार देखता हूं। इसलिए मुझे लगता है कि जावास्क्रिप्ट सबसे स्थिर है। एक और चीज जिसमें आप उछाल सकते हैं: सभी कोड निष्पादित नहीं होते हैं। 'अलर्ट ("कुछ") जोड़ने की कोशिश करें; कोड में और आप इसे निष्पादित नहीं देख पाएंगे। यदि आप स्ट्रिंग के साथ 'रिटर्न अपरिभाषित' को प्रतिस्थापित करते हैं, तो कम से कम आपको पृष्ठ –

उत्तर

2

window ऑब्जेक्ट जो सामग्री स्क्रिप्ट फ़ायरफ़ॉक्स में एक्सेस करता है ब्राउज़र ऐड-ऑन एक प्रॉक्सी ऑब्जेक्ट है और यह थोड़ा स्वभावपूर्ण हो सकता है। window.addEventListener का उपयोग करना काम करेगा।

window.addEventListener('beforeunload', function(e) { 
    # Do stuff then return undefined so no dialog pops up. 
    return undefined 
}); 
1

ऑनबेयरउनलोड ईवेंट synchronous नहीं है, इसलिए ब्राउज़र कचरा समाप्त होने से पहले पृष्ठ एकत्र करता है। का प्रयोग करें एक synchronous AJAX request:

function Data() 
{ 
var client = new XMLHttpRequest(); 
client.open("GET", "/request", false); // third paramater indicates sync xhr 
client.setRequestHeader("Content-Type", "text/plain;charset=UTF-8"); 
client.send({ visitTime: time }); 
client.onreadystatechange = emitter; 
} 

function emitter() 
{ 
self.port.emit('pageView', { visitTime: time }); 
} 

या return a string एक विकल्प के रूप।