2010-09-01 37 views
7

Trong tiện ích mở rộng của mình, tôi đang cố gắng xác định xem tab mới đã được tạo dưới dạng cửa sổ bật lên bởi một tab khác hay chưa và nếu có, tab nào.Tập lệnh nội dung tiện ích của Chrome có thể truy cập vào window.opener không?

tôi nghĩ rằng tôi sẽ có thể sử dụng window.opener từ một kịch bản nội dung để giúp con số này ra. Nhưng có vẻ như window.opener không hoạt động chính xác trong các tập lệnh nội dung.

Khi tôi tạo ra một tab bằng tay, nó window.opener là null như mong đợi.

Khi một tab được tạo ra như một popup bằng tab khác, window.opener của nó là không xác định. Tôi có thể suy ra từ điều này rằng tab đã được tạo ra như là một popup, nhưng tôi không thể sử dụng nó để tìm ra tab nào được tạo ra mới.

Đây có phải là một vấn đề được biết đến, và không ai biết về bất kỳ cách giải quyết?

+0

Bản sao có thể có của http://stackoverflow.com/questions/3124543/is-it-possible-to-determine-a-tabs-opener-within-a-google-chrome-extension – npdoty

+0

Có, có vẻ như vậy. Nhưng không câu hỏi nào được trả lời .. – Greg

+0

[Hiện tại chúng tôi đang có xu hướng để các câu hỏi tương tự tồn tại.] (Http://blog.stackoverflow.com/2010/11/dr-strangedupe-or-how-i-learned- dừng lại-lo lắng-và-tình yêu-sao chép /) – Will

Trả lời

16

Tôi không xem xét kỹ vấn đề này, nhưng tôi nghĩ tôi có thể chỉ cho bạn đúng hướng. Tập lệnh nội dung không thể truy cập biến từ cửa sổ chính vì nó được tạo hộp cát. Một cách giải quyết sẽ để chạy mã của bạn trực tiếp trên một trang, để làm điều này bạn cần phải tiêm kịch bản của bạn bên trong một thẻ script:

kịch bản nội dung của bạn sẽ trông như thế này:

function injectJs(link) { 
     var scr = document.createElement("script"); 
     scr.type="text/javascript"; 
     scr.src=link; 
     (document.head || document.body || document.documentElement).appendChild(scr); 
} 

injectJs(chrome.extension.getURL("inject.js")); 

Bây giờ bạn có thể chạy code của bạn mà không hạn chế sandbox như thể nó đã đúng trên trang:

inject.js:

alert(window.opener); 

tôi giả sử bạn muốn bây giờ chuyển thông tin này trở lại một ba trang ckground, đây là một thách thức khác vì bạn không thể sử dụng API Chrome. Tin vui là tập lệnh nội dung có thể truy cập DOM và nghe các sự kiện DOM, vì vậy bạn có thể sử dụng chúng để chuyển thông tin tới tập lệnh nội dung sẽ gửi đến trang nền. Tôi khá chắc chắn bạn sẽ có thể đăng ký một sự kiện DOM tùy chỉnh và có kịch bản nội dung của bạn nghe nó (đã không cố gắng phần này bản thân mình).

+0

Tôi đã kết thúc giải quyết vấn đề của tôi bằng cách sử dụng một phương pháp như thế này; tiêm nhiều mã vào trang và sử dụng 'postMessage' để giao tiếp giữa các khung và giữa trang và tập lệnh nội dung của tôi. Nó khá đau, nhưng dường như nó hoạt động phần lớn thời gian. – Greg

+3

Bất kỳ cơ hội nào để xem một số ví dụ về kịch bản lệnh này -> tập lệnh nội dung -> giao diện trang nền'. từ @Greg hoặc @serg Tôi đang gặp khó khăn với vấn đề chính xác hiện tại – kevzettler

+2

@kevzettler bạn có thể tiêm một tập lệnh lưu trữ 'window.desiredData' làm thuộc tính trên' document.body', và sau đó đọc thuộc tính từ nội dung của bạn- tập lệnh (vì chúng chia sẻ cùng một DOM) – levi

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