2012-02-27 32 views
9

Tôi đang cố gắng chuyển một plugin Chrome sang Firefox bằng cách sử dụng addon-sdk và tôi không thể tìm thấy phương thức tương đương để nghe các sự kiện điều hướng tab.Firefox addon-sdk - nghe để điều hướng trang

Những gì tôi cần làm là giữ cho dữ liệu mỗi trang (phát hiện từ DOM), và loại bỏ điều này ngay khi người dùng điều hướng đến một trang mới trong tab (nhưng, duy trì dữ liệu trên refresh)

tôi Chrome, để làm một cái gì đó khi một tab thay đổi URL, tôi có thể sử dụng:

chrome.tabs.onUpdated.addListener(function(tab_id, changeInfo, tab) { 
    if(changeInfo.status == 'loading' && changeInfo.url) { 
     //DO STUFF AS THE URL CHANGED 
    } 
}); 

Trong Firefox sử dụng addon-sdk tôi đã cố gắng sử dụng:

tabs.on('open', function(tab){ 
    tab.on('ready', function(tab){ 
    if(tab.cachedURL != tab.url) { 
     //DO STUFF AND SET CACHE 
    } 
    }); 
}); 

vấn đề là tôi không thể móc vào tôi sự kiện điều hướng nitial, do đó, ở giữa người dùng bắt đầu điều hướng và DOM của trang mới đang sẵn sàng, dữ liệu cũ có sẵn.

Về cơ bản, tôi cần một cách để nối vào điều hướng ban đầu của một tab và lý tưởng xem nó sẽ đi đâu (giống như tôi có thể làm trong Chrome).

Mọi suy nghĩ?

Trả lời

11

Hiện tại không có cách nào để phát hiện tải trang bằng tab. Tuy nhiên bạn có thể làm điều đó với sự kiện bắt đầu trong trang-mods. Tôi cũng quan tâm đến việc làm điều này theo cách đúng, vì vậy hãy ping tôi nếu bạn tìm thấy một cách mà không sử dụng trang-mods:

var pageMod = require("page-mod"); 
pageMod.PageMod({ 
    include: "*", // All DOM windows (ie. all pages + all iframes). 
    contentScriptWhen: "start", // page starts loading, at this point you have 
           // the head of the document and no more 
    contentScript: "", // inject no script, you can even omit this 
    onAttach: function onAttach(worker) { 
      if (worker.tab.url == worker.url) // test if at top level 
       doStuff(worker.tab.url); 
      // cleanup the attached worker 
      worker.destroy(); 
     } 
    } 
); 

Ngoài ra, tôi không biết về tốc độ của onAttach kích hoạt, như với tất cả các thông điệp đi qua trong phần mở rộng ff, nó có thể thêm một số thời gian (có thể 150ms? xin vui lòng trở lại với tôi nếu bạn có một điểm chuẩn này)

+0

Cảm ơn câu trả lời của bạn, tôi sẽ phải thực hiện việc này. Dường như nó sẽ làm những gì tôi muốn (mặc dù trong một cách vòng). Hy vọng FF sẽ thực hiện một API chính xác hơn trong tương lai. –

+2

@AdamHeath Vâng, thật tuyệt vời khi Mozilla và những người ở Chromium đồng ý với một API chung, viết phong cách quy trình HTML5 cụ thể. – BenoitParis

+1

Đã thử nghiệm tính năng này gần đây, thực hiện công việc, để đánh dấu là được chấp nhận. Cảm ơn –

0

Theo tôi biết, điều này sẽ nắm bắt tất cả các trường hợp mở tab, chuyển đổi giữa các tab và điều hướng trong các tab. Biến toàn cục url phải chứa url của tab hoạt động mọi lúc và cuộc gọi console.log sẽ ghi lại tất cả các sự kiện ảnh hưởng đến điều đó.

var tabs = require("sdk/tabs"); 
var url; 

var updateURL = function (tab) { 
    var oldURL = url; 
    url = tab.url; 
    console.log(oldURL+" --> "+url); 
}; 

tabs.on("activate", updateURL); 
tabs.on("pageshow", updateURL); 

updateURL(tabs.activeTab); 
+1

Tôi nghĩ rằng dòng "url = tab.url" phải ở trên đầu ra console.log. – goelakash

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