Firebug dla Firefoksa ma fajną funkcję o nazwie „Przerwij przy zmianie właściwości”, w której mogę oznaczyć dowolną właściwość dowolnego obiektu i zatrzyma wykonywanie JavaScript tuż przed zmianą.
Próbuję osiągnąć to samo w Google Chrome i nie mogę znaleźć funkcji w debugerze Chrome. Jak to zrobić w Google Chrome?
javascript
debugging
firefox
google-chrome
firebug
Arsen Zahray
źródło
źródło
Odpowiedzi:
Jeśli nie masz nic przeciwko mieszaniu się ze źródłem, możesz przedefiniować właściwość za pomocą akcesorium.
źródło
console.watch(obj, 'someProp')
.window.location
ze względów bezpieczeństwa.obj._someProp = obj.someProp;
, wydaje się to niezwiązane z tym, co próbujesz zarchiwizować (prawdopodobnie dlatego, że czegoś brakuje)Edycja 2016.03:
Object.observe
została wycofana i usunięta w przeglądarce Chrome 50Edycja 2014.05:Object.observe
została dodana w Chrome 36Chrome 36 jest dostarczany z natywną
Object.observe
implementacją, którą można wykorzystać tutaj:Jeśli chcesz to tylko tymczasowo, powinieneś przechowywać callback w zmiennej i wywołać
Object.unobserve
po zakończeniu :Zwróć uwagę, że podczas używania
Object.observe
nie zostaniesz powiadomiony, gdy przydział niczego nie zmienił, np. Jeśli napisałeśmyObj.a = 1
.Aby zobaczyć stos wywołań, musisz włączyć opcję „async call stack” w Dev Tools:
Oryginalna odpowiedź (2012.07):
console.watch
Szkic jak sugeruje @katspaugh:Wezwanie:
Zgodność:
debugger
(czy jest to kwestia konfiguracji? proszę mnie w takim razie poprawić), aleconsole.log
działają.Edytować:
Zauważ, że w Firefoksie
console.watch
już istnieje z powodu niestandardowego FirefoksaObject.watch
. Dlatego w Firefoksie możesz natywnie obserwować zmiany:Jednak wkrótce (koniec 2017 r.) Zostanie to usunięte .
źródło
oObj[sProp]
, ponieważ metoda pobierająca przeszłaby w nieskończoną rekurencję. Wypróbuj w Chrome, otrzymaszRangeError: Maximum call stack size exceeded
.async
wyboru jest tak złote w tym podejściu: html5rocks.com/en/tutorials/developertools/async-call-stackasync
checkboxem jak napisał @cnp, zobacz moją aktualizacjęObject.observe
jest przestarzała i wkrótce zostanie usunięta: patrz: chromestatus.com/features/6147094632988672Jest do tego biblioteka: BreakOn ()
Jeśli dodasz go do narzędzi deweloperskich Chrome jako fragment (źródła -> fragmenty -> kliknij prawym przyciskiem myszy -> nowy -> wklej to ) , możesz go użyć w dowolnym momencie.
Aby z niego skorzystać, otwórz narzędzia deweloperskie i uruchom fragment. Następnie, aby przerwać
myObject.myProperty
zmianę, wywołaj to z konsoli programisty:Możesz również dodać bibliotekę do kompilacji debugowania projektu, aby nie trzeba było wywoływać
breakOn
ponownie za każdym razem, gdy odświeżasz stronę.źródło
Można to również zrobić za pomocą nowego serwera proxy obiektu którego celem jest dokładnie to: przechwytywanie odczytów i zapisów do obiektu opakowanego przez serwer proxy. Po prostu zawijasz obiekt, który chcesz obserwować, do Proxy i używasz nowego opakowanego obiektu zamiast oryginalnego.
Przykład:
Teraz użyj wrappedObject, w którym zamiast tego możesz podać originalObject i zbadać stos wywołań po przerwaniu.
źródło
set
musi zwrócić,true
aby nie zawiódł w innych przypadkach niż śledzone.źródło
Postanowiłem napisać własną wersję tego rozwiązania, zapisać go we fragmencie w Chrome DevTools i umieścić w IIFE, który powinien obsługiwać zarówno węzeł, jak i przeglądarki. Zmieniono także obserwatora, aby używał zmiennej zakresu zamiast właściwości obiektu, tak że nie ma możliwości kolizji nazw, a żaden kod wyliczający klucze nie „zobaczy” nowego utworzonego „klucza prywatnego”:
źródło
Chrome ma tę funkcję wbudowaną w najnowsze wersje https://developers.google.com/web/updates/2015/05/view-and-change-your-dom-breakpoints .
Więc koniec z niestandardowymi bibliotekami i rozwiązaniami, po prostu kliknij prawym przyciskiem myszy element DOM w inspektorze i wybierz „Przerwij” -> „modyfikacje atrybutów” i to wszystko.
źródło