jQuery.click () - onClick


558

Çok büyük bir jQuery uygulaması var ve tıklama olayları için aşağıdaki iki yöntemi kullanıyorum.

İlk yöntem

HTML

<div id="myDiv">Some Content</div>

jQuery

$('#myDiv').click(function(){
    //Some code
});

İkinci yöntem

HTML

<div id="myDiv" onClick="divFunction()">Some Content</div>

JavaScript işlev çağrısı

function divFunction(){
    //Some code
}

Uygulamamda birinci veya ikinci yöntemi kullanıyorum. Hangisi daha iyi? Performans için daha mı iyi? Peki ya standart?


9
Olay işleyicileri eklemenin çeşitli yollarını ve bunların avantajlarını / dezavantajlarını buradan öğrenebilirsiniz : quirksmode.org/js/introevents.html . jQuery sadece gelişmiş olay kaydı için güzel bir paketleyicidir.
Felix Kling

12
Tıklama işlevini $ (document) .ready (function ().
İçine koymayı unutmayın

Yanıtlar:


559

Kullanımı $('#myDiv').click(function(){ise daha iyi standart etkinlik kaydı modeli aşağıdaki gibi. (jQuery dahili olarakaddEventListener ve kullanır attachEvent).

Temel olarak bir olayın modern bir şekilde kaydedilmesi , olayları ele almanın göze batmayan bir yoludur. Ayrıca, hedef için birden fazla olay dinleyicisi kaydetmek addEventListener()için aynı hedefi arayabilirsiniz .

var myEl = document.getElementById('myelement');

myEl.addEventListener('click', function() {
    alert('Hello world');
}, false);

myEl.addEventListener('click', function() {
    alert('Hello world again!!!');
}, false);

http://jsfiddle.net/aj55x/1/

Neden addEventListener kullanıyorsunuz? (MDN'den)

addEventListener, W3C DOM'da belirtildiği gibi bir olay dinleyicisini kaydetmenin yoludur. Yararları aşağıdaki gibidir:

  • Bir olay için tek bir işleyiciden daha fazlasını eklemeye izin verir. Bu, özellikle diğer kütüphaneler / uzantılar kullanılsa bile iyi çalışması gereken DHTML kitaplıkları veya Mozilla uzantıları için kullanışlıdır.
  • Dinleyici aktive edildiğinde (yakalama veya köpürme) fazın daha hassas kontrolünü sağlar
  • Yalnızca HTML öğelerinde değil, herhangi bir DOM öğesinde çalışır.

Modern etkinlik kaydı hakkında daha fazla bilgi -> http://www.quirksmode.org/js/events_advanced.html

HTML niteliklerini ayarlamak gibi diğer yöntemler , örnek:

<button onclick="alert('Hello world!')">

Veya DOM öğesi özellikleri , örnek:

myEl.onclick = function(event){alert('Hello world');}; 

eskidir ve kolayca yazılabilir.

İşaretlemeyi daha büyük ve daha az okunabilir hale getirdiğinden HTML özelliğinden kaçınılmalıdır. İçerik / yapı ve davranış endişeleri iyi ayrılmış değildir, bu da bir hatanın bulunmasını zorlaştırır.

DOM öğesi özellikleri yöntemiyle ilgili sorun, olay başına bir öğeye yalnızca bir olay işleyicisinin bağlanabilmesidir.

Geleneksel olay işleme hakkında daha fazla bilgi -> http://www.quirksmode.org/js/events_tradmod.html

MDN Referansı: https://developer.mozilla.org/en-US/docs/DOM/event


13
$('#myDiv').click(function(){Önce kodu çalıştırdığınızı , ardından JavaScript'ten dinamik olarak 20 satır HTML oluşturduğunuzu ve her satırda, aynı işlevi yürütmek için JavaScript'in tıklanması gereken bir düğme olduğunu varsayalım. Bunu ilk önce yaparsanız, HTML oluşturulmadan önce olay işleyici eklendiğinden çalışmaz. onclick="functionName()"Dinamik olarak oluşturulan HTML'ye atmak daha kolay görünüyordu , sonra düğme hemen çalışıyor. Yoksa bu durum için daha zarif bir çözüm biliyor musunuz?
zuallauz

17
@zuallauz bu durumda jQuery .delegate()işlevi sunar . Gelecekte sitede görünecek öğelere etkinlik ekler.
Zefiryn

17
@SimonRobb .livekullanımdan kaldırıldı. .delegateDaha eski sürümler için kullanın veya .ondaha yeni jQuery sürümleri için kullanın .
Selvakumar Arumugam

4
@Vega, İyi puanlar. Okunabilirlik ne olacak? Şimdi, işlev adını aramak yerine bir öğenin tüm tıklama işleyicilerini öğenin kimliğine göre görmek için sayfada başvurulan tüm JS dosyalarında arama yapmanız gerekir. Bu konudaki görüşünüz nedir?
supertonsky

6
Supertonsky'ye katılıyorum. $ ('# MyDiv'). Click (function () {daha iyidir. Büyük bir javascript uygulamasında bir olayla bağlanma, o hedefe bağlanan tüm başvuruları bulmak büyük ölçüde zorlaşır. , bir kimlik, bir çocuk bir html etiketine başvuruyor? Ve css değişiklikleri ve değiştirilmesi gereken sınıf isimleri değiştirmek zorunda kalırsanız ne olur? Başkaları ile çalışma deneyimime göre çok çirkin çok hızlı olur
Jon

65

Daha iyi performans için yerel JavaScript'i kullanın. Daha hızlı geliştirme için jQuery kullanın. JQuery vs Native Element Performance'daki performans karşılaştırmasını kontrol edin .

Windows Server 2008 R2 / 7 64 bit üzerinde Firefox 16.0 32 bit'te bir test yaptım

$('span'); // 6,604 operations per second
document.getElementsByTagName('span'); // 10,331,708 operations/sec

Tıklama etkinlikleri için Yerel Tarayıcı etkinliklerine karşı jquery tetikleyici veya jQuery'ye karşı Yerel Tıklama Etkinlik Bağlama'yı kontrol edin .

Chrome 22.0.1229.79 Windows Server 2008 R2 / 7 64 bit'te 32 bit test etme

$('#jquery a').click(window.testClickListener); // 2,957 operations/second

[].forEach.call( document.querySelectorAll('#native a'), function(el) {
    el.addEventListener('click', window.testClickListener, false);
}); // 18,196 operations/second

9
jQuery birçok farklı ortamda çalışabilmelidir, bu da onu daha sağlam hale getirir ve yazmak, korumak daha kolaydır, ancak hız en önemliyse jQuery cevap değildir
Coops

ForEach neden tüm tarayıcı uyumlu değil kullanırken dikkatli olun, örneğin IE için değil düşünüyorum. Belki bir çoklu dolgu faydalı olacaktır.
khaled_webdev

39

Anladığım kadarıyla, sorunuz gerçekten jQuery kullanıp kullanmayacağınızla ilgili değil. Daha doğrusu: Etkinlikleri HTML'de satır içi veya olay dinleyicileri aracılığıyla bağlamak daha mı iyi?

Satır içi bağlama kullanımdan kaldırıldı. Ayrıca bu şekilde yalnızca bir işlevi belirli bir olaya bağlayabilirsiniz.

Bu nedenle olay dinleyicilerini kullanmanızı öneririm. Bu şekilde, birçok işlevi tek bir etkinliğe bağlayabilir ve gerekirse daha sonra bu işlevleri kaldırabilirsiniz. Şu saf JavaScript kodunu düşünün:

querySelector('#myDiv').addEventListener('click', function () {
    // Some code...
});

Bu, çoğu modern tarayıcıda çalışır.

Ancak, projenize zaten jQuery eklerseniz - jQuery: .onveya .clickişlevini kullanmanız yeterlidir .


<Div onclick = "handler1 (); handler2 (); handler3 ();"> </div>
Kira

2
Bu şekilde hâlâ yalnızca bir "ifade" kaydediyorsunuz. Örneğin, handler1bir hata atarsa handler2ve handler3hiç çağrılmazsa. Dahası, dinleyiciden belirli işlevleri dinamik olarak ekleyemez ve kaldıramazsınız. Ve son fakat en az değil handler1, handler2ve handler3küresel bir koku olarak ilan edilmelidir ki bu bir koku.
Michał Miszczyszyn

Tanımlanmamış try..catchdurumdayken işlevlerin içinde kullanılması çalışmaz handler2. FYI satır içi JavaScript, kullanıcının tarayıcısında JS devre dışı bırakıldığında açık şekilde çalışmaz, lütfen başkalarını yanlış bilgilendirmeyin.
Michał Miszczyszyn

JavaScript devre dışı olduğundan emin olmadığımı belirttim. Başkalarını yanlış bilgilendirmiyorum ya da aldatmıyorum
Kira

Bu durumda, aşağıdaki <div onclick = "function () {try {handler1 (); handler2 (); handler3 ();} catch {}}"> </div>
Kira

15

Bunları birleştirebilir, işlevi tıklamaya bağlamak için jQuery kullanabilirsiniz

<div id="myDiv">Some Content</div>

$('#myDiv').click(divFunction);

function divFunction(){
 //some code
}

14

$('#myDiv').clickJavaScript kodunu HTML'den ayırdığı için daha iyidir . Sayfa davranışını ve yapısını farklı tutmaya çalışmak gerekir . Bu çok yardımcı olur.


2
Bu cevap çoğu durumda js şeyler tasarlayan ve yazan insanlar farklı olduğu için anlamlıdır. Ve bu yayınlanmıştır beri neredeyse 4 yıl sonra bu upvote garip geliyor !!
LearningEveryday

14

Bunu hem standart hem de performans verecek şekilde yapın.

 $('#myDiv').click(function(){
      //Some code
 });

İkinci yöntem basit JavaScript kodu olduğundan ve jQuery'den daha hızlı olduğu için. Ancak burada performans yaklaşık olarak aynı olacaktır.


11

IMHO, onclick, yalnızca aşağıdaki koşullar gerçekleştiğinde .click yerine tercih edilen yöntemdir:

  • sayfada birçok öğe var
  • tıklama etkinliği için yalnızca bir etkinlik kaydedilecek
  • Mobil performans / pil ömrü konusunda endişelisiniz

Bu fikri, mobil cihazlardaki JavaScript motorlarının aynı nesilde üretilen masaüstü benzerlerinden 4 ila 7 kat daha yavaş olması nedeniyle oluşturdum. Mobil cihazımdaki bir siteyi ziyaret edip jitterli kaydırma aldığımda nefret ediyorum çünkü jQuery tüm olayları kullanıcı deneyimim ve pil ömrüm pahasına bağlıyor. Bir başka yeni destekleyici faktör, ancak bu sadece devlet kurumları ile ilgili bir endişe olsa da;), JavaScript işleminin uzun ... beklemek veya iptal etmek için sürdüğünü belirten bir mesaj kutusu ile IE7 pop-up'ımız vardı. Bu, jQuery aracılığıyla bağlanacak birçok öğe olduğunda meydana geldi.


10

İşlerde fark. Click () kullanırsanız, birkaç işlev ekleyebilirsiniz, ancak bir öznitelik kullanırsanız, yalnızca bir işlev yürütülür - sonuncusu.

DEMO

HTML

<span id="JQueryClick">Click #JQuery</span> </br>
<span id="JQueryAttrClick">Click #Attr</span> </br>

JavaScript

$('#JQueryClick').click(function(){alert('1')})
$('#JQueryClick').click(function(){alert('2')})

$('#JQueryAttrClick').attr('onClick'," alert('1')" ) //This doesn't work
$('#JQueryAttrClick').attr('onClick'," alert('2')" )

Performanstan bahsediyorsak, her durumda doğrudan kullanmak her zaman daha hızlıdır, ancak bir öznitelik kullanmak, yalnızca bir işlev atayabilirsiniz.


$ ('# JQueryAttrClick'). Attr ('onClick', "alert ('2'); alert ('3'); alert ('4')")
Kira

8

Endişelerin ayrılması burada anahtardır ve bu nedenle olay bağlayıcılığı genel olarak kabul edilen yöntemdir. Temel olarak mevcut cevapların birçoğu bunu söyledi.

ancak , bildirimsel işaretleme fikrini çok hızlı bir şekilde atmayın. Onun yeri var ve Angularjs gibi çerçevelerle merkez.

<div id="myDiv" onClick="divFunction()">Some Content</div>Bazı geliştiriciler tarafından istismar edildiğinden , bütünün bu kadar ağır bir şekilde utandığına dair bir anlayış olmalı . Böylece, kutsal oranlara ulaştı tables. Bazı geliştiriciler aslındatables tablo verileri için kaçınırlar . Anlamadan hareket eden insanların mükemmel bir örneğidir.

Her ne kadar davranışlarımı görüşlerimden ayrı tutma fikrini sevsem de. İşaretlemenin ne yaptığını bildiren bir sorun görmüyorum ( nasıl yaptığını değil, bu davranış). Bootstraps javascript bileşenleri gibi gerçek bir onClick özniteliği veya özel bir öznitelik biçiminde olabilir.

Bu şekilde, sadece biçimlendirmeye bakarak, javascript olay bağlayıcılarını ters çevirmeye çalışmak yerine ne olduğunu görebilirsiniz.

Dolayısıyla, yukarıdakilere üçüncü bir alternatif olarak, işaretleme içindeki davranışı bildirmek için veri özniteliklerini kullanmak. Davranış görünümden uzak tutulur, ancak bir bakışta neler olduğunu görebilirsiniz.

Önyükleme örneği:

<button type="button" class="btn btn-lg btn-danger" data-toggle="popover" title="Popover title" data-content="And here's some amazing content. It's very engaging. Right?">Click to toggle popover</button>

Kaynak: http://getbootstrap.com/javascript/#popovers

Not İkinci örnekle ilgili ana dezavantaj, küresel ad alanının kirlenmesidir. Bu, yukarıdaki üçüncü alternatif veya Açısal ve otomatik tıklama özelliğine sahip ng-click nitelikleri gibi çerçeveler kullanılarak atlatılabilir.


4

İkisi de farklı amaçlar için kullanılabilmeleri açısından daha iyi değildir . onClick(aslında olmalı onclick) çok daha iyi performans gösterir, ancak orada bir fark göreceğinizden şüpheliyim.

Farklı şeyler yaptıklarını belirtmek gerekir: .clickherhangi bir jQuery koleksiyonuna bağlanabilirken, bağlı olmasını istediğiniz onclicköğeler üzerinde satır içi kullanılması gerekir. Ayrıca, yalnızca bir olayı kullanmaya bağlayabilirsiniz onclick, oysa .clickolayları bağlamaya devam etmenizi sağlar.

Bence, bu konuda tutarlı ve sadece .clickher yerde kullanmak ve tüm JavaScript kodumu bir arada ve HTML'den ayrı tutarım .

Kullanma onclick. Ne yaptığınızı bilmedikçe kullanmak için herhangi bir neden yok ve muhtemelen bilmiyorsunuz.


2
"Daha iyi" açıkça tanımlanmamış olsa bile, olay işleyicilerini doğrudan işaretlemenize koymak neredeyse hiç iyi bir fikir değildir
Jay

@Jayraj Cevabımda ne zaman iyi bir fikir olduğunu söyledim?
Patlama Hapları

3
Söylemek .clickdaha iyi değildi onclick("Hiçbiri daha iyi ") onclick, ya da aslında .clickbir mil daha iyi bir uygulama olduğunda, kod yazmanın bir yolu kadar iyi olduğu ima edildi. Üzgünüz, ama IMHO cevabınızı yeniden yazmalısınız
Jay

2
@ ExplosionPills Yanıtın hiçbirinin daha iyi olmadığını söyleyen kısmını kaldıracağım. Sondaki paragraf bir çelişki gibi geliyor.
Juan Mendes

4
<whatever onclick="doStuff();" onmouseover="in()" onmouseout="out()" />

onclick, onmouseover, onmouseout, vb. olaylar aslında performans için kötüdür ( esas olarak Internet Explorer'da , şekil verin). Visual Studio'yu kullanarak kod yazarsanız, bunlarla bir sayfa çalıştırdığınızda, bunların her biri ayrı bir SCRIPT bloğu oluşturur ve bu da belleği alır ve performansı yavaşlatır.

Endişelerin ayrılması gerektiğini söylememeliyiz : JavaScript ve düzenler ayrılmalıdır!

Bu olaylardan herhangi biri için evenHandlers oluşturmak her zaman daha iyidir, bir olay her biri için binlerce ayrı komut dosyası bloğu oluşturmak yerine yüzlerce / binlerce öğeyi yakalayabilir!

(Ayrıca, herkesin söylediği her şey.)


3

Eh, arkasındaki ana fikirlerin bir jQuery pis JavaScriptlerin ayırmaktır HTML kodu. İlk yöntem gidilecek yoldur.


3

Çoğu zaman, yerel JavaScript yöntemleri, performans tek kriter olduğunda jQuery'den daha iyi bir seçimdir, ancak jQuery JavaScript'i kullanır ve geliştirmeyi kolaylaştırır. Performansı çok fazla düşürmediği için jQuery kullanabilirsiniz. Özel durumunuzda, performans farkı göz ardı edilebilir.


2

Kullanmanın ilk yöntemi onclickjQuery değil, sadece Javascript'tir, bu nedenle jQuery yükünü alamazsınız. JQuery yolu, her öğeye olay işleyicisi eklemeden başka öğelere eklemeniz gerektiğinde seçiciler yoluyla genişletilebilir, ancak şimdi sahip olduğunuzda jQuery kullanmanız gerekip gerekmediği sadece bir sorudur.

Şahsen jQuery kullandığınızdan beri ben tutarlı ve kodlama biçimlendirme ayrıştırır gibi onunla sopa.


1
JQuery örneği pratik olarak document.querySelector('#something').addEventListener(...düz Javascript ile aynı veya benzerdir, bu yüzden önemli değildir. Benzer şekilde sadece jQuery kısayollarıyla değil, Javascript'teki alt düğümlerden köpüren olayları yakalayabilirsiniz. Meselenin özü, bu olayların görünümden ziyade denetleyicide (javascript davranış tanımları dosyası) olması gerektiğidir (burada ve burada
html'ye

2

İlk yöntem tercih etmektir. Aynı öğeye birden çok işleyici ekleyebileceğiniz anlamına gelen gelişmiş olay kayıt modelini [s] kullanır . Olay nesnesine kolayca erişebilirsiniz ve işleyici herhangi bir işlevin kapsamında yaşayabilir. Ayrıca, dinamiktir, yani herhangi bir zamanda çağrılabilir ve özellikle dinamik olarak oluşturulan elemanlar için çok uygundur. İster jQuery, ister başka bir kütüphane veya yerel yöntemler kullanın, gerçekten önemli değildir.

Satır içi nitelikleri kullanan ikinci yöntem, çok sayıda küresel işleve ihtiyaç duyar (ad alanı kirliliğine yol açar) ve içeriği / yapıyı (HTML) davranışla (JavaScript) karıştırır. Bunu kullanma.

Performans veya standartlarla ilgili sorunuz kolayca cevaplanamaz. İki yöntem tamamen farklıdır ve farklı şeyler yaparlar. Birincisi daha güçlü, ikincisi hor görülüyor (kötü stil olarak kabul edilir).


1

Onclick İşlev Jquery

$('#selector').click(function(){ //Your Functionality });

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.