2009-02-15 38 views
6

Đây là mã kịch bản của tôi:Greasemonkey Script và Chức năng Phạm vi

// ==UserScript== 
    // @name   test 
    // @description test 
    // @include  http://* 
    // @copyright  Bruno Tyndall 
    // ==/UserScript== 

    var main = function() { 
     var b = document.getElementsByTagName('body')[0]; 
     var t = document.createElement('div'); 
     t.innerHTML = '<a href="javascript:void(0);" style="color:white;">Hello World</a>'; 
     t.style.position = 'absolute'; 
     t.style.zIndex = 1000; 
     t.style.bottom = '5px'; 
     t.style.right = '5px'; 
     t.firstChild.setAttribute('onclick', 'test();'); 
     b.appendChild(t); 

    } 

    var test = function() { 
     alert("Hello World"); 
    } 
    main(); 

Vấn đề duy nhất tôi có là khi Hello World được nhấp trang không thể tìm thấy những thử nghiệm() chức năng. Xin vui lòng cho tôi biết tôi không phải giải quyết nó bằng cách innerHTML'ing chức năng lên trang như this. Có cách nào khác không?

Cảm ơn.

Trả lời

13

Greasemonkey thực hiện tập lệnh trong hộp cát - trang không có quyền truy cập vào nó vì lý do bảo mật. Tất cả các acceses để dom và cửa sổ là thông qua hàm bao.

Nếu bạn muốn truy cập các đối tượng không an toàn, bạn có thể sử dụng thuộc tính wrappedJSObject.

Đối với trường hợp của bạn, bạn có thể sử dụng unsafeWindow (hoặc window.wrappedJSObject):

unsafeWindow.test = function() { .... 

Có một số vấn đề an ninh với điều này, xem: http://wiki.greasespot.net/UnsafeWindow

Ngoài ra, greasemonkey thực thi kịch bản sau khi DOMContentLoaded (khi dom đã sẵn sàng) sự kiện, do đó bạn không cần điều đó vô nghĩa onload.

Ngoài ra, bạn không thể sử dụng thuộc tính để đặt trình xử lý sự kiện hoặc thuộc tính cho vấn đề đó - bạn phải sử dụng lệnh api cho điều đó. Ví dụ:

t.firstChild.addEventListener('click', test, false); 

hay:

t.firstChild.addEventListener('click', function(event){ blabla }, false); 
+0

+1. Cảm ơn. Tôi sẽ đánh giá cao suy nghĩ của bạn về nơi tôi đang bị mắc kẹt bây giờ. Tôi đăng nó lên trên http://userscripts.org/topics/21770 Tôi không thể có được chức năng anon nội tuyến để hoạt động. – BuddyJoe

+0

Tôi nên thêm ... Tôi nhận được trợ giúp từ Bảng điều khiển Lỗi về điều gì đang xảy ra. – BuddyJoe

+0

Đó là vé !!! cảm ơn. – BuddyJoe

1

Hãy thử thêm các xét nghiệm chức năng để các đối tượng cửa sổ

window.test = function ... 

Sửa

Ngoài ra, đó là một ý tưởng tốt để chạy mã của bạn từ một xử lý sự kiện 'tải' thay vì chỉ bằng cách gọi nó ở cuối tập lệnh của bạn. ví dụ:

window.addEventListener("load", function(e) { 
// Your main() here 
}, false); 
+1

Các window.test = function ... đã không làm việc cho tôi. vẫn cho tôi lỗi kiểm tra không được xác định. – BuddyJoe

+0

Bạn đang gọi window.test() trong chính? –

1

iirc, greasemonkey chạy trong phạm vi riêng của nó, vì vậy kiểm tra sẽ không nằm trong không gian tên chung.

Thay vì điều chỉnh toàn cầu, tại sao không tạo phần tử neo của bạn thông qua thao tác DOM? Điều đó sẽ trả về cho bạn một refernece mà bạn có thể ràng buộc một hàm ẩn danh (hoặc kiểm tra phạm vi mỡ).

+0

Bạn có thể xây dựng một chút không? Làm thế nào bạn sẽ làm điều đó nếu bạn muốn giữ cho chức năng "không vô danh" (phạm vi trong Greasemonkey). Ý bạn là gì? – BuddyJoe

+0

Tôi đang tạo neo thông qua thao tác DOM ngay bây giờ. Nhưng tôi không thấy làm thế nào để "liên kết" các chức năng một cách chính xác. – BuddyJoe

+0

Tôi đã trả lời câu trả lời này và sau đó thấy bạn đã ở đó rồi :) – annakata

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