5

Vì vậy, tôi muốn chạy tập lệnh khi tab tải lại trong URL được chỉ định. Nó gần như làm việc, nhưng thực sự id không :) Đây là file manifest của tôi:Tôi làm cách nào để chạy tập lệnh này khi tải lại tab (tiện ích mở rộng của chrome)?

{ 
"manifest_version": 2, 

"name": "Sample Extension", 
"description": "Sample Chrome Extension", 
"version": "1.0", 

"content_scripts": 
[ 
    { 
     "matches": ["http://translate.google.hu/*"], 
     "js": ["run.js"] 
    } 
], 

"permissions": 
[ 
    "activeTab", 
    "tabs" 
], 

"browser_action": 
{ 
    "default_title": "Sample", 
    "default_icon": "icon.png" 
} 
} 

và đây là run.js:

chrome.tabs.onUpdated.addListener(
function (tabId, changeInfo, tab) 
{ 
    if (changeInfo.status === "complete") 
    { 
     chrome.tabs.executeScript(null, {file: "program.js"}); 
    } 
} 
); 

Các programs.js chỉ cảnh báo một số văn bản (chưa). Khi tôi đặt một cảnh báo cho dòng đầu tiên của run.js, nó cảnh báo, nhưng khi tôi đặt nó vào nếu nó không xảy ra. Tôi không thể tìm thấy vấn đề. Tôi đã nhập sai điều gì?

+0

Bạn có kiểm tra lỗi trong bảng điều khiển dành cho nhà phát triển không? Tôi nghĩ rằng bạn cần phải chạy điều này từ một trang nền chứ không phải là tập lệnh nội dung. Tôi tin rằng các tập lệnh nội dung chỉ có thể sử dụng chrome.extension và tất cả các phương thức khác trong api cần được gọi trên trang background.js. – QFDev

+0

Hooking https://stackoverflow.com/q/23333771/632951 – Pacerier

Trả lời

8

Giả sử rằng http://translate.google.hu/* trang là những trang bạn muốn chèn mã vào khi tải lại, bạn sẽ phải thực hiện theo cách hơi khác. Hiện tại, bạn đang luôn luôn mã tiêm vào các trang đó (mà không được phép làm như vậy, không ít hơn) và sau đó cố gắng sử dụng chrome.tabs api bên trong tập lệnh nội dung đó mà bạn không thể thực hiện. Thay vào đó, chúng tôi sẽ đưa người nghe vào trang nền và chỉ chèn mã vào trang làm mới, như bạn muốn. Đầu tiên là manifest:

{ 
    "manifest_version": 2, 
    "name": "Sample Extension", 
    "description": "Sample Chrome Extension", 
    "version": "1.0", 
    "background": { 
    "scripts": ["background.js"] 
    }, 
    "permissions":[ 
    "http://translate.google.hu/*", "tabs" 
    ] 
} 

background.js

chrome.tabs.onUpdated.addListener(function(tabId,changeInfo,tab){ 
    if (tab.url.indexOf("http://translate.google.hu/") > -1 && 
     changeInfo.url === undefined){ 
    chrome.tabs.executeScript(tabId, {file: "program.js"}); 
    } 
}); 

này sẽ lắng nghe cho sự kiện onUpdated, kiểm tra nếu nó là một trong những 's url mà chúng tôi muốn tiêm vào, và sau đó nó sẽ kiểm tra xem trang đã được tải lại chưa. Bước cuối cùng đó được thực hiện bằng cách kiểm tra xem có tồn tại changeInfo.url hay không. Nếu có, thì điều đó có nghĩa là url đã được thay đổi và do đó không làm mới. Ngược lại, nếu nó không tồn tại thì trang phải được làm mới.

+0

Cảm ơn, điều đó có hiệu quả, nhưng làm cách nào tôi có thể chạy tập lệnh này nếu có một tab khác ở trên cùng? –

+0

@Geiszla Bạn có ý nghĩa gì với một tab khác ở trên cùng? – BeardFist

+1

Vì vậy, khi tôi tải lại tab, nhưng thay đổi tab. Sau đó, tập lệnh không chạy, vì đó không phải là trang web (ví dụ: translate.google.hu). –

1

content_scripts được chạy ở mọi trang (lại) tải, vì vậy tốt nhất là chỉ sử dụng chúng để phát hiện.

Bằng cách này bạn cũng không gặp rủi ro khi chạy bất kỳ mã nào trong số background trước khi content_script của bạn sẵn sàng nhận bất kỳ thư nào.

+0

Dường như có lỗi Chrome do đó đôi khi nội dung biểu hiện không chạy trên tải trang. Xem https://stackoverflow.com/questions/19191679/chrome-extension-inject-js-before-page-load/19192010#comment78166411_19192010 – Pacerier

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