2008-09-23 25 views
12

Một số tính năng và kỹ thuật ít được biết đến nhưng hữu ích mà mọi người đang sử dụng trong tập lệnh Greasemonkey của họ là gì?Các tính năng ẩn của Greasemonkey

(. Xin vui lòng, chỉ là một tính năng mỗi câu trả lời)

chủ đề tương tự:

+1

có thêm 10 câu hỏi được gắn thẻ như ẩn-tính năng. http://stackoverflow.com/questions/tagged/hidden-features –

Trả lời

8

Dữ liệu có thể được duy trì trên các lần tải trang bằng cách lưu trữ nó dưới dạng giá trị tùy chọn mozilla qua GM_setValue(keyname, value).

Dưới đây là một ví dụ đơn giản mà tallys số lần kịch bản của bạn đã được thực hiện - bởi một trình duyệt đưa ra:

giá trị
 
var od = GM_getValue("odometer", 0); 
od++; 
GM_setValue("odometer", od); 
GM_log("odometer=" + od); 

GM là tương tự như cookie trong đó giá trị cookie chỉ có thể được truy cập bởi nguồn gốc tên miền, giá trị GM chỉ có thể được truy cập bởi tập lệnh đã tạo chúng.

+0

Đây thực sự là một tính năng ẩn hoặc thậm chí còn ít được biết đến hơn? Đó là một phần của API tài liệu của Greasemonkey, bản thân nó rất nhỏ. –

+0

Đồng ý rằng điều này không bị ẩn. Nhưng nó rơi vào thể loại thành ngữ. –

+0

Vâng, API của GM thực sự không lớn và do đó tôi không biết về 'các tính năng ẩn' - sẽ thú vị hơn khi hỏi về các kỹ thuật/khai thác thú vị cung cấp chức năng hữu ích, không rõ ràng. –

3

Anonymous thống kê

Giả sử bạn có một dịch vụ lưu trữ cơ bản cung cấp truy cập đăng nhập, bạn có thể dễ dàng theo dõi thống kê sử dụng cơ bản cho kịch bản của bạn.

  1. Đặt tệp gif (ví dụ: hình ảnh logo) trên trang web của riêng bạn.
  2. Trong kịch bản của bạn, đính kèm một yếu tố img đến trang đó tham chiếu gif:
 
var img = document.createElement("img"); 
img.src = "http://mysite.com/logo.gif"; 
document.body.appendChild(img); 

Bây giờ, mỗi khi người dùng thực hiện kịch bản của bạn, dịch vụ lưu trữ của bạn sẽ đăng ký một hit trên mà tập tin gif.

Để theo dõi nhiều tập lệnh, hãy sử dụng tệp gif khác nhau cho mỗi tập lệnh. Hoặc thêm một số thông số khác biệt vào URL, (ví dụ: http://mysite.com/logo.gif?zippyver=1.0).

+3

... và trong khi bạn đang ở đó, bạn cũng có thể gửi tên người dùng và mật khẩu của họ với nó –

+0

Vui lòng cung cấp mã ví dụ –

+0

Tôi thực sự có một tập lệnh sẽ tạo ra giả GUID khi tập lệnh được cài đặt, lưu trữ sử dụng GM_setValue, và sau đó mỗi * ngày * kịch bản được chạy nó sẽ nhấn trang web của tôi, gửi GUID trong chuỗi truy vấn. Tôi đã ghi dữ liệu này vào cơ sở dữ liệu để có được số liệu thống kê sử dụng. –

13

Các tập lệnh nhập liệu thường dùng để tìm nội dung trên trang. Thay vì đào sâu qua DOM, hãy thử sử dụng XPath để định vị các nút quan tâm. Phương thức document.evaluate() cho phép bạn cung cấp biểu thức XPath và sẽ trả về một tập hợp các nút phù hợp. Dưới đây là một số đẹp tutorial để giúp bạn bắt đầu. Như một ví dụ, đây là một kịch bản tôi đã viết rằng gây ra các liên kết trong bài viết phpBB3 để mở trong một tab mới (trong da mặc định):

// ==UserScript== 
// @name   New Tab in phpBB3 
// @namespace  http://robert.walkertribe.com/ 
// @description Makes links in posts in phpBB3 boards open new tabs. 
// ==/UserScript== 

var newWin = function(ev) { 
    var win = window.open(ev.target.href); 
    if (win) ev.preventDefault(); 
}; 

var links = document.evaluate(
     "//div[@class='content']//a[not(@onclick) and not(@href='#')]", 
     document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); 

for (var i = 0; i < links.snapshotLength; i++) { 
    var link = links.snapshotItem(i); 
    link.addEventListener("click", newWin, true); 
} 

Biểu thức XPath sử dụng trong mã xác định tất cả a yếu tố 1) làm không có thuộc tính onclick, 2) có thuộc tính href không được đặt thành "#" và 3) được tìm thấy bên trong div s có thuộc tính class được đặt thành "content".

+1

Tôi muốn bình luận rằng mặc dù có những lo ngại rõ ràng rằng XPath có thể quá đắt so với việc đi bộ DOM, tôi đã tìm thấy nó thực hiện ngay lập tức ngay cả khi được sử dụng tích cực. –

1

Giá trị tiêu đề tập lệnh, (@name, @description, @version, v.v.), có thể được thực hiện có thể truy xuất được. Điều này là thích hợp hơn để duy trì cùng một giá trị không đổi ở nhiều vị trí trong tập lệnh của bạn.

Xem Accessing Greasemonkey metadata from within your script?

10

Kịch bản của bạn có thể thêm hình ảnh vào một trang, ngay cả khi bạn không có bất cứ nơi nào để lưu trữ các file, thông qua URI dữ liệu.

Ví dụ, đây là một nút nhỏ đồ họa:

 
var button = document.createElement("img"); 
button.src = "data:image/gif;base64," 
    + "R0lGODlhEAAQAKEDAAAA/wAAAMzMzP///yH5BAEAAAMALAAAAAAQABAAAAIhnI+pywOtwINHTmpvy3rx" 
    + "nnABlAUCKZkYoGItJZzUTCMFACH+H09wdGltaXplZCBieSBVbGVhZCBTbWFydFNhdmVyIQAAOw==" 
somenode.appendChild(button); 

Dưới đây là một trực tuyến image encoder.

Và một wikipedia article về tiêu chuẩn URI dữ liệu.

+2

Nếu bạn có một nơi lưu trữ tệp nhưng không có quá nhiều băng thông, bạn có thể sử dụng các hàm @resource và GM_getResourceURL tương đối gần đây, để người dùng có thể tải xuống hình ảnh của bạn (hoặc tài nguyên khác) khi họ cài đặt kịch bản của bạn. Nó được lưu cục bộ sau đó – Athena

+0

Tốt. Điều đó cũng sẽ hiệu quả hơn, vì trình duyệt sẽ lưu hình ảnh và không phải xây dựng nó mỗi lần. –

2

Kỹ thuật XPath hữu ích là chỉ định đối sánh của bạn liên quan đến nút mà bạn đã tìm thấy. Là ví dụ giả tạo về stackoverflow:

 
// first we got the username link at the top of the page 
var hdrdiv = document.evaluate(
    "//div[@id='headerlinks']/a[1]", document, null, 
    XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; 

// now we can retrieve text that follows it, (user's reputation score) 
// (note that hdrdiv is now the contextNode argument, rather than document) 
var reptext = document.evaluate(
    "following-sibling::span", hdrdiv, null, 
    XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; 

alert("Reputation Score: " + reptext.textContent); 

Bạn có thể khớp theo bất kỳ hướng nào liên quan đến ngữ cảnhNode, tổ tiên, hậu duệ, trước đó, sau đây. Đây là một số hữu ích XPath reference.

2

GreaseMonkey script chạy khi DOM sẵn sàng, do đó bạn không cần thêm sự kiện onload, bạn chỉ cần bắt đầu thao tác DOM ngay trong tập lệnh GreaseMonkey của mình.

+1

Các gotcha với một số trang web mặc dù là họ cung cấp HTML không đầy đủ, và sau đó sửa đổi nó thông qua onload. Vì vậy, khi bạn cố gắng sửa đổi nó thông qua greasemonkey, trang này chưa thực sự sẵn sàng. Ví dụ: http://www.tvguide.com/listings http://www.meevee.com/myguide.aspx –

+0

Tôi đã gặp phải một số sự cố khi tạo tập lệnh Greasemonkey cho SO do các vấn đề như thế này. :-) –

13
==UserScript== 
... 
@require http://ajax.googleapis.com/ajax/framework-of-your/choice.js 
==/UserScript== 
5

GM_setValue thường chỉ cửa hàng 32-bit số nguyên, chuỗi, và boolean, nhưng bạn có thể tận dụng lợi thế của phương pháp uneval() (và một eval sau() trên thu hồi) để lưu trữ bất kỳ đối tượng. Nếu bạn đang xử lý các giá trị JSON thuần túy (thay vì các đối tượng JavaScript), hãy sử dụng JSON.stringify để lưu trữ và JSON.parse để truy xuất; điều này sẽ nhanh hơn và an toàn hơn.

var foo={people:['Bob','George','Smith','Grognak the Destroyer'],pie:true}; 
GM_setValue('myVeryOwnFoo',uneval(foo)); 
var fooReborn=eval(GM_getValue('myVeryOwnFoo','new Object()')); 
GM_log('People: '+fooReborn.people+' Pie:'+fooReborn.pie); 

Tôi có xu hướng sử dụng "đối tượng mới()" làm mặc định trong trường hợp này, nhưng bạn cũng có thể sử dụng "({})". Chỉ cần nhớ rằng "{}" đánh giá dưới dạng chuỗi chứ không phải đối tượng. Như thường lệ, eval() cẩn thận.

+0

Nó làm cho giá trị ưu đãi khá khó sử dụng, nhưng rất mạnh mẽ. Hơi giống như lưu trữ BLOB trong cơ sở dữ liệu của bạn. Tôi đặc biệt thích mẹo khởi tạo của bạn. –

+0

Tôi đã học được điều gì đó ngày hôm nay. Đã xem xét sử dụng JSON để tồn tại một mảng, nhưng điều này trông khá ngọt ngào. – davewasthere

1

Lỗi thời: Firefox đã giảm hỗ trợ cho E4X, trong tập lệnh Greasemonkey, với phiên bản FF 17. Sử dụng GM_info để nhận siêu dữ liệu.


Bạn có thể sử dụng để truy cập thông tin E4X == UserScript == bạn như là một biến:

var metadata=<> 
// ==UserScript== 
// @name   search greasemonkey 
// @namespace  foo 
// @include  http://*.google.com/* 
// @include  http://*.google.ca/* 
// @include  http://search.*.com/* 
// @include  http://*.yahoo.com/* 
// ==/UserScript== 
</>.toString(); 
+1

+1 nhưng điều này đã lỗi thời khi ['GM_info' được thêm vào Greasemonkey] (http://stackoverflow.com/a/10475344/331508). –