Geliştirici Araçları kullanılarak Chrome'da bir düğme veya öğe tarafından hangi kodun çalıştırıldığını bulma


305

Chrome'u ve kendi web sitemi kullanıyorum.

İçeriden bildiklerim:

1 ) İnsanların bu turuncu görüntü düğmesini tıklayarak kaydolacağı bir formum var:

resim açıklamasını buraya girin

2 ) İnceliyorum ve hepsi bu: <img class="formSend" src="images/botoninscribirse2.png">

3 ) Kaynak kodun üstünde tonlarca kod kaynağı vardır. Düğmenin hangisini çağırdığını biliyorum çünkü kodladım:<script src="js/jquery2.js" type="text/javascript"></script>

4 ) Bu dosyada şunları bulabilirsiniz: $(".formSend").click(function() { ... });düğme tarafından tetiklenen şey (oldukça karmaşık bir form doğrulama ve gönderme yapmak için) ve istediğim şey , herhangi bir web sitesinde krom dev araçlarını kullanarak bunu bulabilmektir .

Elemanın nerede aradığını nasıl öğrenebilirim?

Dinleyiciler sekmesi benim için çalışmadı. Bu yüzden sonra bana güvenli bir bahis gibi görünen tıklama olay dinleyicilerini aramaya çalıştım ama ... orada hiç jquery2.jsyok (ve kodun hangi dosya olduğunu gerçekten bilemeyeceğim, bu yüzden tüm bunları kontrol ederek zaman kaybediyorum .. .):

resim açıklamasını buraya girin

Benim $(".formSend").click(function() { ... });içinde fonksiyon jquery2.jsdosyası yoktur.

Jesse açıklıyor neden :

"Son olarak, işlevinizin doğrudan tıklama olayı işleyicisine bağlı olmamasının nedeni, jQuery'nin bağlanan bir işlevi döndürmesidir. ."


Bazılarınızın önerdiği gibi, aşağıda bir cevapta çalışan yöntemleri topladım .


4
Genellikle Visual Eventyer imini kullanırım . Popüler kütüphaneler tarafından bağlanan tıklama olaylarını algılar ve sitenin olayların nereye bağlı olduğunu gösteren ve her olay için kod örnekleri ve kaynak konumlar veren bir yer paylaşımı oluşturur.
Kevin B

3
@DontVoteMeDown Ama bu tüm soruyu yener. Web sitesinde düzinelerce * .js dosyanız olduğunu varsayalım, düğmenin tetiklediği kodu jquery2.js içinde nasıl biliyorsunuz?
Carles Alcolea

1
Visual Event'in nasıl çalıştığını anlıyorum (BTW sayesinde), ancak bu düğmeyi tıkladığınızda, tarayıcınız ne çalıştırılacağını mükemmel bir şekilde biliyor , çünkü çalıştırıyor. Sadece dev araçlarıyla yapılamayacağından emin olmak istiyorum ve devam edeceğim.
Carles Alcolea

1
İyi soru, kesinlikle bu Chrome'un (veya Firefox) sahip olması gereken bir özellik olduğunu düşünüyorum
tomysshadow

1
Bu sorunun cevabını bulduysanız, lütfen cevap olarak ekleyin. Kendi sorunuzu cevaplamak büyük bir teşviktir, ancak sorunuzu düzenleyerek cevaplamak değildir.
Şapkalı Adam

Yanıtlar:


209

Alexander Pavlov'un cevabı istediğiniz şeye en yakın olanı.

JQuery'nin soyutlama ve işlevselliğinin yaygınlığı nedeniyle, etkinliğin etine ulaşmak için birçok çemberin atlanması gerekiyor. İşi göstermek için bu jsFiddle'ı kurdum .


1. Olay Dinleyici Kesme Noktasını Ayarlama

Bu konuda yakındınız.

  1. Chrome Geliştirme Araçları'nı (F12) açın ve Kaynaklar sekmesine gidin.
  2. Fare -> Tıklayın (yakınlaştırmak için tıklayın )
    Chrome Geliştirme Araçları -> Kaynaklar sekmesi -> Fare -> Tıklayın

2. düğmesini tıklayın!

Chrome Geliştirme Araçları, komut dosyası yürütmeyi duraklatır ve size bu küçük kodun güzel dolaştırmasını sunar:

Chrome Geliştirme Araçları, komut dosyası yürütülmesini duraklattı (yakınlaştırmak için tıklayın)


3. Görkemli kodu bulun!

Şimdi, buradaki hile , tuşa basarak taşınmamak ve ekranda bir göz tutmaktır.

  1. F11İstediğiniz kaynak kodu görünene kadar tuşuna (Adım Adım) basın
  2. Kaynak koda nihayet ulaşıldı
    • Yukarıda verilen jsFiddle örneğinde , istenen olay işleyiciye / işleve ulaşmadan önce F11 108 kez basmak zorunda kaldım
    • Kilometre süreniz, olayları bağlamak için kullanılan jQuery (veya çerçeve kitaplığı) sürümüne bağlı olarak değişebilir
    • Yeterli özveri ve zamanla, herhangi bir olay işleyiciyi / işlevi bulabilirsiniz

İstenen olay giderici / işlevi


4. Açıklama

Tam cevap ya da neden jQuery yaptığı soyutlama birçok katmanları geçer açıklamasına sahip değil - tüm önerebileceğim iş kod kullanımı yürüten tarayıcıdan uzak soyut yapmak için yaptığı iş .

İşte jQuery hata ayıklama sürümü ile bir jsFiddle (yani, küçültülmüş değil). İlk (küçültülmemiş) kesme noktasındaki koda baktığınızda, kodun birçok şeyi işlediğini görebilirsiniz:

    // ...snip...

    if ( !(eventHandle = elemData.handle) ) {
        eventHandle = elemData.handle = function( e ) {
            // Discard the second event of a jQuery.event.trigger() and
            // when an event is called after a page has unloaded
            return typeof jQuery !== strundefined && jQuery.event.triggered !== e.type ?
                jQuery.event.dispatch.apply( elem, arguments ) : undefined;
        };
    }

    // ...snip...

" Yürütme duraklatılır ve satır satır atlarsam " denemenizde bunu kaçırdığınızı sanmamın nedeni, Adım Girme yerine "Adım Aşma" işlevini kullanmış olmanız olabilir. İşte farkları açıklayan bir StackOverflow cevabı .

Son olarak, işlev nedeni değil jQuery bağlı alır bir işlev döndürdüğü için doğrudan tıklama olay işleyicisi bağlı olduğunu. jQuery'nin işlevi sırayla bazı soyutlama katmanlarından ve kontrollerden geçer ve orada bir yerde işlevinizi yürütür.


Vay be, sen ve @ Alexander-Pavlov tamamen haklısın, kaçırdım. Şimdi sadece tekrar denedim ve 132 F11 anahtar hit beni alır ! Şimdi mantıklı, ama sadece pratik değil. Yine de sorumu düzeltirim.
Carles Alcolea

@CarlesAlcolea Yup - kesinlikle pratik değil, ama imkansız değil. Ellerinde yeterli özveri ve zamana sahip olan herkes, derinden gizlenmiş ve küçülmüş olsa bile HTML ve JavaScript'te yapılan her şeyi bulabilir. Alexander Pavlov'un cevabını veya benimkini kabul edildiği gibi işaretlemekten çekinmeyin.
Jesse

1
evet, şimdi bitiriyorum. Bilginize, henüz bilmiyorsanız, küçültülmüş bir komut dosyasında aşağı sol kıvırcık kaşlı ayraçlar düğmesini ( i.imgur.com/ALoMQkR.png ) tıklarsanız , "güzelleştirir" ve hata ayıklama sırasında da çalışır.
Carles Alcolea

2014 itibariyle Chrome, yukarıdaki # 1'e olan ihtiyacı ortadan kaldıran Chrome Dev Araçları'na bir kara kutu özelliği yerleştirmiştir.
Brian

1
@Brian ve işte kara boks scriptlerini detaylandıran bir blog yazısı .
Cristian Diaconescu

157

1.Çözüm: Çerçeve kara kutulaması

Harika çalışıyor, minimal kurulum ve üçüncü taraflar yok.

Göre Chrome'un belgelerinde :

Bir komut dosyasını kara listeye aldığınızda ne olur?

Kütüphane kodundan atılan istisnalar duraklamaz ( İstisnalarda duraklat etkinse), Kütüphane koduna / dışına / adımına geçilmesi, Olay dinleyicisi kesme noktaları kütüphane kodunda kırılmaz, Hata ayıklayıcı, kütüphanede ayarlanan hiçbir kesme noktasında duraklamaz kodu. Sonuç olarak , üçüncü taraf kaynakları yerine uygulama kodunuzda hata ayıklayabilirsiniz .

Güncellenmiş iş akışı:
  1. Chrome Geliştirici Araçları'nı ( F12veya + + i) açın, ayarlara gidin (sağ üst veya F1). Solda " Blackboxing " adlı bir sekme bulun

resim açıklamasını buraya girin

  1. Hata ayıklama sırasında Chrome'un yok saymasını istediğiniz dosyaların RegEx desenini buraya koyarsınız . Örneğin: jquery\..*\.js(Glob desen / insan için: jquery.*.js)
  2. Birden çok desen içeren dosyaları atlamak isterseniz , boru karakterini kullanarak ekleyebilirsiniz |, örneğin: jquery\..*\.js|include\.postload\.js("veya bu desen" gibi davranır.) Veya "Ekle" düğmesiyle eklemeye devam edin.
  3. Şimdi aşağıda açıklanan Çözüm 3'e geçin .

Bonus ipucu! Kullandığım Regex101 düzenli (ama diğerleri vardır:) hızla benim paslı regex desenleri sınamak ve ben adım-adım regex debugger ile yanılıyorum nerede olduğunu öğrenmek için. Düzenli İfadelerde henüz "akıcı" değilseniz, bunları http://buildregex.com/ ve https://www.debuggex.com/ gibi yazmanıza ve görselleştirmenize yardımcı olan siteleri kullanmaya başlamanızı öneririm.

Kaynaklar panelinde çalışırken bağlam menüsünü de kullanabilirsiniz. Bir dosyayı görüntülerken, düzenleyiciyi sağ tıklatıp Blackbox Komut Dosyası'nı seçebilirsiniz. Bu, dosyayı Ayarlar panelindeki listeye ekler:

resim açıklamasını buraya girin


Çözüm 2: Görsel Olay

resim açıklamasını buraya girin

Sahip olmak için mükemmel bir araç :

Visual Event, DOM öğelerine eklenmiş olaylar hakkında hata ayıklama bilgileri sağlayan açık kaynaklı bir Javascript yer imidir. Görsel Etkinlik şunları gösterir:

  • Hangi öğelerin kendilerine eklenmiş olayları var
  • Bir öğeye iliştirilen olayların türü
  • Olayla çalıştırılacak kod tetiklenir
  • Ekli işlevin tanımlandığı kaynak dosya ve satır numarası (yalnızca Webkit tarayıcıları ve Opera)


Çözüm 3: Hata Ayıklama

Sayfanın herhangi bir yerinde tıkladığınızda veya DOM değiştirildiğinde ... ve bilinmesi faydalı olacak diğer JS kesme noktalarında kodu duraklatabilirsiniz . Sen uygulanmalıdır blackboxing bir kabus önlemek için burada.

Bu örnekte, düğmeyi tıkladığımda tam olarak neler olduğunu bilmek istiyorum.

  1. Geliştirici Araçları -> Kaynaklar sekmesini açın ve sağ taraftaki bul Event Listener Breakpoints:

    resim açıklamasını buraya girin

  2. Genişletin Mouseve seçinclick

  3. Şimdi öğeyi tıklayın (yürütme duraklamalıdır) ve şimdi kodda hata ayıklama yapıyorsunuz. Tüm kod basma işleminden geçebilirsiniz F11( Adım gir ). Veya yığındaki birkaç zıplamayı geri alın. Bir ton sıçrama olabilir


Çözüm 4: Balıkçılık anahtar kelimeleri

Dev Araçları etkinken, kod tabanının tamamını (tüm dosyalardaki tüm kodlar) + + Fveya:

resim açıklamasını buraya girin

ve #enviopartiyi başlatır diye düşündüğünüz etiket / sınıf / kimlik ne olursa olsun ve beklenenden daha hızlı bir yere gidebilirsiniz.

Bazen sadece bir imgsürü öğe değil, aynı zamanda kodun hangisini tetiklediğini de bilmiyor olabilirsiniz.


Bu biraz sizin bilginiz dışındaysa, Chrome'un hata ayıklama ile ilgili eğitimine göz atın .


Hiçbir yerde kara boks bulamadınız mı? Deneyin: chrome: // flags / # enable-devtools-deneyleri
ruuter

1
@CarlesAlcolea MUHTEŞEM !! Bu numara ile bana tonlarca zaman kazandın!
Prix

kimse görsel olayı çalıştırırken neden sayfa kendini yenilemek, böylece tüm bilgileri kaybeder biliyor?
Edu Castrillon

Çözüm 1 için, TAM KROM AYGIT AYARLARINA erişebilmek için en sağ köşedeki elipslere tıklamanız veya DevTools açıkken F1 tuşuna basmanız gerekir. Şimdi sol tarafta BlackBoxing sekmesini göreceksiniz. Zevk almak!
pensebien

1
Blackbox komut dosyalarının yeni en iyi yolunun inanılmaz derecede kolay olduğu anlaşılıyor. Kaynaklar panelinde bu dosyaya gidin ve dosyaya sağ tıklayın (soldaki liste öğesinde AÇIK değil, aslında dosyayı açın ve dosyaya sağ tıklayın), ardından "Bu betiği kara kutuya yerleştir" i seçin. İşte böyle!
Dan

17

Kulağa "... ve satır satır atlıyorum ..." kısmı yanlış geliyor. StepOver veya StepIn kullanıyor musunuz ve ilgili aramayı yanlışlıkla kaçırmayacağınızdan emin misiniz?

Bununla birlikte, hata ayıklama çerçeveleri tam da bu nedenle sıkıcı olabilir. Sorunu hafifletmek için "Çerçeve hata ayıklama desteğini etkinleştir" denemesini etkinleştirebilirsiniz . Mutlu hata ayıklama! :)


Bu mükemmel çalışıyor (ve sağ, ben kaçırılan , Sorumun ekleriz atlama). Ayrıca düzenli ifadeleri tekrar okumam için beni zorladı: P Teşekkürler.
Carles Alcolea

7

FindHandlersJS'yi kullanabilirsiniz

İşleyiciyi krom konsolunda yaparak bulabilirsiniz:

findEventHandlers("click", "img.envio")

Chrome konsolunda aşağıdaki bilgileri yazdırırsınız:

  • element
    Olay işleyicinin kayıtlı olduğu gerçek eleman
  • events
    İlgilendiğimiz etkinlik türü için jquery olay işleyicileri hakkında bilgi içeren dizi (ör. tıklama, değiştirme vb.)
  • handler
    Sağ tıklayarak ve İşlev tanımını göster'i seçerek görebileceğiniz gerçek olay işleyici yöntemi
  • seçici
    Temsilci seçili etkinlikler için sağlanan seçici. Doğrudan etkinlikler için boş olacaktır.
  • hedefler
    Bu olay işleyicinin hedeflediği öğelerle listele. Örneğin, belge nesnesine kaydedilen ve bir sayfadaki tüm düğmeleri hedefleyen yetkilendirilmiş bir olay işleyicisi için bu özellik sayfadaki tüm düğmeleri listeler. Bunları üzerine getirebilir ve kromda vurgulanmış olarak görebilirsiniz.

Daha fazla bilgi burada ve bu örnek sitedeki deneyebilirsiniz burada .


3

Bu çözüm için jQuery'nin veri yöntemine ihtiyaç vardır .

  1. Chrome konsolunu açın (jQuery yüklü herhangi bir tarayıcı çalışmasına rağmen)
  2. Çalıştırmak $._data($(".example").get(0), "events")
  3. İstenen olay işleyiciyi bulmak için çıktıyı inceleyin.
  4. "İşleyici" ye sağ tıklayın ve "İşlev tanımını göster" i seçin
  5. Kod, Kaynaklar sekmesinde gösterilir

$._data()jQuery'nin veri yöntemine erişiyor. Daha okunabilir bir alternatif olabilir jQuery._data().

Bu SO cevabı ile ilginç bir nokta :

JQuery 1.8'den itibaren, olay verileri artık veriler için "genel API" da bulunmuyor. Bu jQuery blog gönderisini okuyun . Şimdi bunun yerine şunu kullanmalısınız:

jQuery._data( elem, "events" ); elem bir jQuery nesnesi veya seçici değil, bir HTML Öğesi olmalıdır.

Lütfen bunun dahili, 'özel' bir yapı olduğunu ve değiştirilmemesi gerektiğini unutmayın. Bunu yalnızca hata ayıklama amacıyla kullanın.

JQuery'nin daha eski sürümlerinde, şu eski yöntemi kullanmanız gerekebilir:

jQuery( elem ).data( "events" );

Agnostik bir jQuery sürümü: (jQuery._data || jQuery.data)(elem, 'events');


2
Daha fazla fikir verdiğiniz için teşekkürler. Bunu yapmanın başka bir yolu bu. Dezavantajı jQuery'ye ihtiyaç duyuyor ve bu sorunun başlığı sadece Chrome'un araçlarına güvenmeyi istiyor. Yanıtınızı bir jQuery yöntemi olduğunu açıklığa kavuşturmak için düzenleyeceğim ve "HİÇBİR EN İYİ ÇÖZÜM" den daha makul bir şey kullanacağım :) Lütfen stackoverflow.com/help/how-to-answer
Carles Alcolea
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.