2010-11-17 44 views
9

Nếu một hàm javascript được khai báo ẩn danh có cách nào để ghi đè lên hoặc một phần của hàm đó không?Ghi đè một phần của hàm ẩn danh google.com

Tôi đang cố gắng ngừng tìm kiếm tức thì của google.com khỏi chiếm đoạt các phím mũi tên lên và xuống để di chuyển qua thứ hạng tìm kiếm của bạn. Tôi đã xác định những gì tôi tin là phần mã có vấn đề. Mã khóa 38 và 40 dành cho các phím xuống và lên.

if (b == 40) aa(f); 
else if (b == 38) aa(j); 
else if (b == 37 || b == 39) if (!ca(b == 39)) return f; 
a.preventDefault && a.preventDefault(); 
return a.returnValue = j 

Vấn đề là đây là một phần của hàm có tên Sb = hàm (a) {} nằm bên trong khoảng ba nghìn hàm ẩn danh dòng. Có một câu hỏi tương tự được đăng trên SO here rằng tác giả đã kết thúc việc làm theo một cách hacky không áp dụng cho tôi. Tôi nhận ra tôi có thể tắt tìm kiếm tức thời, nhưng tôi thích nó, tôi không thể chịu được rằng các phím mũi tên của tôi không hoạt động nữa.

SOLUTION:

tôi đã kết thúc viết một chrome extension để trở lại lên/xuống mũi tên chức năng chìa khóa để di chuyển. Tôi đã sử dụng đoạn mã sau. Cảm ơn Raze và Mofle.

if (event.keyCode == 40 || event.keyCode == 38) { 
    event.cancelBubble = true; 
    event.stopPropagation();    
    return false; 
} 
+0

Làm thế nào là nó gắn liền? Liên kết? –

+0

Hành vi hiện tại chính xác là gì? và đó là mong muốn? bạn có thể liên kết với một ví dụ không ?? – jcane86

+0

@ jcane86 - về cơ bản tìm kiếm tức thì google ghi đè lên các phím mũi tên lên và xuống. Những trang này thường cuộn trang. Thay vào đó, google đã chọn để làm cho các mũi tên này nhảy xuống danh sách kết quả. Tôi không sử dụng chuột, vì vậy hãy nhanh chóng quét trang bằng cách nhấn mũi tên xuống hoạt động tốt nhất. Bây giờ tôi phải nhấn mũi tên xuống 8 lần để xem kết quả ở cuối màn hình. – mrtsherman

Trả lời

3

Bạn không thể ghi đè chức năng ẩn danh bên trong một chức năng ẩn danh khác. Bạn không thể thay đổi các phần của bất kỳ hàm hiện có nào, bạn sẽ phải tạo một hàm mới và đính kèm nó khi cần, mặc dù bạn có thể lấy nguồn của hàm, thao tác và tạo hàm mới từ nguồn.

Tôi có hai đề xuất cho vấn đề này ở đây, không liên quan đến việc xác định lại các chức năng.

  1. Thêm một người biết lắng nghe sự kiện cho các đầu vào hộp văn bản ở giai đoạn chụp, và hủy bỏ sự kiện này nếu keyCode là UP hoặc DOWN
  2. Tạo một hộp văn bản overlayed nơi bạn thực sự nhập văn bản, và vượt qua trên tất cả các sự kiện ngoại trừ Phím UP và DOWN để hộp văn bản thực tế bên dưới.
+0

@Raze - Tôi sẽ thử những Raze này. Ý tưởng tuyệt vời. – mrtsherman

+0

Và vui lòng cập nhật về việc liệu nó có hoạt động hay không @mrtsherman – Raze

+0

Tại sao bạn không nhận được 150 tiền thưởng đầy đủ của tôi? Tôi đánh dấu bạn là câu trả lời đúng. – mrtsherman

0

Remove tất cả người nghe sự kiện từ nguyên tố này bằng cách thay thế nó với một bản sao của chính nó (node.parentNode.replaceChild(node.cloneNode(true), node)) và sau đó áp dụng một phiên bản sửa đổi bằng tay mã JavaScript của Google (document.documentElement.appendChild(document.createElement("script")).src="location of your modified script").

+0

Cảm ơn bạn vì ý tưởng này, nhưng khi google sửa đổi js của họ, tôi không muốn phải liên tục cập nhật phiên bản đã sửa đổi theo cách thủ công của mình. – mrtsherman

-1

Thử sử dụng lõi cứng thay thế trước khi chức năng được thực thi.

document.body.innerHTML = document.body.innerHTML.replace(/if (b == 40) aa(f);/,'').replace(/else if (b == 38) aa(j);/,'').replace(/else if (b == 37 || b == 39) if (/a.preventDefault && a.preventDefault();/,'').replace(/return a.returnValue = j/,'') 

Có lẽ nó sẽ làm việc

+0

Ý tưởng hay, nhưng tôi không nghĩ rằng điều này sẽ hiệu quả. Javascipt có trong tệp js chứ không phải trong phần thân. – mrtsherman

+0

nếu đúng như vậy. Câu trả lời của tôi không phải là câu trả lời cho điều này ... – brunoais

2

Bạn có thể dễ dàng làm điều đó bằng cách bắt mũi tên sự kiện quan trọng và ngăn ngừa chúng từ bọt.

window.addEventListener('keydown', function(e) { 
    e.stopPropagation(); 
}, true); 

Tested và hoạt động trên google.com

+0

event.cancelBubble = true; event.stopPropagation(); Tôi đã phân loại nó dựa trên phản hồi của Raze. – mrtsherman

+0

cancelBubble chỉ là IE và được gỡ xuống. Vì vậy, trong trường hợp của bạn, nó không cần thiết. –

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