2012-06-09 35 views
5

Tôi thích khái niệm về GM, nhưng trong thực tế, trừ khi bạn sử dụng nó mọi lúc và là một thần JS tuyệt đối không thể sử dụng (có thể tôi chỉ hút?).Thay thế đơn giản cho Greasemonkey

Sẽ rất hữu ích khi có một chút mở rộng đã lấy một vài dòng JS và chạy chúng sau khi tải trang cho một trang web nhất định. Nhưng đó không phải là những gì GM làm. Với GM, bạn phải đối phó với nhiều khung và các lớp đó trên các lớp của các vấn đề và phạm vi bảo mật gây phiền nhiễu. Ngay cả khi bạn chỉ cần bỏ qua thủ tục thích hợp và sử dụng unsafewindow hoặc một trong các hack khác nó thường vẫn không hoạt động. Nó rất dễ dàng để đến với JS mà bạn có thể chạy trong giao diện điều khiển trình duyệt sẽ làm những gì bạn muốn, nhưng điều này không bao giờ hoạt động khi chuyển giao cho một usercript. có bất kỳ cài đặt nào trong greasemonkey mà tôi có thể thay đổi hoặc một tiện ích mở rộng khác hoàn toàn được hướng đến tính dễ sử dụng không?

Lưu ý: Tôi sử dụng Chrome, vì vậy hãy thưởng điểm thưởng cho giải pháp phù hợp với trình duyệt cụ thể đó.

Tóm tắt: Tôi muốn có cách tự động chạy tập lệnh có phạm vi/quyền giống hệt như bảng điều khiển trên các trang cụ thể.

+3

[Dấu trang] (http://en.wikipedia.org/wiki/Bookmarklet). Ngoài ra, hãy xem http://www.bookmarklets.com/, cùng với nhiều trang khác, bao gồm [trang web Stackapps] (http://stackapps.com/). –

+0

Ah, đó là những gì đang có. Đây sẽ là hữu ích trong nhiều tình huống, nhưng những gì là tuyệt vời như vậy về userscripts là họ sẽ tự động chạy trên các trang mong muốn. – Jonathon

+0

Vâng, jsFiddle ["dọn dẹp" bookmarklet] (http://blog.jsfiddle.net/post/413517861/a-tidy-up-bookmarklet) đặc biệt hữu ích cho tôi. –

Trả lời

7

Không có sự thay thế đơn giản nào đối với Greasemonkey của Firefox hoặc cho người dùng Chrome mà chạy JS tự động. Bạn có thể write your own extension/add-on, nhưng sẽ không có nhiều điểm cho nó.

Nếu bạn không quan tâm đến sức mạnh bổ sung tuyệt vời mà GM và người dùng cung cấp và luôn muốn chỉ "(mất) một vài dòng JS và (chạy) chúng sau khi tải trang cho một trang web nhất định" - bỏ qua iframe, sau đó chỉ cần sử dụng đoạn mã sau làm căn cứ-mẫu cho tất cả các kịch bản của bạn:

// ==UserScript== 
// @name _Base template for simple, cross-browser, JS injection. 
// @match *://YOUR_SERVER.COM/YOUR_PATH/* 
// @run-at document-start 
// ==/UserScript== 

if (window.top != window.self) //-- Don't run on frames or iframes. 
    return; 


function scriptMain() { 
    // PUT ALL OF YOUR CODE HERE, INCLUDING ANY FUNCTIONS YOU CREATE. 
    console.log ("Hello World!"); 
} 

window.addEventListener ("load", scriptMainLoader, false); 

function scriptMainLoader() { 
    addJS_Node (null, null, scriptMain); 
} 

function addJS_Node (text, s_URL, funcToRun) { 
    var D         = document; 
    var scriptNode       = D.createElement ('script'); 
    scriptNode.type       = "text/javascript"; 
    if (text)  scriptNode.textContent = text; 
    if (s_URL)  scriptNode.src   = s_URL; 
    if (funcToRun) scriptNode.textContent = '(' + funcToRun.toString() + ')()'; 

    var targ = D.getElementsByTagName ('head')[0] || D.body || D.documentElement; 
    targ.appendChild (scriptNode); 
} 

Lưu ý rằng @run-at document-start được yêu cầu (dành cho Chrome) nhưng mã của bạn vẫn sẽ cháy tại tải tài liệu.

+0

Có, và như tôi đã nói ngay cả với cách giải quyết (không an toàn ..., tiêm, và sử dụng thanh địa chỉ) trong các tình huống thực tế tôi thấy không có gì hoạt động. Điều này không khác gì với tình huống cụ thể của tôi bây giờ: "$ Acb.close ('Ad160x600_0', InboxPage.onSkyscraperĐóng);" trên hotmail.com (tự động nhấp vào liên kết quảng cáo đóng để cung cấp cho bạn nhiều màn hình hơn). hoạt động hoàn hảo trong bảng điều khiển mỗi lần. – Jonathon

+1

Thay thế "đơn giản" của bạn sẽ không thành công theo cách tương tự. Trên trang đó, có vẻ như một sự chậm trễ AJAX trước khi chức năng bạn muốn có sẵn.Nếu nó "hoạt động từ bàn điều khiển", đó là vì bạn chạy nó vài giây sau khi trang đã tải. Giải pháp là sử dụng bộ đếm thời gian để chờ thêm một vài giây (hoặc tuy nhiên phải mất nhiều thời gian) hoặc để thăm dò ý kiến ​​cho mã đích như trong phần thứ hai của [câu trả lời này] (http://stackoverflow.com/a/6935777/331508). Sự chậm trễ AJAX luôn phụ thuộc nhiều vào chi tiết từng trang. Không có cách tiếp cận đơn giản hơn. –

+0

Tôi chỉ mất một giờ cố gắng thực hiện một tác phẩm kịch bản đơn giản. bạn là một Godsend – muhammedabuali

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