6

Tôi có một tập lệnh nội dung mà thời gian người dùng xem một trang. Để thực hiện việc này, tôi chèn một tập lệnh nội dung vào mỗi trang, bắt đầu hẹn giờ và sau đó phát ra một tin nhắn trở lại tiện ích khi sự kiện onbeforeunload được kích hoạt.Phát hiện tin nhắn tới tiện ích bổ sung từ tập lệnh nội dung onbeforeunload?

Tuy nhiên, thông báo dường như không được chuyển sang tập lệnh nền.

Cho rằng main.js của tôi trông như thế này:

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"); 
    }); 
    } 
}); 

tôi có thể gửi một thông điệp tới main.js sử dụng đoạn mã sau không có vấn đề.

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

Tôi gặp sự cố khi cố gắng thực hiện khi người dùng rời khỏi trang. Tin nhắn không bao giờ nhận được khi tôi làm như sau:

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

Tôi cũng đã thử nghe cả beforeunload cũng không hoạt động. Điều gì có thể là vấn đề?

+0

Bạn có ràng buộc 'onbeforeunload' sau khi tài liệu sẵn sàng không? Thứ hai, bạn có cố gắng đính kèm sự kiện trực tiếp không? 'window.onbeforeunload = function (e) { self.port.emit ('pageView', {visitTime: time}); // Điều này sẽ ngăn người dùng nhìn thấy hộp thoại. trả lại không xác định; }; 'Trong jsfiddle ràng buộc' onbeforeunload' với jQuery không hoạt động, cách trực tiếp không hoạt động –

+0

Tôi khá chắc chắn tôi đã thử cách trực tiếp (đưa ra câu hỏi cách đây vài ngày) nhưng tôi sẽ thử lại và lấy lại cho bạn. Sự ràng buộc đang xảy ra sau khi jQuery sẵn sàng để nó ổn. –

+0

[thử này fiddle] (http://jsfiddle.net/CD6DV/1/) và đặt jquery và javascript theo thứ tự khác nhau. Nếu tôi đặt một 'onbeforeunload' trong jquery tôi thấy 100% xử lý bởi javascript và không xử lý bởi jQuery. Nếu 'beforeunload' được sử dụng trong jQuery tôi thấy hành vi không liên tục. Vì vậy, tôi thinkg javascript là ổn định nhất. Một điều khác mà bạn có thể bị trả về: Không phải mã nào cũng có vẻ được thực hiện. Hãy thử thêm 'alert (" something ");' trong mã và bạn sẽ không thấy nó đang được thực thi. Nếu bạn thay thế 'return undefined' bằng một chuỗi, ít nhất bạn sẽ thấy một hộp thoại để xác nhận rời khỏi trang –

Trả lời

2

Đối tượng window truy cập tập lệnh nội dung trong tiện ích trình duyệt Firefox là đối tượng proxy và có thể hơi nhỏ. Sử dụng window.addEventListener sẽ hoạt động.

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

Sự kiện onbeforeUnload không phải là synchronous, do đó, rác của trình duyệt thu thập trang trước khi hoàn tất. Sử dụng số điện thoại 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 }); 
} 

hoặc return a string làm phương án thay thế.

Các vấn đề liên quan