Kaçınılması gereken jQuery tuzakları [kapalı]


210

JQuery ile bir projeye başlıyorum.

JQuery projenizde hangi tuzaklar / hatalar / yanlış anlamalar / suistimaller / kötüye kullanımlarınız oldu?


4
Bu gerektiğini değil "yapıcı olmayan" olduğu gerekçesiyle kapatıldı. Bazı çok yararlı cevaplar gerçekleşti ve soru şu anda 220 kez yıldızlandı. Yeterli karmanız varsa lütfen yeniden açmak için oy verin.
Roy Prins

Bana öyle geliyor ki, jQuery başlı başına bir
tuzaktır

Yanıtlar:


189

Yerel değişkenlere atamak yerine, hit ve aşırı seçicilerin performansından habersiz olmak. Örneğin:-

$('#button').click(function() {
    $('#label').method();
    $('#label').method2();
    $('#label').css('background-color', 'red');
});

Ziyade:-

$('#button').click(function() {
    var $label = $('#label');
    $label.method();
    $label.method2();
    $label.css('background-color', 'red');
});

Veya zincirleme ile daha da iyi : -

$('#button').click(function() {
    $("#label").method().method2().css("background-color", "red"); 
});

Bulduğum bu nasıl aramalarının yığınlarının çalışmalarını fark edince aydınlatarak anı.

Düzenleme: yorumlara dahil edilen öneriler.


16
Youtube bağlantısı için +1. kutsal saçmalık çok şey öğrendim.
Jason

23
Yerel değişkenlere şeyler atamak harika ama zincirleme gücünü unutmayın (örneğin): $ ("# label"). Method (). Method2 (). Css ("background-color", " kırmızı");
Lance McNearney

YouTube videosu harikaydı. Konuyla ilgili başka Google sunuları gördüm ve hala birkaç şey öğrendim! Teşekkürler!
Gabriel Hurley

Bağlantı için +1, mükemmel!
Josh Stodola

7
JQuery bağlamındaki değişkenler için dolar işareti kullanmak bir tür kuraldır. Yani yazmak isteyebilirsinizvar $label = $('#label');
Tim Büthe

90

Bağlamın nasıl kullanılacağını anlayın. Normalde, bir jQuery seçici tüm dokümanı arar:

// This will search whole doc for elements with class myClass
$('.myClass');

Ancak bir bağlamda arama yaparak işleri hızlandırabilirsiniz:

var ct = $('#myContainer');
// This will search for elements with class myClass within the myContainer child elements
$('.myClass', ct);

9
Aaaaaaah! Bu yaklaşık 1.000.000 hatam düzeltildi. +1
jammus


1
JP'yi işaret ettiğiniz için teşekkürler. Şimdi ne yapmalıyım ... Cevabımı silmeli miyim, böylece kimse çılgınca çılgına dönmez ve kodunu hiçbir şey için değiştirmez mi?
slolife

Hayır, bu hala iyi bir nokta, optimizasyon açısından. :)
James

2
jQuery, bağlamın jQuery'nin bir örneği olup olmadığını kontrol eder, bunun için bir neden yoktur [0]. $('.myClass', ct);veya ct.find(".myClass")
ct'nin

62

Çıplak sınıf seçicileri kullanmayın, şöyle:

$('.button').click(function() { /* do something */ });

Bu, bir "düğme" sınıfına sahip olup olmadığını görmek için her öğeye bakacaktır.

Bunun yerine, aşağıdaki gibi yardımcı olabilirsiniz:

$('span.button').click(function() { /* do something */ });
$('#userform .button').click(function() { /* do something */ });

Bunu geçen yıl Rebecca Murphy'nin blogundan öğrendim

Güncelleme - Bu yanıt 2 yıl önce verildi ve jQuery'nin mevcut sürümü için doğru değil . Yorumlardan biri bunu kanıtlamak için bir test içeriyor. Testin , bu yanıt sırasında jQuery sürümünü içeren güncellenmiş bir sürümü de vardır .


6
Ben de bunun tersinin doğru olduğu izlenimindeydim. Belki de getElementsByClassName'i uygulamayan tarayıcılarda durum budur, ancak aksi takdirde jQuery'ye daha fazla iş vermeniz gerekir. Rebecca'nın bazı testler yayınladığını görmek çok isterim :)
Alex Barrett

7
Yapması gereken işi azaltırsınız. Sanki birisine çoraplarını odanızdan çıkarmasını söylemek yerine çoraplarınızı çekmecenizden çekmesini söylemek gibi. Yapması gereken 'görünümlü' miktarını önemli ölçüde azaltır.
Sneakyness

4
CSS yazarken bunun tersi geçerlidir (en azından öğe etiketi dahil). Bkz code.google.com/speed/page-speed/docs/...
kmiyashiro

7
@Sneakyness Her şeyin gerçek yaşamla ilgili doğru bir analogu yoktur. Örneğin , tarayıcı destekliyorsa $('.b')kullanabilir document.getElementsByClassName('b'), ancak bunu yapmak $('a.b'), sınıfla eşleşen tüm öğeleri almasına neden olur bve daha sonra iki aşamalı bir işlemde çapa olduklarını doğrular. İkincisi bana daha fazla iş gibi geliyor. Gerçek bir yaşam benzetmesi için şunu deneyin: Odamdaki tüm çorapları bulun. Şimdi, şifonuzda olmayanları atın.
alex

2
Seçicilerle ilgili yanılgının, jquery'nin eski sürümlerinde, $ ('div # foo') yerine $ ('# foo') yapmanın daha hızlı olmasından kaynaklandığına inanıyorum, çünkü tanım gereği bir kimlik benzersizdir. Ancak bunun sonraki sürümlerde düzeltildiğinden eminim, ancak bu öneri diğer seçiciler için değil, yalnızca kimlikler için geçerli
Alex Heyd

35

Anonim işlevleri bölmeye çalışın, böylece onları yeniden kullanabilirsiniz.

//Avoid
$('#div').click( function(){
   //do something
});

//Do do
function divClickFn (){
   //do something    
}

$('#div').click( divClickFn );

19
Bu, kabaca senkronize (satır içi) kod adlandırılmış işlevlere bölünmesi gereken aynı derecede geçerli olduğunu düşünüyorum. Bir ad verilmesini isteyen bir kod parçanız varsa, bunun için gidin. Ancak kodu bir fonksiyonun içine sildiğiniz için satır dışına taşımayın; anonim işlevler iyi bir nedenle var olur.
Dan Breslau

4
Aslında fonksiyonuma 'isim' vermek istiyorum. Kodda hata ayıklama yaparken ve anonim işlevlerin sonsuz bir listesini görmek yerine, düzgün adlandırılmış işlevleri görürseniz çok kullanışlıdır.
SolutionYogi

1
Demek istediğin iyi bir şey, ve muhtemelen bunu kendim birkaç kez taktım. Yine de, " kabaca aynı derecede" hala benim için çalışıyor.
Dan Breslau

1
ESP. bağlama bir döngü içinde oluyorsa!
daniellmb

Adlandırılmış işlevler hata ayıklama sırasında da size büyük fayda sağlar; hiçbir şey başka bir şey yok 8 seviyeleri derin bir calltack bakmaktan daha berbat (anonymous). Bu ipucu hakkında daha fazla bilgiyi buradan edinebilirsiniz: stackoverflow.com/questions/182630/jquery-tips-and-tricks/…
ken

34
  • Belgeyi hazır olarak kötüye kullanmaktan kaçının.
  • Belgeyi yalnızca kodu başlatma için hazır tutun.
  • İşlevleri daima dokümanın dışında çıkarın, böylece yeniden kullanılabilirler.

Doc ready ifadesinin içinde yüzlerce kod satırı gördüm. Çirkin, okunamaz ve bakımı imkansız.


6
+1. Genel olarak, gördüğüm jQuery kodunun çoğu yüzlerce satırlı fonksiyonları kullanır. 'JQuery geliştiricileri'nin neden daha küçük işlevler kullanmaktan hoşlanmadığını bilmiyorum.
SolutionYogi

6
@SolutionYogi çünkü çoğu sadece JS noobs?
adamJLev

Ben tamamen belgeye çok uzun fonksiyonlar koymak için değilim, bu iyi bir tavsiye. Ancak, belgede hazır olmayan bir kapsayıcı işlevden çalıştırılan birçok küçük bileşen işlevinin yapılması mutlaka en iyi yöntem değildir. Eğer kapsayıcı işlev bu kod parçalarını kullanan tek işlevse, okumak zor olsa bile hepsini tek bir işleve koymaktan daha iyi olursunuz. Arama işlevlerinin çok fazla yükü vardır ve kodu yalnızca bir bağlamda kullanıyorsanız, bundan kaçınılmalıdır.
sage88

34

Kullanırken $.ajaxiçin işlevini Ajax sunucusuna istekleri, kullandığınız kaçınmalısınız completeişlem tepki verilerine olayı. İsteğin başarılı olup olmadığı tetiklenir.

Bunun yerine complete, kullanın success.

Dokümanlardaki Ajax Etkinlikleri'ne bakın .


1
Başarıya karşı tam ve ileri gittim, tamamlamanın neden daha iyi olduğunu düşündüğünüzü genişletebilir misiniz?
Neil N

1
Tamamlamanın daha iyi olduğunu söylemiyorum. Söylemeye çalıştığım tam yanıltıcı kullanımdan kaçınmanız ve yanıt verilerini işlemek için başarı kullanmanız gerektiğidir.
Artem Barger

2
Her zaman çağrılır. Ancak aynı fikirde değilim. Complete, yükleme gifini vb. Gizlemek için en iyisidir. Tabii ki herhangi bir hata için yanıtı ve hatayı işlemek için başarıyı kullanmalısınız.
redsquare

1
Başarıyı tamamlamak yerine kullanmayı öneriyor. 'complete' her zaman ajax isteği 'tamamlandığında' tetiklenir, başarılı veya başarısız bir şekilde tamamlandığı önemli değildir.
SolutionYogi

@ redsquare, tam olarak aynı fikirde olmadığınızı genişletebilir misiniz? Veri sürecine atıfta bulunuyordum ve tam bir işleyici ile sahip olduğunuz fırsatları gizleyen / gösteren hiçbir resme aldırmadım.
Artem Barger

24

"Zincirleme" Animasyon-olayları ile geri çağrılar.

Bir paragrafı tıkladıktan sonra yok etmek istediğinizi varsayalım. Daha sonra öğeyi DOM'dan kaldırmak istediniz. Sadece yöntemleri zincirleyebileceğinizi düşünebilirsiniz:

$("p").click(function(e) {
  $(this).fadeOut("slow").remove();
});

Bu örnekte .remove (), .fadeOut () tamamlanmadan çağrılır, aşamalı solma efektinizi yok eder ve öğeyi hemen yok eder. Bunun yerine, bir komutu yalnızca öncekini bitirdikten sonra başlatmak istediğinizde, geri aramayı kullanın:

$("p").click(function(e){
  $(this).fadeOut("slow", function(){
    $(this).remove();
  });
});

.FadeOut () öğesinin ikinci parametresi, .fadeOut () animasyonu tamamlandıktan sonra çalışacak anonim bir işlevdir. Bu kademeli bir solma ve daha sonra elemanın çıkarılmasını sağlar.


24

Aynı olayı birden çok kez bağlarsanız () birden çok kez tetiklenir. Genellikle her zaman unbind('click').bind('click')güvende olurum


2
Akılda tutulması gereken önemli bir şey olsa da, bu jQuery'ye özgü değildir.
SolutionYogi

11
Aynı etkinliği iki kez bağlamak zorunda kalmamak için canlı etkinlikleri kullanabilirsiniz.
Powerlord

live, fazla kullanılırsa kendi (performans) sorunları vardır. Bağlam verebileceğiniz 1.3.3 sürümünden daha iyi.
redsquare

23

Eklentileri kötüye kullanmayın.

Çoğu zaman sadece kütüphaneye ve belki de kullanıcı arayüzüne ihtiyacınız olacaktır. Basit tutarsanız, kodunuz uzun vadede korunabilir olacaktır. Tüm eklentiler desteklenmez ve korunmaz, aslında çoğu desteklenmez. Çekirdek öğeleri kullanarak işlevselliği taklit edebiliyorsanız kesinlikle tavsiye ederim.

Eklentilerin kodunuza eklenmesi kolaydır, size biraz zaman kazandırır, ancak ekstra bir şeye ihtiyacınız olduğunda, olası güncellemeleri kaybettiğiniz için bunları değiştirmek kötü bir fikirdir. Başlangıçta kaydettiğiniz zaman, kullanımdan kaldırılmış eklentileri değiştirdiğinizde daha sonra kaybedersiniz.

Akıllıca kullandığınız eklentileri seçin. Kütüphane ve kullanıcı arayüzü dışında, sürekli olarak .cookie , $ .form , $ .validate ve thickbox kullanıyorum . Geri kalanı için çoğunlukla kendi eklentilerimi geliştiriyorum.


2
Izgara ne olacak? Sen kendin mi yapıyorsun?
jmav

Evet. projeden proje verilerine çeşitli şekillerde gelir. Bu ızgarayı fark etmenin sadece ortaya çıkmamı sağlayan tam kontrole sahip olmayı tercih ediyorum ve sonra doğaçlama yapmam gerekiyor.
Elzo Valugi

Eğer {yeterince zaman verilirse, genellikle doğrudan tüm veri odaklı-dom-manipülasyon (css / html) kodu yazmayı tercih ederim. başka bir deyişle - bir 'eklentiye' veri aktarmayın ve html yaymasını sağlayın. Mevcut kapsam uyumluluğu için eklentileri (orta sahayı) değerlendirmek yeterince zor, gelecekteki talepleri unutun. düşünüyorum ... tasarımcılar, planlamacılar, yöneticiler, yöneticiler, yöneticiler. oh ve müşteriler ve kullanıcılar. ama eğer tüm bunlara sahipseniz, 'zaman' demeye yetmeyeceksiniz. bu yüzden sadece jqgrid'i kullanın - kasıtlı zamanınızı boşa harcıyorsunuz. henüz yapılmadı mı?}
user406905

22

Tuzak: Seçiciler yerine döngüler kullanma.

DOM öğelerini yinelemek için kendinizi jQuery '.each' yöntemine ulaşıyorsanız, kendinize bunun yerine öğeleri almak için bir seçici kullanıp kullanamayacağınızı sorun.

JQuery seçicileri hakkında daha fazla bilgi:
http://docs.jquery.com/Selectors

Pitfall: Firebug gibi bir araç kullanmıyorum

Firebug bu tür hata ayıklama için pratik olarak yapıldı. Javascript ile DOM'da mucking olacaksanız, size görünürlük sağlamak için Firebug gibi iyi bir araca ihtiyacınız var.

Firebug hakkında daha fazla bilgi: http://getfirebug.com/

Diğer harika fikirler Polimorfik Podcast'in bu bölümünde: (Dave Ward ile jQuery Sırları) http://polymorphicpodcast.com/shows/jquery/


1
İlkini birçok kez yaptım. Sadece çoğu jQuery işlevinin bir seçiciden döndürülen tüm öğeler üzerinde çalışacağını hatırlamanız gerekir.
Hoşnutsuz Keçi

Dürüst olmak gerekirse .each yönteminden hoşlanmama
Simon Hayter

14

Bu tanımlayıcıyı doğru bağlamda kullanmanın yanlış anlaşılması. Örneğin:

$( "#first_element").click( function( event)
{
   $(this).method( ); //referring to first_element
   $(".listOfElements").each( function()
   {
      $(this).someMethod( ); // here 'this' is not referring first_element anymore.
   })
});

Ve burada nasıl çözebileceğiniz örneklerinden biri:

$( "#first_element").click( function( event)
{
   $(this).method( ); //referring to first_element
   var $that = this;
   $(".listOfElements").each( function()
   {
      $that.someMethod( ); // here 'that' is referring to first_element still.
   })
});

1
+1 Bir jquery probleminden daha fazla javascript problemi var, ama bununla çok uğraştım.
mmacaulay

13

Tüm DOM'da birkaç kez arama yapmaktan kaçının. Bu gerçekten senaryonuzu geciktirebilecek bir şey.

Kötü:

$(".aclass").this();
$(".aclass").that();
...

İyi:

$(".aclass").this().that();

Kötü:

$("#form .text").this();
$("#form .int").that();
$("#form .choice").method();

İyi:

$("#form")
    .find(".text").this().end()
    .find(".int").that().end()
    .find(".choice").method();

2
$ ( "aTavsiye sınıfı") bu () o ()..; iyi değil! sadece sınıf seçicileri yavaş
redsquare

Jquery'nin bir seçimde çeşitli yöntemler kullanma yeteneğini gösteren açıklayıcı bir örnektir. Bu tekniğe daha fazla odaklanmak için seçimi basit (ve dolayısıyla yavaş) yaptım.
googletorp

10
DOM'u tekrar tekrar aramaktan kaçınmak iyi bir şeydir - son örnek, neler olup bittiğine dair hiçbir fikrim olmadığı, okunamayan bir karmaşa. Getirme sonucunu birden çok kez kullanmayı planlıyorsanız, bunu bir değişkende saklayın. Kodu çok daha sürdürülebilir hale getirir.
Quentin

12

$ (This) öğesini her zaman anlamlı bir değişkene önbellekleyin.

Bunun gibi

$(selector).each(function () {
    var eachOf_X_loop = $(this); 
})

12
Kullanım $selfveya $thisiyi bir değişken adı düşünmek çok tembel iseniz.
gradbot

10

Repo Man'ın söylediklerine benzer, ancak tam olarak değil.

ASP.NET winformları geliştirirken sık sık

$('<%= Label1.ClientID %>');

# işaretini unutmak. Doğru form

$('#<%= Label1.ClientID %>');

10

Etkinlikler

$("selector").html($("another-selector").html());

hiçbir olayı klonlamıyor - hepsini yeniden hatırlamanız gerekiyor.

JP'nin commen t - clone () yöntemine göre, doğru geçerseniz olayları yeniden hatırlatır.


4
Doğru iletirseniz Clone () yapar.
James

JQuery 1.3.2'de live () ne olacak?
jmav

9

Aynı jQuery nesnelerini birden çok oluşturmaktan kaçının

//Avoid
function someFunc(){
   $(this).fadeIn();
   $(this).fadeIn();
}

//Cache the obj
function someFunc(){
   var $this = $(this).fadeIn();
   $this.fadeIn();
}

var $ this = $ (this) .fadeIn () ;? bir etki önbellekliyor musunuz?
Jason

12
öğeyi döndürür, zincirleme denir!
redsquare

bir değişken belirleyebilir ve aynı anda bir eylem gerçekleştirebilirsiniz?
Jason

1
Gerçekten, ama benim sözüme güvenme. Dene. Öğeyi temsil eden jquery nesnesi döndürülmezse aşağıdakilerin nasıl mümkün olduğunu düşünüyorsunuz? $ ('# divId'). hide (). show (). fadeIn () .... etc
redsquare

14
Bu işe yarıyor, ama bence $this = $(this);ayrı bir hatta olmak daha okunabilir . Yapabiliyorsanız (dağınıklık yapmadan), unutun $thisve her şeyi zincirleyin:$(this).fadeIn().fadeIn();
Patrick McElhaney

8

Bunu JavaScript için de söylüyorum, ancak jQuery, JavaScript ASLA CSS'nin yerini almamalıdır.

Ayrıca, sitenin JavaScript'i kapalı olan biri için kullanılabilir olduğundan emin olun (bugünkü kadar alakalı değil, ancak tamamen kullanılabilir bir siteye sahip olmak her zaman güzeldir).


6

Çok fazla DOM manipülasyonu yapmak. .Html (), .append (), .prepend (), vb. Yöntemler harika olsa da, tarayıcıların sayfaları oluşturma ve yeniden oluşturma biçimi nedeniyle, bunları çok sık kullanmak yavaşlamalara neden olur. HTML'yi bir dize olarak oluşturmak ve DOM'u birden çok kez değiştirmek yerine bir kez DOM'ye eklemek daha iyidir.

Onun yerine:

var $parent = $('#parent');
var iterations = 10;

for (var i = 0; i < iterations; i++){
    var $div = $('<div class="foo-' + i + '" />');
    $parent.append($div);
}

Bunu dene:

var $parent = $('#parent');
var iterations = 10;
var html = '';

for (var i = 0; i < iterations; i++){
    html += '<div class="foo-' + i + '"></div>';
}

$parent.append(html);

Ya da bu bile ($ wrapper, henüz DOM'a enjekte edilmemiş yeni oluşturulan bir öğedir. Bu wrapper div'a düğüm eklemek yavaşlamalara neden olmaz ve sonunda yalnızca bir DOM manipülasyonu kullanarak $ parent'e $ wrapper ekleriz ):

var $parent = $('#parent');
var $wrapper = $('<div class="wrapper" />');
var iterations = 10;

for (var i = 0; i < iterations; i++){
    var $div = $('<div class="foo-' + i + '" />');
    $wrapper.append($div);
}

$parent.append($wrapper);

+1 ... Her saniye birden çok öğe için .html () kullanıyorum. Her şeyi yavaşlatmaya başladığını fark ettim!
Kullanıcı2

5

ASP.NET projelerinde denetimin "gerçek" kimliğini almak için ClientID kullanma.

jQuery('#<%=myLabel.ClientID%>');

Ayrıca, SharePoint içinde jQuery kullanıyorsanız, jQuery.noConflict () öğesini çağırmalısınız.


11
? Bu nasıl bir tuzak? ASP.NET davranışı için bir geçici çözümdür.
SolutionYogi

1
Evet. Bu bir jQuery sorunudur. Asp.net web formlarının bir hatadır.
redsquare

3
Kabul. Ama ne olursa olsun ASP.NET'te jQuery kullanırken bilmeniz gereken bir şeydir.
Jacobs Data Solutions

2
OP
asp.net'ten

4

JQuery nesneleri yerine kimliklerin işlevlere iletilmesi:

myFunc = function(id) { // wrong!
    var selector = $("#" + id);
    selector.doStuff();
}

myFunc("someId");

Sarılı bir seti geçmek çok daha esnektir:

myFunc = function(elements) {
    elements.doStuff();
}

myFunc($("#someId")); // or myFunc($(".someClass")); etc.

3

Zincirin aşırı kullanımı.

Bunu gör:

this.buttonNext[n ? 'bind' : 'unbind'](this.options.buttonNextEvent, this.funcNext)[n ? 'removeClass' : 'addClass'](this.className('jcarousel-next-disabled')).attr('disabled', n ? false : true);

açıklama


1
Komik görünüyor, bir çeşit şaşkınlık.
Dykam

6
Zinciri (kendi başına) 'fazla' kullanmak zordur. Bu kod javascript üçlü operatörünü aşırı derecede kullanıyor gibi görünüyor. Daha fazla bilgi için bkz. En.wikipedia.org/wiki/Ternary_operation#JavaScript .
Dan Esparza

3
Kodunuzu korumak zorunda olmadığım için mutluyum.
cdmckay

3

Akümülatör tarzı dizeler kullanın

+ İşlecini kullanarak bellekte yeni bir dize oluşturulur ve birleştirilmiş değer ona atanır. Ancak bundan sonra sonuç bir değişkene atanır. Birleştirme sonucunun ara değişkeninden kaçınmak için, + = operatörünü kullanarak sonucu doğrudan atayabilirsiniz. Yavaş:

a += 'x' + 'y';

Daha hızlı:

a += 'x';
a += 'y';

İlkel işlemler işlev çağrılarından daha hızlı olabilir

Performans açısından kritik döngülerde ve fonksiyonlarda fonksiyon çağrıları üzerinde alternatif ilkel işlem kullanmayı düşünün. Yavaş:

var min = Math.min(a, b);
arr.push(val);

Daha hızlı:

var min = a < b ? a : b;
arr[arr.length] = val;

En Devamı JavaScript Performans En İyi Uygulamalar


1

Kullanıcıların tarayıcılarında html varlıklarını görmesini istiyorsanız, bir Unicode dizesi enjekte etmek için 'metin' yerine 'html' kullanın:

$('p').html("Your Unicode string")

1

benim görüşüm)

Genellikle jquery ile çalışmak, DOM öğeleri hakkında her zaman endişelenmenize gerek olmadığı anlamına gelir. Böyle bir şey yazabilirsiniz -$('div.mine').addClass('someClass').bind('click', function(){alert('lalala')}) - ve bu kod herhangi bir hata atmadan yürütülür.

Bazı durumlarda bu yararlıdır, bazı durumlarda - hiç de değil, ama jquery'nin boş maçlarla dost olma eğiliminde olduğu bir gerçektir. Hala,replaceWith belgeye ait olmayan bir öğeyle kullanmaya çalışırsa hata atar. Bunu oldukça sezgisel buluyorum.

Başka bir tuzak, bence, prevAll () yöntemi - tarafından döndürülen düğümlerin sırasıdır $('<div><span class="A"/><span class="B"/><span class="C"/><span class="D"/></div>').find('span:last-child').prevAll(). Aslında büyük bir mesele değil, ama bu gerçeği aklımızda tutmalıyız.


0

Ajax'a, örneğin 20 sütunlu bir tablo 1500 satır gibi çok sayıda veri planlıyorsanız, bu verileri HTML'nize eklemek için jQuery kullanmayı düşünmeyin. Düz JavaScript kullanın. jQuery yavaş makinelerde çok yavaş olacaktır.

Ayrıca, jQuery, gelen HTML'deki komut dosyası etiketlerini ayrıştırmaya çalışmak ve tarayıcı tuhaflıklarıyla uğraşmak gibi daha yavaş olmasına neden olacak şeyler yapacak. Hızlı ekleme hızı istiyorsanız, düz JavaScript ile devam edin.


1
-1 .html () işlevi yerel yaklaşım kadar hızlıdır
cllpse 14:09

Beni küçümseyen herkes IE'ye bir ton DOM eklemeyi denemedi ve işleri yavaşlattı. Nedeni jquery yavaştır, sadece domu eklemez, dom'un komut dosyaları olup olmadığını kontrol etmek gibi birkaç şey yapar ve IE'de ise çalıştırır ve tam olarak biliyorsanız yapmanız gerekmeyen diğer bazı şeyler ne tür veriler ekliyorsunuz
mkoryak

1
Tarayıcı sızıntıları ve benzeri şeyler hakkında endişelenmenize gerek olmadığı sürece bunu .innerHTMLyapacaktır. Ancak, kullanıcının sekmeyi saatlerce açık tuttuğu Gmail gibi bir şey oluşturuyorsanız, mermiyi ısırmanız ve ekstra yavaşlıkla uğraşmanız gerekecek. Meraklı olmak için, jQuery's tam olarak ne .html()yapıyor: james.padolsey.com/jquery/#v=1.4&fn=jQuery.fn.html
adamJLev

-1

Sadece birkaç satır sıradan JavaScript ile tamamlanabilen küçük bir projede jQuery kullanmak.


Değiştirilmeyi umursamıyorum, ama lütfen seçiminizi tartışın.
mengene

8
-1 jQuery, bozuk bir API'yi özetler. Bu şekilde, kodunuzun her zaman çalıştığından emin olabilirsiniz. Diyelim ki jQuery kullanarak bazı kodlar yazdınız ve bazı rastgele tarayıcı hataları yeni bir sürümle tanıtılıyor - tek yapmanız gereken jQuery çerçevesinin güncellenmiş bir sürümünü içe aktarmak. Karşılıklı hatayı kendiniz nasıl çözeceğinizi bulmak zorundasınız.
cllpse

+1 benim için makul görünüyor - sadece birkaç satır kullanıyorsanız, vanilya JS kullanmak mantıklı.
alex

1
@roosteronacid, argümanınız noktayı kaçırıyor. Bir tarayıcının daha az karmaşıklığa sahip bir senaryoda bir gerileme getirmesi veya bu konu için tarayıcılar arası sorunlarla uğraşması pek olası değildir. İki yıl önce mootools ile çalıştım ve belli bir şart altında IE'de bir element içeriğini okuyamadı. Sorunu çözmek için birkaç saat çalıştıktan sonra, o parçayı düz js ile yeniden yazdım. Yani, bir tarayıcı yükseltmesi nedeniyle düz javascript'in başarısız olması yerine jQuery'nin kırılması daha olasıdır. Bir kütüphane kodunu kesmek yerine her gün kendimi bir hata çözerdim.
mengene

3
couple of lines of ordinary JavaScriptElbette, hiç sorun değil. Ama ne zaman sadece bu kadar? "Neden vanilya javascript kullanılmıyor ??" henüz IE tarafından yeterince sert ısırılmadı ... ve düz eski JS basit şeyler yapmak için yazmak zorunda ne kadar cruft ve boilerplate kod bahsetmiyorum.
adamJLev

-3

Olay bağlama anlaşılmıyor. JavaScript ve jQuery farklı çalışır.

Yoğun talep üzerine bir örnek:

JQuery'de:

$("#someLink").click(function(){//do something});

JQuery olmadan:

<a id="someLink" href="page.html" onClick="SomeClickFunction(this)">Link</a>
<script type="text/javascript">
SomeClickFunction(item){
    //do something
}
</script>

Temel olarak JavaScript için gereken kancalar artık gerekli değildir. Satır içi işaretleme (onClick, vb.) Kullanın, çünkü bir geliştiricinin normalde CSS amaçları için kaldıracağı kimlikleri ve sınıfları kullanabilirsiniz.


5
Ayrıntılı düşünmek ister misiniz? Tercihen bir örnek?
SolutionYogi

7
JavaScript bunu yapmak için addEventListener () ve attachEvent () sağlamıyor mu?
alex

2
endişelerin ayrılması, adamım. HTML tutun ve JS ayırmak
Don
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.