6

Tôi đã tạo tiện ích mở rộng của Chrome sử dụng phím nóng [Alt] + [0 ... 9] chỉ để khám phá facebook sử dụng cùng một phím nóng. Có cách nào có thể mở rộng của tôi có thể vô hiệu hóa phím nóng của facebook để lửa của tôi một mình? Tôi khá chắc chắn tôi đã xác định được mã facebook sử dụng để thực hiện của họ [Alt] + [0 ... 9] phím nóng:Làm thế nào để vô hiệu hóa các phím nóng facebook với phần mở rộng của Chrome?

document.documentElement.onkeydown=function(a){a=a||window.event;var b=a.target||a.srcElement;var c=a.keyCode==13&&!a.altKey&&!a.ctrlKey&&!a.metaKey&&!a.shiftKey&&CSS.hasClass... 

Đây là trong một kịch bản gọi từ người đứng đầu của tài liệu gốc. Tôi đã thử những điều sau đây để vô hiệu hóa chúng:

//contents script: 
$().ready(function() { 
    document.documentElement.onkeydown = ''; 
}); 

và thậm chí

$().ready(function() { 
    document.documentElement.onkeydown = function(e){}; 
}); 

Tôi đoán thêm rằng lý do không ai trong số những nỗ lực làm việc là vì mặc dù Chrome kịch bản nội dung mở rộng chia sẻ một DOM với bất kỳ trang web mà họ chạy, có lẽ họ không chia sẻ môi trường mã hóa? Bất kỳ cái nhìn sâu sắc sẽ được đánh giá cao!

Trả lời

4

Trực giác của bạn là chính xác, JavaScript chạy từ tập lệnh nội dung như một phần của Tiện ích mở rộng của Chrome được chạy trong hộp cát không có quyền truy cập vào JavaScript được thực thi trong trang chứa.

mỗi sự Chrome doc on Content Scripts:

However, content scripts have some limitations. They cannot: 
* Use chrome.* APIs (except for parts of chrome.extension) 
* Use variables or functions defined by their extension's pages 
* Use variables or functions defined by web pages or by other content scripts 

Trước hết, tôi sẽ khuyên bạn nên xem xét các phím tắt khác nhau. Việc ghi đè chức năng của các phím tắt hiện tại cho tiện ích mở rộng của riêng bạn có thể mang đến trải nghiệm người dùng chói tai cho người đang mong đợi phím tắt Facebook. Hãy tưởng tượng nếu tiện ích mở rộng vượt qua các phím tắt ctrl-c và ctrl-p là một phần của HĐH để sao chép và dán - tôi nghĩ bạn sẽ có một số người dùng khó chịu có thể xóa thứ đã thay đổi hành vi mà họ đã học trước đó.

Tuy nhiên, nếu bạn đang van lơn, thì đây là một cách giải quyết để nạp JavaScript mà sẽ thực hiện trong bối cảnh của trang có chứa:

Edit: cập nhật mỗi bình luận để tham khảo JS nộp trong plugin thay vì một được lưu trữ trên web

Trước tiên, bạn sẽ cần phải tạo tệp JavaScript trong plugin chrome của mình: override-fb-hotkeys.js. Trước tiên, bạn sẽ cần lưu trữ tệp JavaScript ở đâu đó trên web có chứa tập lệnh mà bạn muốn thực thi trong trang, giả sử bạn lưu trữ nó tại: http://mysite.com/override-fb-hotkeys.js.

Sau đó, từ kịch bản nội dung của bạn, bạn có thể chèn một thẻ script vào DOM tham chiếu đến tập tin JavaScript của bạn, một cái gì đó như thế này:

var script = document.createElement('script'); 
    script.setAttribute("type", "text/javascript"); 
    script.setAttribute("async", true); 
    script.setAttribute("src", chrome.extension.getURL("override-fb-hotkeys.js")); //Assuming your host supports both http and https 
    var head = document.head || document.getElementsByTagName("head")[0] || document.documentElement; 
    head.insertBefore(script, head.firstChild) 

JavaScript sau đó sẽ được lấy và thực hiện trong bối cảnh trang chứa, không phải mã hộp cát từ plugin Chrome.

+0

Cảm ơn vì điều này. Điều này thực sự là sâu sắc! Tôi đã tìm thấy không cần phải lưu trữ trên một trang web khác vì nó hoạt động: 'script.setAttribute (" src ", chrome.extension.getURL (" override-fb-hotkeys.js "));' tuy nhiên mã tài liệu '. documentElement.onkeydown = function (e) {}; 'bên trong tệp được tiêm không vô hiệu hóa các phím tắt fb để có thêm trợ giúp nào được hoan nghênh! –

+0

Bạn cần phải đảo ngược kỹ thuật mã trên trang Facebook để xác định cách các sự kiện quan trọng được chụp và xử lý và sau đó ghi đè lên chức năng đó. Tôi nhìn một chút nhưng không có gì nhảy ra ngoài. Tôi đã nhận thấy rằng khi tôi gỡ bỏ phần tử có id "blueBarHolder" (toàn bộ thanh trên cùng) thì các phím nóng không hoạt động. –

+0

Xin chào, tôi muốn hỏi bạn vì bạn dường như biết nội dung. Bạn có biết nếu có cách giải quyết thông minh đơn giản chỉ cần vô hiệu hóa các phím tắt trong Facebook trên Chrome? Tôi không thể đứng thực tế là L giống như (tôi sử dụng ctrl + l VERY thường xuyên để đi đến nav bar). Giống như, ngay cả một dòng lệnh đơn giản cũng sẽ giúp – Tom

8

Tập lệnh nội dung của Chrome được thực thi trong môi trường Hộp cát [source]. Không có cách trực tiếp để giao tiếp với đối tượng toàn cầu (window).

Một điểm yếu phổ biến khác là nhà phát triển quên cách/khi tập lệnh được tiêm.

  • Theo mặc định, tập lệnh được tiêm tại một điểm gọi là "document_idle". Tại thời điểm này, tài liệu không bận (DOMContentLoaded đã kích hoạt, window.onload có thể hoặc có thể chưa kích hoạt).
  • Do đó, các chức năng trong tập lệnh có thể được ghi đè ngay lập tức sau khi khai báo.

Để tiêm một kịch bản nhỏ, tôi khuyên bạn nên thêm mã trực tiếp đến Script Nội dung:

var actualCode = '/* Code here (see below for inspiration) */'; 

var script = document.createElement('script'); 
script.appendChild(document.createTextNode(actualCode)); 
(document.head || document.documentElement).appendChild(script); 
script.parentNode.removeChild(script); 

Nếu bạn muốn chắc chắn rằng phương pháp này sẽ không được ghi đè, bạn có thể sử dụng Object.defineProperty, để xác định thuộc tính không thể thay đổi:

Object.defineProperty(document.documentElement, 'onkeydown', { 
    value: function() {}, 
    writable: false,  /* Cannot be overwritten, default false */ 
    configurable: false, /* Cannot be deleted, or modified */ 
    enumerable: true  /* Does not really matter. If true, it's visible in 
          a for-loop. If false, it's not*/ 
}); 

Phương pháp được đề cập trước đây được hỗ trợ trong Firefox 4 trở lên và ít nhất là Chrome 5+. Nếu bạn muốn cũng để hỗ trợ Firefox 2+ và Chrome 1+, bạn có thể chơi với __defineSetter__, để ngăn chặn onkeydown từ được xác định:

document.documentElement.__defineSetter__('onkeydown', function(){}); 
+0

Và nếu mã facebook ghi đè Object.defineProperty thì sao? – Pacerier

+0

@Pacerier Nếu bạn chạy mã với 'run_at; "document _start" ', thì không thể thực hiện được. –

+0

Có thể sử dụng 2 phần mở rộng khác để 'document_start' không? – Pacerier

1

Đây là cách bạn có thể làm điều đó bằng jQuery

Hủy bỏ tất cả phím tắt cho bất kỳ trang web nào:

$('[accessKey]').attr('accessKey','')