2015-08-04 20 views
18

GreaseSpot page on metadata blocks nói rằng hai số này rất giống nhau nhưng @match "đặt các quy tắc chặt chẽ hơn về ý nghĩa của ký tự *." GreaseSpot sau đó tiếp tục đến teach sử dụng @include, nhưng ví dụ của Chrome như this thường dường như sử dụng @match và cho biết rằng @include chỉ được hỗ trợ cho mục đích tương thích; @match được ưu tiên.Sự khác nhau giữa @include và @match trong userscripts là gì?

Apparently, @include google.* có thể chạy trên google.evil.com trong khi @match google.* không thể.
Ví dụ đó không đủ để thực sự thấy cách các ký tự đại diện hoạt động khác nhau giữa hai loại này và các giải thích tốt hơn được tìm kiếm trong các câu trả lời ở đây.

Tập lệnh GreaseMonkey mới (Firefox) sử dụng @include theo mặc định trong khi các tập lệnh TamperMonkey mới (ví dụ: Chrome) sử dụng @match theo mặc định.

Sự khác biệt chính xác giữa hai yếu tố này là gì?

Ví dụ: mỗi người xử lý ký tự đại diện như thế nào?
Có sự khác biệt về khả năng tương thích giữa các trình duyệt không?
Lý do ai đó có để lựa chọn sử dụng cái này với người khác?

+0

Chỉ cần sử dụng bao gồm mọi người khác. Tôi đã làm điều đó trong nhiều năm và không có vấn đề gì. – MortenMoulder

Trả lời

10

Bạn không thể sử dụng cụm từ thông dụng với @match, trong khi bạn can với @include.

Tuy nhiên, @include sẽ cung cấp cho người dùng cảnh báo bảo mật đáng sợ hơn về tập lệnh áp dụng cho tất cả các trang web.

Điều này mặc dù biểu thức @include cho phép bạn hạn chế hơn về các trang web mà tập lệnh áp dụng (ví dụ: chỉ định một phần của URL bằng số sử dụng đoạn regex "[0-9] +", hoặc sử dụng "^ https?: //" để áp dụng cho tập lệnh chỉ hai sơ đồ đó, thay vì toán tử tổng hợp phi regex chung * được sử dụng cho mỗi trường hợp trong @match, điều này làm cho tập lệnh áp dụng rộng hơn) .

+2

Ví dụ về ký tự đại diện '@ match' an toàn hơn ký tự đại diện' @ include' có thể tìm thấy trong [Diễn đàn Tampermonkey] (https://forum.tampermonkey.net/viewtopic.php?t=466): '@include http * : // *. biniok.net' cho phép http: //evil.de#biniok.net, '@match http *: // *. biniok.net' không. –

+0

@FranklinYu Không phải là điều này chỉ vì '@ include' được hiểu là regex, và regex đặc biệt này cho phép một cách rõ ràng là cho phép evil.de # biniok.net? '/ *' có nghĩa là "không hoặc nhiều hơn'/'ký tự", trong khi '.' có nghĩa là" ký tự bất kỳ ". Thay đổi nó thành '@include^https?: //.*biniok \ .net $' sẽ làm cho nó an toàn. – dkasak

+0

@dkasak '@include http *: // *. Biniok.net' được hiểu là globs. Để được hiểu là cụm từ thông dụng, nó phải là '@include/http *: // *. Biniok.net /'. Ngoài ra, '@include/http *: // *. Biniok.net /' không khớp với http://evil.de/#biniok.net; nó khớp với một cái gì đó như 'htt:/1biniok2net' hoặc' httppppp: ////// xbiniokynet' –

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