2013-08-24 34 views
7

Tôi muốn thực thi chức năng tập lệnh nội dung bất cứ khi nào tab được cập nhật. Vấn đề là, đôi khi cập nhật tab là ajax (không cần tải lại trang), trong khi vẫn thay đổi url của trang. Do đó, tập lệnh nội dung cũ được tiêm vẫn tồn tại trên trang. Kết quả là nhiều phiên bản của tập lệnh nội dung được tiêm và chạy trên cùng một trang.phát hiện tập lệnh nội dung mở rộng của Chrome đã được tiêm/tập lệnh nội dung bao gồm bảo vệ

Vì vậy, tôi đang tìm kiếm một cơ chế để chèn tập lệnh nội dung, chỉ khi không có tập lệnh nội dung nào tương tự được chèn trước đó. Ý tưởng nào?

+0

Vì vậy, tôi tò mò nếu bạn đã có thể tìm thấy một giải pháp làm việc ngoài cố gắng để gửi một tin nhắn và chờ đợi một phản hồi từ tập lệnh nội dung? – c00000fd

+0

@ c00000fd: xem lại câu hỏi này, tôi nghĩ giải pháp của Rob W đơn giản hơn, theo nghĩa là nó không phụ thuộc vào việc truyền thông điệp chrome. –

Trả lời

14

Bạn có thể thử gửi tin nhắn tới tập lệnh nội dung (Message Passing). Nếu tập lệnh nội dung trả về thành công một câu trả lời thì điều đó có nghĩa là tập lệnh nội dung đã có sẵn nếu không trả lời trống, bạn có thể kiểm tra phản hồi trống và chèn tập lệnh nội dung.

Bối cảnh:

chrome.tabs.query({active: true, currentWindow: true}, function(tabs) { 
    chrome.tabs.sendMessage(tabs[0].id, {greeting: "hello"}, function(response) { 
     if (response) { 
      console.log("Already there"); 
     } 
     else { 
      console.log("Not there, inject contentscript"); 
     } 
    }); 
}); 

ContentScript:

chrome.runtime.onMessage.addListener(
    function(request, sender, sendResponse) { 
     if (request.greeting == "hello") 
      sendResponse({message: "hi"}); 
}); 
+0

Đã thử điều này. Nhưng bạn chỉ biết về lỗi trong hàm callback của sendMessage. Và bạn không thể bắt lỗi được ném trong hàm gọi lại. –

+0

@KevenWang vui lòng xem câu trả lời cập nhật của tôi –

7

Thực hiện một bao gồm bảo vệ là vô cùng đơn giản:

(function() { 
    if (window.hasRun) return; 
    window.hasRun = true; 
    // Rest of code 
})(); 

Nếu bạn muốn programatically tiêm một content script, xem xét sử dụng một trong những webNavigation sự kiện (ví dụ onCommitted) thay vì chrome.tabs.onUpdated. Không giống như sự kiện tabs, các sự kiện webNavigation cũng được kích hoạt để điều hướng trong các khung và cung cấp một cách để khai báo trước một bộ lọc URL.

+0

Điều cần biết về WebNavigation! Với điều này bao gồm bảo vệ, mã chính nó vẫn được tiêm mặc dù. Sau nhiều lần điều hướng, có thể có rất nhiều tập lệnh nội dung được nhúng vào trang này. Điều đó có gây ra bất kỳ vấn đề hiệu suất nào không? Có cách nào để tiêm bằng cách kiểm tra không có tập lệnh nội dung nào tồn tại không? –

+0

Tất cả tập lệnh nội dung từ cùng một tiện ích chạy trong cùng một ngữ cảnh. Đừng lo lắng về hiệu suất. –

+1

Tất cả tập lệnh nội dung từ cùng một tiện ích chạy trong cùng một ngữ cảnh ... ** cho đến khi tiện ích được tải lại **. Hãy cẩn thận nếu bạn tải lại tiện ích mở rộng - điều này sẽ dẫn đến hai tiện ích đang chạy. – vaughan

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