2012-01-14 32 views
11

Tôi có đoạn code sau trong kịch bản nền của tôi:Tiện ích mở rộng của Chrome: cách phát hiện tập lệnh nội dung đó đã được tải vào một tab?

chrome.tabs.onUpdated.addListener(function(tabId, changeinfo, tab) { 
    if (changeinfo.status !== 'complete') 
     return; 

    if (!matchesUrlFilters(tab.url)) 
     return; 

    chrome.tabs.executeScript(tabId, { file: "jquery-1.7.1.min.js" }, function() { 
     chrome.tabs.executeScript(tabId, { file: "enhance.js" }); 
    }); 
}); 

Tuy nhiên, điều này dường như tiêm kịch bản nội dung của tôi hai lần trong một số trường hợp (nó có thể xảy ra khi enhance.js không window.history.pushState).

Làm cách nào để có thể xác định xem tab đã có tập lệnh nội dung của tôi chưa? Tôi đã thử chrome.tabs.sendRequest nhưng nó không bao giờ được gọi là gọi lại nếu tập lệnh nội dung chưa được thêm vào.

+0

Khi tập lệnh được tiêm hai lần, hai tập lệnh 'enhanced.js' có chia sẻ một môi trường thực thi duy nhất với các biến được chia sẻ không? – abraham

+0

Tôi không biết (và bây giờ có lẽ sẽ không bao giờ kiểm tra do câu trả lời giải quyết vấn đề hoàn toàn). –

+0

Tôi biết đây là một câu hỏi cũ, nhưng tôi cũng gặp vấn đề này. Thay vì thêm một kiểm tra cho kịch bản đã tải, tôi chỉ phải xóa tập lệnh khỏi phần "content_scripts" của tệp manifest.json vì tôi ủy thác thực thi tập lệnh và không muốn nó được tải luôn. – Andrew

Trả lời

10

EDIT: Đã cập nhật cho mỗi nhận xét đầu tiên về câu trả lời này.

Bạn có thể thử một cái gì đó như thế này. Thêm một trình lắng nghe onRequest sẽ được sử dụng như một cuộc gọi lại để tải các tập lệnh mà bạn muốn, nhưng chúng sẽ chỉ tải dựa trên một giá trị được gửi như một phần của thông báo yêu cầu. Sau đó sử dụng executeScript để gọi "mã" trực tiếp gửi một tin nhắn với giá trị của một biến toàn cầu (nếu nó tồn tại).

chrome.tabs.onUpdated.addListener(function(tabId, changeinfo, tab) { 
    ... 

    // execute a content script that immediately sends back a message 
    // that checks for the value of a global variable which is set when 
    // the library has been loaded 
    chrome.tabs.executeScript(tabId, { 
     code: "chrome.extension.sendRequest({ loaded: EnhanceLibIsLoaded || false });" 
    }); 

    ... 
}); 

// listen for requests 
chrome.extension.onRequest.addListener(function(req, sender, sendResponse) { 
    if (req.loaded === false) { 
     chrome.tabs.executeScript(tabId, { file: "jquery-1.7.1.min.js" }, function() { 
      chrome.tabs.executeScript(tabId, { file: "enhance.js" }, function() { 
       // set the global variable that the scripts have been loaded 
       // this could also be set as part of the enhance.js lib 
       chrome.tabs.executeScript(tabId, { code: "var EnhanceLibIsLoaded = true;" }); 
      }); 
     }); 
    } 
}); 
+0

Đây là thiên tài, tôi sửa đổi nó một chút (di chuyển 'onRequest.addListener' bên ngoài), nhưng dù sao nó hoạt động hoàn hảo. Lưu ý rằng mặc dù nó phải là 'chrome.extension.onRequest.addListener' thay vì' chrome.tabs.onUpdated.addListener'. –

+0

Vui mừng khi biết điều đó đã hiệu quả, tôi đã chỉnh sửa câu trả lời cho mỗi nhận xét của bạn (cho tôi biết nếu tôi không hiểu đúng - hoặc cảm thấy tự do để chỉnh sửa như vậy). –

+1

Tôi muốn sử dụng điều này nhưng có một lỗi trong consol nói: 'Uncaught ReferenceError: EnhanceLibIsLoaded không được định nghĩa' :( – Alireza

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