javascript
  • firefox-addon
  • 2010-01-20 4411 views 9 likes 
    9

    là có thể cho tiện ích Firefox (thanh công cụ) truy cập vào các biến của tài liệu không? giải thích chi tiết sau ..Truy cập biến javascript của tài liệu từ phần mở rộng firefox

    tài liệu nạp:

    <script type="text/javascript"> 
    var variableForExtension = 'something'; 
    </script> 
    

    mở rộng:

    var win = window.top.getBrowser().selectedBrowser.contentWindow; 
    alert(win.variableForExtension); // undefined 
    

    đó là điều đầu tiên cần cố gắng, và nó không thể tiếp cận theo cách này vì cơ chế bảo mật (XPCNativeWrapper). Tôi đã đọc về việc truy cập nó trough wrapJSObject và sử dụng sự kiện (thêm người nghe vào tài liệu và gửi sự kiện từ phần mở rộng), nhưng không có may mắn. Tuy nhiên, không cố gắng quá nhiều. vì vậy, trước khi tôi đào sâu hơn ('phương pháp sự kiện' âm thanh như một cách để đi) tôi muốn biết là điều này thậm chí có thể?

    cảm ơn

    Trả lời

    15

    Có, truy cập biến JS trong nội dung và luôn có thể. Làm điều này một cách ngây thơ không an toàn (theo nghĩa là một trang web độc hại có thể nhận được đặc quyền của Chrome) trong các phiên bản Firefox cũ hơn.

    1) Nếu bạn kiểm soát trang web và muốn chuyển thông tin đến tiện ích, bạn thực sự nên sử dụng events technique. Điều này làm việc và/là an toàn trong tất cả các phiên bản Firefox.

    2) Nếu bạn muốn đọc một giá trị từ các tài liệu nội dung, bạn chỉ có thể bỏ qua XPCNativeWrapper:

    var win = window.top.getBrowser().selectedBrowser.contentWindow; 
    // By the way, this could just be 
    // var win = content; 
    // or 
    // var win = gBrowser.contentWindow; 
    alert(win.variableForExtension); // undefined 
    win.wrappedJSObject.variableForExtension // voila! 
    

    Đây là không an toàn trước khi Firefox 3. Trong Firefox 3 và sau đó là OK để sử dụng , bạn sẽ nhận được một loại trình bao bọc khác (XPCSafeJSObjectWrapper), trông giống như đối tượng từ trang nội dung đến mã của bạn, nhưng đảm bảo trang nội dung sẽ không thể làm bất kỳ điều gì độc hại.

    3) Nếu bạn cần gọi một hàm trong trang web nội dung hoặc chạy mã của riêng bạn trong ngữ cảnh của trang, điều đó phức tạp hơn. Nó được hỏi và trả lời ở nơi khác nhiều lần, nhưng tiếc là không bao giờ được ghi chép đầy đủ. Vì điều này không liên quan đến câu hỏi của bạn, tôi sẽ không đi vào chi tiết.

    +0

    cảm ơn bạn đã trả lời, nickolay. :) Tôi đã thực hiện công việc một cách bẩn thỉu, nhưng sẽ cố gắng (một lần nữa) cả 1 và 2 (tôi không cần 3, nhưng), bây giờ mà tôi biết nó có thể. – parserr

    +0

    @Nickolay. Tôi cần phải đối phó với # 3; Tôi có thể yêu cầu bạn cho con trỏ (nó sẽ hữu ích cho cộng đồng ở đây là tốt). Tôi cần đọc và thực hiện các thao tác trên trang nội dung (bất kỳ trang web nào mà người dùng có thể truy cập). Bạn nói "không được ghi chép đầy đủ nhưng đã trả lời rất nhiều lần", bạn có thể hướng tôi đến một con trỏ tốt không? Đào các tài liệu trong một vài ngày và vẫn không thể làm cho nó hoạt động được. Nếu bạn tò mò: http://stackoverflow.com/questions/21923438/how-to-allow-addons-content-script-access-javascript-variables-from-the-current – CppLearner

    3

    không khó khăn như vậy :)

    trong phần mở rộng:

    var jso=window.content.document.defaultView.wrappedJSObject; 
    

    bây giờ bạn có thể truy cập bất kỳ chức năng hoặc biến toàn cầu trong trang web từ phần mở rộng:

    alert(jso.pagevar); 
    
    jso.pagefunction("hey"); 
    
    0

    Nếu bạn đang làm việc với SDK cấp cao mới thì accessing the variable via content scripts hơi khác một chút. Bạn không thể truy cập trực tiếp vào các đối tượng JavaScript từ mã thêm vào, nhưng bạn có thể tiếp cận chúng từ tập lệnh nội dung đã được đính kèm vào một trang mở thông qua đối tượng unsafeWindow.Ví dụ:

    require("sdk/tabs").open({ 
        url: 'http://www.example.com/some/page/', 
        onOpen: function(tab) { 
        var worker = tab.attach({ 
         contentScript: 'unsafeWindow.variableForExtension = 1000;' 
        }); 
        } 
    }); 
    

    Để đọc các biến bạn sẽ cần phải sử dụng cổng phương pháp trên nhân biến như mô tả trong Mozilla's content script article.

    Lưu ý rằng có một số hạn chế bảo mật khi giao dịch với các đối tượng và chức năng. Xem các bài viết để biết chi tiết.

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