2013-08-16 24 views
8

Próbuję selektywnie wyłączyć window.location, używając Greasemonkey, na początku dokumentu.Zmiana prototypu window.location, aby wyłączyć niektóre przekierowania?

Nie chcę całkowicie wyłączać javascript, po prostu wyłącz niektóre przekierowania wykonywane przy pomocy javascript. Wyglądają tak:

window.location = "unwanted url"; 
+1

Dlaczego chcesz to zrobić? –

+0

W jaki sposób przekierowania są wykonywane, *** dokładnie ***? Istnieje co najmniej 5 możliwych sposobów. –

+0

@brock, window.location = urltoredirect; (at) crazy Chcę zatrzymać niektóre przekierowania bez wyłączania javascript ... – affiszervmention

Odpowiedz

4

Nie można zmienić prototyp window.location, bo to „rodzimy właściwość "z window i jest to not configurable.

Na Firefox (Greasemonkey), jeśli starają się zmienić to wtedy pojawiają się błędy takie jak:

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

i

Error: Permission denied to shadow native property

... w zależności od sposobu próbować go. Inne przeglądarki dają podobne błędy.


Aby zablokować tego rodzaju relokację, należy ingerować w javascript strony w zależności od przypadku.

Aby uzyskać ogólne podejście do Firefoksa, zobacz stronę "Stop execution of Javascript function (client side) or tweak it". Chociaż może być znacznie łatwiejsze, w zależności od dokładnego kodu strony docelowej.

+0

w porządku, działa to, gdy jest , ale co z ? Czy istnieje sposób, aby to także zatrzymać? – affiszervmention

+0

Tak, [checkForBadJavascripts() ] (https://gist.github.com/BrockA/2620135) ma tryb, który to robi. Lub możesz po prostu użyć Adblock do zablokowania tego dokładnego adresu URL skryptu. –

4

Nie sądzę, że to możliwe.

  • Nie można nadpisać właściwości lub metody na window.location (nie cicho)
  • nie można przedefiniować swój prototyp z location.__proto__ = Something.prototype
  • location.constructor.prototype jest w zasadzie Object.prototype
  • konstruktor naprawdę nie robić nic (np. utwórz atrybuty lub metody)
  • nie działa w trybie cichym
  • Object.defineProperty podać y błąd jak, TypeError: Cannot redefine property: href
  • delete window.location i delete window.location.href nic nie robić

jestem z pomysłów ...

+0

To jest do bani! Wydaje się, że nic się nie zmieniło w 2016 roku :-( –

-1

dość późno, ale można to zrobić po prostu bez usuwania całego skryptu z Object.prototype.watch:

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

"TypeError: nie można oglądać obiektów Proxy klasy innej niż rodzime" – user2867288

+0

nie może oglądać okna ani innych ścieżek do lokalizacji – matthewdaniel

+0

Ta funkcja jest zaimplementowana tylko w Gecko jako op. Pojawił się błąd w Firefoksie od 23 do 27, który powoduje ten typ błędu, ale został naprawiony. –