jQuery jebakan untuk menghindari [ditutup]

210

Saya memulai proyek dengan jQuery.

Apa jebakan / kesalahan / kesalahpahaman / penyalahgunaan / penyalahgunaan yang Anda miliki dalam proyek jQuery Anda?

flybywire
sumber
4
Ini seharusnya tidak ditutup karena "tidak konstruktif". Beberapa jawaban yang sangat membantu telah muncul dan pertanyaannya telah dibintangi 220 kali sekarang. Harap pilih untuk membuka kembali, jika Anda memiliki karma yang cukup.
Roy Prins
Menurut saya, jQuery adalah jebakan dalam dirinya sendiri
gromit190

Jawaban:

189

Menjadi tidak menyadari kinerja hit dan over selector alih-alih menugaskan mereka ke variabel lokal. Sebagai contoh:-

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

Daripada:-

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

Atau bahkan lebih baik dengan rantai : -

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

Saya menemukan ini saat mencerahkan ketika saya menyadari bagaimana tumpukan panggilan bekerja.

Edit: saran yang dimasukkan dalam komentar.

Gavin Gilmour
sumber
16
+1 untuk tautan youtube. Omong kosong aku belajar banyak.
Jason
23
Saya pikir menetapkan hal-hal ke variabel lokal sangat bagus tapi jangan lupa tentang kekuatan chaining (dari contoh Anda): $ ("# label"). Method (). Method2 (). Css ("background-color", " merah");
Lance McNearney
Video YouTube sangat bagus. Saya telah melihat presentasi Google lain tentang masalah ini dan saya masih belajar beberapa hal! Terima kasih!
Gabriel Hurley
+1 untuk tautan juga, luar biasa!
Josh Stodola
7
Ini semacam konvensi untuk menggunakan tanda dolar untuk variabel dengan konteks jQuery. Jadi, Anda mungkin ingin menulisvar $label = $('#label');
Tim Büthe
90

Memahami cara menggunakan konteks. Biasanya, pemilih jQuery akan mencari seluruh dokumen:

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

Tetapi Anda dapat mempercepat dengan mencari dalam konteks:

var ct = $('#myContainer');
// This will search for elements with class myClass within the myContainer child elements
$('.myClass', ct);
slolife
sumber
9
Aaaaaah! Ya, itu sekitar 1.000.000 bug saya diperbaiki. +1
jammus
4
Tampaknya poin terakhir Anda salah - groups.google.co.id/group/jquery-dev/browse_thread/thread/…
James
1
Terima kasih telah menunjukkan JP ini. Sekarang, apa yang harus dilakukan ... Haruskah saya menghapus jawaban saya sehingga tidak ada orang lain yang menjadi liar dan mengubah kodenya?
slolife
Nah, itu masih poin bagus, dari segi optimisasi. :)
James
2
jQuery memeriksa untuk melihat apakah konteksnya adalah instace dari jQuery sehingga tidak ada alasan untuk itu [0]. $('.myClass', ct);atau jika Anda tahu ct adalah turunan dari jQuery, Anda dapat menggunakan findct.find(".myClass")
gradbot
62

Jangan gunakan pemilih kelas kosong, seperti ini:

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

Ini pada akhirnya akan melihat setiap elemen untuk melihat apakah ia memiliki kelas "tombol".

Sebagai gantinya, Anda dapat membantu, seperti:

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

Saya belajar ini tahun lalu dari blog Rebecca Murphy

Update - Jawaban ini diberikan lebih dari 2 tahun yang lalu dan tidak benar untuk saat ini versi jQuery. Salah satu komentar termasuk tes untuk membuktikan ini. Ada juga versi terbaru dari tes yang menyertakan versi jQuery pada saat jawaban ini.

BrianH
sumber
6
Saya juga mendapat kesan bahwa yang terjadi adalah sebaliknya. Mungkin ini adalah kasus di browser yang tidak mengimplementasikan getElementsByClassName, tetapi sebaliknya Anda hanya memberi jQuery lebih banyak pekerjaan untuk dilakukan. Saya akan sangat banyak seperti untuk melihat Rebecca memposting beberapa tolok ukur :)
Alex Barrett
7
Anda MENGURANGI jumlah pekerjaan yang harus dilakukan. Ini seperti menyuruh seseorang untuk mengeluarkan kaus kaki dari laci di lemari Anda alih-alih menyuruh mereka mengeluarkan kaus kaki dari kamar Anda. Mengurangi jumlah 'tampilan' yang harus dilakukan secara substansial.
Sneakyness
4
Kebalikannya benar ketika Anda menulis CSS (setidaknya termasuk tag elemen). Lihat code.google.com/speed/page-speed/docs/…
kmiyashiro
7
@Sneakyness Tidak semuanya memiliki analog akurat tentang kehidupan nyata. Misalnya, $('.b')dapat digunakan document.getElementsByClassName('b')jika browser mendukungnya, tetapi melakukan $('a.b')akan menyebabkannya mendapatkan semua elemen yang cocok dengan kelas bdan kemudian mengonfirmasi bahwa mereka adalah jangkar dalam operasi dua tahap. Yang terakhir terdengar seperti lebih banyak pekerjaan bagiku. Untuk analogi kehidupan nyata, coba ini: Temukan semua kaus kaki di kamarku. Sekarang, buang yang tidak ada di lemari saya.
alex
2
Saya percaya kesalahpahaman pada penyeleksi adalah karena fakta bahwa dalam versi jquery yang lebih lama, lebih cepat untuk melakukan $ ('# foo') daripada $ ('div # foo'), karena menurut definisi, id adalah unik. Saya cukup yakin ini diperbaiki pada rilis selanjutnya, tetapi rekomendasi itu hanya berlaku untuk id, bukan tipe penyeleksi lainnya
Alex Heyd
35

Cobalah untuk membagi fungsi anonim sehingga Anda dapat menggunakannya kembali.

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

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

$('#div').click( divClickFn );
kotak merah
sumber
19
Saya pikir ini berlaku untuk kira-kira tingkat yang sama bahwa kode sinkron (sebaris) harus dipecah menjadi fungsi-fungsi yang disebutkan. Jika Anda memiliki sepotong kode yang meminta diberi nama, maka lakukanlah. Tapi jangan pindahkan kode keluar dari jalur hanya karena Anda membungkusnya di dalam suatu fungsi; fungsi anonim ada karena alasan yang bagus.
Dan Breslau
4
Sebenarnya saya suka memberi 'nama' ke fungsi saya. Ini sangat berguna ketika Anda men-debug kode dan alih-alih melihat daftar fungsi anonim yang tak ada habisnya, Anda melihat fungsi yang dinamai dengan benar.
SolutionYogi
1
Maksud Anda diambil dengan baik, dan saya mungkin telah tersandung oleh ini sendiri beberapa kali. Meski begitu, " derajat yang kira - kira sama" masih bekerja untuk saya.
Dan Breslau
1
esp. jika pengikatan terjadi dalam satu lingkaran!
daniellmb
Fungsi yang dinamai juga menguntungkan Anda saat melakukan debug; tidak ada yang menyebalkan daripada melihat level 8 level yang tidak memiliki apa-apa selain (anonymous). Baca lebih lanjut tentang tip ini di sini: stackoverflow.com/questions/182630/jquery-tips-and-tricks/…
ken
34
  • Hindari penyalahgunaan dokumen yang siap.
  • Siapkan dokumen hanya untuk inisialisasi kode.
  • Selalu ekstrak fungsi di luar dokumen siap sehingga mereka dapat digunakan kembali.

Saya telah melihat ratusan baris kode di dalam pernyataan ready doc. Jelek, tidak bisa dibaca, dan tidak mungkin dipertahankan.

Peter Mortensen
sumber
6
+1. Secara umum, sebagian besar kode jQuery yang saya lihat menggunakan fungsi dengan ratusan baris. Saya tidak tahu mengapa 'pengembang jQuery' tidak suka menggunakan fungsi yang lebih kecil.
SolutionYogi
6
@SolutionYogi karena kebanyakan hanya JS noobs?
adamJLev
Saya semua untuk tidak menempatkan fungsi yang sangat panjang dalam dokumen siap, itu saran yang bagus. Namun, membuat banyak fungsi komponen kecil yang dijalankan dari fungsi menyeluruh yang tidak ada dalam dokumen siap tidak selalu merupakan praktik terbaik. Jika fungsi menyeluruh adalah satu-satunya yang menggunakan potongan-potongan kode itu, Anda lebih baik meletakkan semuanya dalam satu fungsi meskipun itu lebih sulit dibaca. Fungsi panggilan memiliki banyak overhead dan jika Anda hanya menggunakan kode dalam satu konteks itu harus dihindari.
sage88
34

Saat menggunakan $.ajaxfungsi untuk permintaan Ajax ke server, Anda harus menghindari menggunakan completeacara untuk memproses data respons. Ini akan memecat apakah permintaan itu berhasil atau tidak.

Daripada complete, gunakan success.

Lihat Acara Ajax dalam dokumen.

Patrick McElhaney
sumber
1
Saya telah bolak-balik pada kesuksesan vs selesai, dapatkah Anda memperluas mengapa Anda berpikir lengkap lebih baik?
Neil N
1
Saya tidak mengatakan lengkap lebih baik. Apa yang saya coba katakan adalah bahwa Anda perlu menghindari kesalahan penggunaan yang lengkap dan harus menggunakan kesuksesan agar dapat memproses data respons.
Artem Barger
2
Yah itu selalu dipanggil. Namun saya tidak setuju. Lengkap adalah yang terbaik untuk menyembunyikan gif pemuatan, dll. Anda harus menggunakan kesuksesan untuk menangani respons dan kesalahan untuk setiap kesalahan, tentu saja.
redsquare
1
Dia menyarankan untuk menggunakan kesuksesan daripada menyelesaikan. 'lengkap' selalu aktif ketika permintaan ajax 'lengkap', tidak masalah itu berhasil atau tidak berhasil.
SolutionYogi
@redsquare, dapatkah Anda memperluas hal yang sebenarnya tidak Anda setujui? Saya merujuk pada proses data dan tidak keberatan ada gambar yang menyembunyikan / menunjukkan peluang yang Anda miliki dengan penangan lengkap.
Artem Barger
24

"Chaining" Animasi-acara dengan Callback.

Misalkan Anda ingin menghidupkan paragraf yang hilang setelah mengkliknya. Anda juga ingin menghapus elemen dari DOM sesudahnya. Anda mungkin berpikir Anda dapat dengan mudah mengaitkan metode ini:

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

Dalam contoh ini, .remove () akan dipanggil sebelum .fadeOut () telah selesai, menghancurkan efek gradasi-memudar Anda, dan hanya membuat elemen menghilang secara instan. Alih-alih, saat Anda ingin menjalankan perintah hanya setelah menyelesaikan sebelumnya, gunakan callback:

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

Parameter kedua .fadeOut () adalah fungsi anonim yang akan berjalan setelah animasi .fadeOut () selesai. Ini membuat pemudaran bertahap, dan penghapusan elemen berikutnya.

Sampson
sumber
24

Jika Anda mengikat () acara yang sama beberapa kali, itu akan menyala beberapa kali. Saya biasanya selalu pergi unbind('click').bind('click')hanya untuk aman

Scott Evernden
sumber
2
Ini tidak spesifik untuk jQuery, meskipun hal penting yang perlu diingat.
SolutionYogi
11
Anda dapat menggunakan acara langsung untuk tidak harus mengikat acara yang sama dua kali.
Powerlord
live memiliki masalah (kinerja) sendiri jika digunakan secara berlebihan. Lebih baik dalam 1.3.3 di mana Anda dapat memberikan konteks.
redsquare
23

Jangan menyalahgunakan plug-in.

Sebagian besar waktu Anda hanya perlu perpustakaan dan mungkin antarmuka pengguna. Jika Anda membuatnya sederhana kode Anda akan dapat dipertahankan dalam jangka panjang. Tidak semua plug-in didukung dan dipelihara, sebenarnya sebagian besar tidak. Jika Anda dapat meniru fungsionalitas menggunakan elemen inti saya sangat merekomendasikannya.

Plug-in mudah untuk dimasukkan ke dalam kode Anda, menghemat waktu Anda, tetapi ketika Anda akan membutuhkan sesuatu tambahan, itu ide yang buruk untuk memodifikasinya, karena Anda kehilangan kemungkinan pembaruan. Saat Anda menghemat di awal, Anda akan kehilangan nanti tentang mengubah plug-in yang sudah usang.

Pilih plug-in yang Anda gunakan dengan bijak. Terlepas dari perpustakaan dan antarmuka pengguna, saya selalu menggunakan $ .cookie , $ .form , $ .validate dan thickbox . Selebihnya saya lebih banyak mengembangkan plug-in saya sendiri.

Elzo Valugi
sumber
2
Bagaimana dengan grid? Anda membuat sendiri?
jmav
Iya. dari proyek ke proyek data datang dalam berbagai cara. Saya lebih suka memiliki kontrol penuh yang menyadari bahwa grid hanya membantu saya ke tengah dan kemudian saya harus berimprovisasi.
Elzo Valugi
JIKA {diberikan waktu yang cukup, umumnya saya lebih suka menulis semua kode data-driven-dom-manipulation (css / html) secara langsung. dengan kata lain - jangan meneruskan data ke 'plugin' dan minta itu memuntahkan html. cukup sulit untuk mengevaluasi (lini tengah) plugin untuk kompatibilitas lingkup saat ini, lupakan tuntutan masa depan. berpikir ... desainer, perencana, manajer, manajer, manajer. oh dan klien dan pengguna. tetapi jika Anda memiliki semua hal itu, Anda tidak akan memiliki cukup kata 'waktu'. jadi gunakan saja jqgrid - Anda membuang waktu untuk berunding. apakah sudah selesai?}
user406905
22

Pitfall: Menggunakan loop bukan penyeleksi.

Jika Anda menemukan diri Anda meraih metode jQuery '.each' untuk beralih pada elemen DOM, tanyakan pada diri Anda apakah dapat menggunakan pemilih untuk mendapatkan elemen sebagai gantinya.

Informasi lebih lanjut tentang pemilih jQuery:
http://docs.jquery.com/Selector

Pitfall: JANGAN menggunakan alat seperti Firebug

Firebug praktis dibuat untuk debugging semacam ini. Jika Anda akan bergurau tentang DOM dengan Javascript, Anda memerlukan alat yang bagus seperti Firebug untuk memberi Anda visibilitas.

Informasi lebih lanjut tentang Firebug: http://getfirebug.com/

Gagasan hebat lainnya ada di episode Podcast Polimorfik ini: (jQuery Secrets dengan Dave Ward) http://polymorphicpodcast.com/shows/jquery/

Dan Esparza
sumber
1
Saya sudah melakukan yang pertama berkali-kali. Anda hanya perlu mengingat bahwa sebagian besar fungsi jQuery akan beroperasi pada semua elemen yang dikembalikan dari pemilih.
DisgruntledGoat
Tidak suka metode masing-masing. Jujur saja
Simon Hayter
14

Kesalahpahaman dalam menggunakan pengidentifikasi ini dalam konteks yang benar. Misalnya:

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

Dan inilah salah satu contoh bagaimana Anda bisa menyelesaikannya:

$( "#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.
   })
});
Artem Barger
sumber
1
+1 Lebih banyak masalah javascript daripada masalah jquery, tapi saya sering tersandung oleh ini.
mmacaulay
13

Hindari mencari melalui seluruh DOM beberapa kali. Ini adalah sesuatu yang benar-benar dapat menunda skrip Anda.

Buruk:

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

Baik:

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

Buruk:

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

Baik:

$("#form")
    .find(".text").this().end()
    .find(".int").that().end()
    .find(".choice").method();
googletorp
sumber
2
$ (". aclass"). this (). that (); tidak baik! penyeleksi hanya kelas lambat
redsquare
Ini adalah contoh ilustrasi yang menunjukkan kemampuan Jquery untuk menggunakan beberapa metode pada satu pilihan. Saya membuat seleksi sederhana (dan karenanya lambat) untuk memberikan fokus yang lebih besar pada teknik ini.
googletorp
10
Walaupun menghindari mencari DOM berulang kali adalah hal yang baik - contoh terakhir adalah kekacauan yang tidak dapat dibaca di mana saya tidak tahu apa yang sedang terjadi. Jika Anda berencana untuk menggunakan hasil pengambilan berulang kali, simpan dalam variabel. Itu membuat kode jauh lebih mudah dikelola.
Quentin
12

Selalu cache $ (ini) ke variabel yang bermakna terutama dalam .each ()

Seperti ini

$(selector).each(function () {
    var eachOf_X_loop = $(this); 
})
desain iklan
sumber
12
Gunakan $selfatau $thisjika Anda terlalu malas untuk memikirkan nama variabel yang baik.
gradbot
10

Mirip dengan apa yang dikatakan Repo Man, tetapi tidak cukup.

Ketika mengembangkan ASP.NET winforms, saya sering melakukannya

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

lupa tanda #. Bentuk yang benar adalah

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

Acara

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

tidak mengkloning salah satu peristiwa - Anda harus mengulang semuanya.

Sesuai JP clone (- clone ()) tidak mengulangi peristiwa jika Anda lulus benar.

Chris S
sumber
4
Clone () tidak jika Anda lulus true.
James
Bagaimana dengan live () di jQuery 1.3.2?
jmav
9

Hindari beberapa kreasi objek jQuery yang sama

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

//Cache the obj
function someFunc(){
   var $this = $(this).fadeIn();
   $this.fadeIn();
}
redsquare
sumber
var $ this = $ (this) .fadeIn () ;? Anda sedang menyimpan efek?
Jason
12
ia mengembalikan elemen, yang disebut chaining!
redsquare
Anda dapat mengatur variabel dan melakukan suatu tindakan pada saat yang sama?
Jason
1
Memang, tapi jangan menerima kata-kata saya untuk itu. Cobalah. Bagaimana menurut Anda hal berikut ini mungkin terjadi jika objek jquery yang mewakili elemen tidak dikembalikan? $ ('# divId'). hide (). show (). fadeIn () .... dll
redsquare
14
Itu bekerja, tapi saya pikir itu lebih mudah dibaca $this = $(this);pada baris yang berbeda. Jika Anda dapat (tanpa membuat berantakan), melupakan $thisdan hanya rantai segalanya:$(this).fadeIn().fadeIn();
Patrick McElhaney
8

Saya mengatakan ini untuk JavaScript juga, tetapi jQuery, JavaScript tidak akan pernah menggantikan CSS.

Juga, pastikan situs tersebut dapat digunakan untuk seseorang dengan JavaScript dimatikan (tidak relevan hari ini dengan kembali pada hari itu, tetapi selalu menyenangkan untuk memiliki situs yang sepenuhnya dapat digunakan).

Martin
sumber
6

Membuat terlalu banyak manipulasi DOM. Meskipun metode .html (), .append (), .prepend (), dll. Sangat bagus, karena cara browser merender dan merender ulang halaman, menggunakannya terlalu sering akan menyebabkan perlambatan. Seringkali lebih baik untuk membuat html sebagai string, dan memasukkannya ke DOM satu kali, daripada mengubah DOM beberapa kali.

Dari pada:

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

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

Coba ini:

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

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

$parent.append(html);

Atau bahkan ini ($ wrapper adalah elemen yang baru dibuat yang belum disuntikkan ke DOM. Menambahkan node ke div wrapper ini tidak menyebabkan perlambatan, dan pada akhirnya kami menambahkan $ wrapper ke $ parent, hanya menggunakan satu manipulasi DOM ):

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);
Alex Heyd
sumber
+1 ... Saya menggunakan .html () pada banyak elemen setiap detik. Melihat itu mulai memperlambat semuanya!
User2
5

Menggunakan ClientID untuk mendapatkan id "nyata" dari kontrol dalam proyek ASP.NET.

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

Juga, jika Anda menggunakan jQuery di dalam SharePoint Anda harus memanggil jQuery.noConflict ().

Solusi Data Jacobs
sumber
11
? Bagaimana ini jebakan? Ini solusi untuk perilaku ASP.NET.
SolutionYogi
1
Ya. Ini bukan masalah jQuery. Ini adalah kesalahan dari webforms asp.net.
redsquare
3
Sepakat. Tapi ini adalah sesuatu yang perlu Anda perhatikan saat menggunakan jQuery di ASP.NET.
Jacobs Data Solutions
2
OP tidak menyebutkan asp.net
redsquare
4

Melewati ID alih-alih objek jQuery ke fungsi:

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

myFunc("someId");

Melewati set yang terbungkus jauh lebih fleksibel:

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

myFunc($("#someId")); // or myFunc($(".someClass")); etc.
Craig Stuntz
sumber
3

Penggunaan rantai yang berlebihan.

Lihat ini:

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

Penjelasan

SolutionYogi
sumber
1
Itu terlihat lucu, ini semacam kebingungan.
Dykam
6
Rantai (sendiri) sulit digunakan 'berlebihan'. Sepertinya kode itu menggunakan operator ternary javascript secara berlebihan. Lihat en.wikipedia.org/wiki/Ternary_operation#JavaScript untuk informasi lebih lanjut.
Dan Esparza
3
Saya senang saya tidak harus menjaga kode Anda.
cdmckay
3

Gunakan string akumulator-style

Menggunakan + operator, string baru dibuat dalam memori dan nilai gabungan ditetapkan untuknya. Hanya setelah ini hasilnya ditugaskan ke variabel. Untuk menghindari variabel perantara untuk hasil gabungan, Anda dapat langsung menetapkan hasil menggunakan + = operator. Lambat:

a += 'x' + 'y';

Lebih cepat:

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

Operasi primitif bisa lebih cepat daripada panggilan fungsi

Pertimbangkan untuk menggunakan operasi primitif alternatif di atas pemanggilan fungsi dalam loop dan fungsi kritis kinerja. Lambat:

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

Lebih cepat:

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

Baca Lebih Lanjut di Praktik Terbaik Kinerja JavaScript

Pir Abdul
sumber
1

Jika Anda ingin pengguna melihat entitas html di browser mereka, gunakan 'html' alih-alih 'teks' untuk menyuntikkan string Unicode, seperti:

$('p').html("Your Unicode string")
Patrick J. Anderson
sumber
1

dua sen saya)

Biasanya, bekerja dengan jquery berarti Anda tidak perlu khawatir tentang elemen DOM yang sebenarnya setiap saat. Anda dapat menulis sesuatu seperti ini - $('div.mine').addClass('someClass').bind('click', function(){alert('lalala')})- dan kode ini akan dijalankan tanpa ada kesalahan.

Dalam beberapa kasus ini berguna, dalam beberapa kasus - tidak sama sekali, tetapi itu adalah fakta bahwa jquery cenderung, yah, ramah pertandingan kosong. Namun, replaceWithakan menimbulkan kesalahan jika seseorang mencoba menggunakannya dengan elemen yang bukan milik dokumen. Saya merasa agak kontra-intuitif.

Perangkap lain adalah, menurut pendapat saya, urutan node dikembalikan oleh prevAll () method - $('<div><span class="A"/><span class="B"/><span class="C"/><span class="D"/></div>').find('span:last-child').prevAll(). Sebenarnya bukan masalah besar, tetapi kita harus mengingat fakta ini.

shabunc
sumber
0

Jika Anda berencana untuk Ajax dalam banyak data, misalnya, 1500 baris tabel dengan 20 kolom, maka jangan pernah berpikir untuk menggunakan jQuery untuk memasukkan data itu ke dalam HTML Anda. Gunakan JavaScript biasa. jQuery akan terlalu lambat pada mesin yang lebih lambat.

Juga, separuh waktu jQuery akan melakukan hal-hal yang akan membuatnya lebih lambat, seperti mencoba mengurai tag skrip dalam HTML yang masuk, dan menangani kebiasaan browser. Jika Anda ingin kecepatan penyisipan yang cepat, tetap menggunakan JavaScript biasa.

mkoryak
sumber
1
-1 Fungsi .html () sama cepatnya dengan pendekatan asli
cllpse
semua orang yang downvoting saya jelas belum mencoba memasukkan satu ton DOM di IE dan menonton semuanya menjadi lambat. Alasan jquery lambat adalah tidak hanya menyisipkan dom, ia melakukan beberapa hal lain, seperti memeriksa apakah dom memiliki skrip, dan mengeksekusi mereka jika ada di IE, dan beberapa hal lain yang tidak perlu Anda lakukan jika Anda tahu persis data seperti apa yang Anda sisipkan
mkoryak
1
Selama Anda tidak perlu khawatir tentang kebocoran browser dan semacamnya, .innerHTMLakan cukup. Tetapi jika Anda membangun sesuatu seperti Gmail di mana pengguna menjaga tab terbuka selama berjam-jam, Anda hanya perlu menggigit peluru dan berurusan dengan kelambatan ekstra. Bagi yang penasaran, inilah yang dilakukan jQuery .html(): james.padolsey.com/jquery/#v=1.4&fn=jQuery.fn.html
adamJLev
-1

Menggunakan jQuery dalam proyek kecil yang dapat diselesaikan hanya dengan beberapa baris JavaScript biasa.

vise
sumber
Saya tidak keberatan dipermainkan, tapi tolong bantah pilihan Anda.
catok
8
-1 jQuery mengabstraksikan API yang rusak. Dengan cara ini Anda selalu yakin kode Anda berfungsi. Katakanlah Anda telah menulis beberapa kode menggunakan jQuery dan beberapa bug browser secara acak diperkenalkan dengan versi baru - yang perlu Anda lakukan hanyalah mengimpor versi terbaru dari kerangka kerja jQuery. Lawan harus mencari tahu cara mengatasi bug sendiri.
cllpse
+1 tampaknya masuk akal bagi saya - jika Anda hanya menggunakan beberapa baris, cukup gunakan vanilla JS.
alex
1
@roosteronacid, argumen Anda melenceng. Sangat tidak mungkin bagi browser untuk memperkenalkan regresi dalam skrip dengan kompleksitas yang lebih rendah, atau berurusan dengan masalah crossbrowser dalam hal ini. Dua tahun lalu saya telah bekerja dengan mootool dan dalam keadaan tertentu tidak dapat membaca konten elemen di IE. Setelah beberapa jam tring untuk mencari tahu masalah saya hanya menulis ulang bagian itu dengan js sederhana. Jadi, sebenarnya jQuery lebih mungkin rusak daripada javascript biasa gagal karena peningkatan peramban. Saya akan menyelesaikan bug saya sendiri setiap hari daripada meretas melalui kode perpustakaan.
catok
3
couple of lines of ordinary JavaScriptTentu tidak masalah. Tapi kapan itu terjadi begitu saja? Orang yang mengatakan "mengapa tidak menggunakan vanilla javascript ??" belum digigit cukup keras oleh IE belum ... dan belum lagi berapa banyak kode cruft dan boilerplate Anda harus menulis untuk melakukan hal-hal sederhana di JS tua biasa.
adamJLev
-3

Tidak memahami acara yang mengikat. JavaScript dan jQuery bekerja secara berbeda.

Dengan permintaan populer, sebuah contoh:

Di jQuery:

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

Tanpa jQuery:

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

Pada dasarnya kait yang diperlukan untuk JavaScript tidak lagi diperlukan. Yaitu menggunakan inline markup (onClick, dll) karena Anda bisa menggunakan ID dan kelas yang biasanya dimanfaatkan pengembang untuk keperluan CSS.

Jason
sumber
5
Mau menguraikan? Lebih disukai sebuah contoh?
SolutionYogi
7
Bukankah JavaScript menyediakan addEventListener () dan attachEvent () untuk melakukan ini?
alex
2
pemisahan kekhawatiran, bung. Pisahkan HTML dan JS Anda
Don