2013-08-16 43 views
8

Tôi đang cố gắng vô hiệu hóa chọn lọc window.location, sử dụng Greasemonkey, ở đầu tài liệu.Thay đổi nguyên mẫu window.location để vô hiệu hóa một số chuyển hướng nhất định?

Tôi không muốn tắt hoàn toàn javascript, chỉ cần tắt một số chuyển hướng được thực hiện bằng javascript. Chúng trông giống như sau:

window.location = "unwanted url"; 
+1

Tại sao bạn muốn làm điều này? –

+0

Các chuyển hướng được thực hiện như thế nào, *** chính xác ***? Có ít nhất 5 cách có thể. –

+0

@brock, window.location = urltoredirect; (at) crazy Tôi muốn dừng một số chuyển hướng mà không tắt javascript ... – affiszervmention

Trả lời

4

Bạn không thể thay đổi mẫu window.location, bởi vì đây là một "bản địa thuộc tính "của window và là not configurable.

Trên Firefox (Greasemonkey), nếu bạn cố gắng ghi đè này thì bạn sẽ nhận được lỗi như:

TypeError: can't redefine non-configurable property 'location'

Error: Permission denied to shadow native property

... tùy thuộc vào cách bạn cố gắng nó. Các trình duyệt khác cung cấp các lỗi tương tự.


Để chặn loại di chuyển này, bạn cần phải can thiệp vào javascript của trang trên cơ sở từng trường hợp.

Xem "Stop execution of Javascript function (client side) or tweak it" cho một cách tiếp cận chung mà làm việc trong Firefox. Mặc dù nó có thể dễ dàng hơn nhiều, tùy thuộc vào mã chính xác của trang đích của bạn.

+0

được, điều này hoạt động khi đó là , nhưng còn thì có cách nào để ngăn chặn không? – affiszervmention

+0

Có, [checkForBadJavascripts() ] (https://gist.github.com/BrockA/2620135) có chế độ thực hiện điều đó Hoặc bạn chỉ có thể sử dụng Adblock để chặn URL tập lệnh chính xác đó. –

4

Tôi không nghĩ là có thể.

  • Bạn không thể ghi đè lên các thuộc tính hoặc các phương pháp trên window.location (không âm thầm)
  • bạn không thể xác định lại nguyên mẫu của nó với location.__proto__ = Something.prototype
  • location.constructor.prototype về cơ bản là Object.prototype
  • các nhà xây dựng không thực sự làm bất cứ điều gì (như tạo thuộc tính hoặc phương pháp)
  • __definesetter__ không hoạt động âm thầm
  • Object.defineProperty cung cấp s một lỗi như thế, TypeError: Cannot redefine property: href
  • delete window.locationdelete window.location.href không làm bất cứ điều gì

tôi ra khỏi ý tưởng ...

+0

Điều này thật tệ! Dường như không có gì thay đổi trong năm 2016 :-( –

-1

khá quá muộn nhưng bạn có thể làm điều đó đơn giản mà không cần tháo toàn bộ kịch bản với Object.prototype.watch:

window.watch('location', function(attr ,_ , target){ 
    if(target.indexOf('unwanted url') !== -1)return '#'; 
}); 
+0

"LoạiError: không thể xem các đối tượng của Proxy lớp không phải là bản địa" – user2867288

+0

không thể xem cửa sổ hoặc đường dẫn khác đến vị trí – matthewdaniel

+0

Chức năng này được thực hiện chỉ trong Gecko như các op hỏi.Và có một lỗi trong Firefox 23-27 nguyên nhân lỗi kiểu này nhưng hiện đã được sửa. –