Pilih elemen menurut atribut

253

Saya memiliki koleksi kotak centang dengan id yang dihasilkan dan beberapa di antaranya memiliki atribut tambahan. Apakah mungkin menggunakan JQuery untuk memeriksa apakah suatu elemen memiliki atribut tertentu? Misalnya, dapatkah saya memverifikasi jika elemen berikut memiliki atribut "myattr"? Nilai atribut dapat bervariasi.

<input type="checkbox" id="A" myattr="val_attr">A</input>

Misalnya bagaimana saya bisa mendapatkan koleksi semua kotak centang yang memiliki atribut ini tanpa memeriksa satu per satu? Apakah ini mungkin?

Ciprian Grosu
sumber
2
Selain itu, <input /> adalah tag kosong yang tidak dimaksudkan untuk memiliki konten di dalamnya. Mungkin Anda tidak peduli dengan memvalidasi melihat seperti Anda memiliki hadir myatttr ...
ScottE
Jika Anda sudah memiliki koleksi dan Anda ingin memfilter hanya elemen dengan atribut tertentu - lakukan saja -$filtered = $collection.filter('[attribute_name]');
jave.web

Jawaban:

190

Apakah maksud Anda dapat memilihnya? Jika demikian, maka ya:

$(":checkbox[myattr]")
cletus
sumber
4
Perhatikan bahwa jika Anda menguji keberadaan (mungkin dalam pernyataan if, misalnya) mungkin lebih tepat / dapat diandalkan untuk dilakukan: if ($ (": checkbox [myattr]"). Length ()> 0) ...
rinogo
14
@rinogo: sebenarnya yang Anda butuhkan adalah if ($ (": checkbox [myattr]"). length). The () setelah panjangnya tidak diperlukan, juga bukan dari> 0, 0 dievaluasi menjadi false dalam tes kesetaraan yang tidak membutuhkan kesetaraan yang ketat (baik nilai maupun tipe).
bmarti44
1
Ini melempar kesalahan js jika Anda mencoba sesuatu seperti: td [myattr]. Jadi saya pikir fitur ini secara khusus menargetkan kotak centang.
fooledbyprimes
6
Kolon memilih pseudo-class, ditentukan oleh tipe attr. Untuk menerapkan hal yang sama pada td's, hilangkan saja tanda titik dua.
dhochee
Atau jika Anda ingin melihat apakah sesuatu tidak memiliki atribut seperti temukan semua tautan yang tidak memiliki hrefatribut. $("#myBox").find('a').filter(':not([href])')
timbrown
368
if ($('#A').attr('myattr')) {
    // attribute exists
} else {
    // attribute does not exist
}

EDIT:

Di atas akan jatuh ke- elsecabang ketika myattrada tetapi string kosong atau "0". Jika itu masalah, Anda harus mengujinya secara eksplisit undefined:

if ($('#A').attr('myattr') !== undefined) {
    // attribute exists
} else {
    // attribute does not exist
}
Stefan Gehrig
sumber
3
Bukan jawaban yang bagus. "undefined" bukan kata kunci dalam Javascript. Lihat constc.blogspot.com/2008/07/...
mhenry1384
16
Anda benar ... Tetapi mendefinisikan ulang undefineddianggap sebagai tepi kasus dan perbandingan di atas akan bekerja di 99% dari semua kasus.
Stefan Gehrig
6
Tidak berfungsi jika atribut memiliki string kosong. Contohnya adalah myattr = ''
mythicalprogrammer
3
@mhenry - maka Anda akan salah :) Jika Anda membangun proyek untuk saya atau bersama saya, saya akan meminta Anda untuk memperbaiki kesalahan Anda. Jika itu adalah paket open source maka saya (bersama dengan banyak pengguna) akan berhenti menggunakannya berdasarkan pada alasan bahwa itu adalah kode yang buruk. Jika Anda tidak mengubahnya maka orang lain pada akhirnya akan membayar versi tanpa kesalahan dan orang-orang akan menggunakannya, dan Anda akan kehilangan proyek Anda sendiri, seperti yang terjadi berkali-kali sebelumnya ketika seseorang membuat paket yang merupakan ide bagus dengan implementasi yang buruk. Either way itu akan mengajarkan Anda sebuah pelajaran tentang praktik pengkodean :)
Jimbo Jonny
8
if (typeof $ ('# A'). attr ('myattr')! == 'undefined')
James Westgate
166

Saya tahu ini sudah lama sejak pertanyaan diajukan, tetapi saya menemukan cek menjadi lebih jelas seperti ini:

if ($("#A").is('[myattr]')) {
    // attribute exists
} else {
    // attribute does not exist
}

(Seperti yang ditemukan di situs ini di sini )

Dokumentasi tentang ini dapat ditemukan di sini

Jonathan Bergeron
sumber
Menurut W3C, atribut boolean didefinisikan oleh ada atau tidak adanya atribut. jQuery menyediakan metode .attr () untuk memanipulasi nilai atribut. Tetapi bagaimana kita menambahkan atribut tanpa nilai? Metode yang Anda berikan untuk menguji keberadaan atribut tidak dijelaskan dalam dokumentasi jQuery (1.8.2). Apakah Anda tahu cara menambahkan atribut dengan jQuery?
chmike
@chmike Untuk menambahkan atribut, saya akan melakukannya dengan cara ini: $ ("# A"). prop ("myNewAttribute", someValue); Anda dapat memberikan beberapa Nilai nilai apa pun pilihan Anda: string, angka, string kosong, benar / salah.
Jonathan Bergeron
Ini akan menambahkan atribut dengan nilai yang diberikan yang tidak sama dengan atribut tanpa nilai.
chmike
5
Saya setuju, ini adalah jawaban terbaik (menggunakan jQuery) - sangat jelas dan ringkas. Saya menemukan diri saya bertanya-tanya mengapa jQuery tidak hanya memiliki fungsi hasAttribute (), dan jawabannya adalah, bahwa javascript asli sudah memilikinya. Setiap Elemen HTML Dom memiliki metode hasAttribute ('attributeName'). Jadi Anda dapat melakukan: $ ('# A') [0] .hasAttribute ('myattr') @chmike - Saya tidak berpikir Anda dapat menambahkan atribut kosong menggunakan fungsi jQuery, tetapi Anda dapat melakukannya dengan Elemen Dom HTML objek dengan cara yang sama seperti berikut: $ ("# A") [0] .setAttributeNode (document.createAttribute ("myNewAttribute"));
Daniel Howard
1
Hanya komentar yang saya suka jawaban ini, tetapi bingung tentang komentar yang bertanya bagaimana cara menambahkan atribut tanpa nilai. Ini tidak terkait dengan pertanyaan atau jawabannya.
selamat tinggal
9

Ini akan berhasil:

$('#A')[0].hasAttribute('myattr');
powermikee
sumber
2
lihat tautan: stackoverflow.com/questions/1318076/…
RetroCoder
@ RetroCoder, apa gunanya tautan Anda? Tes ini tampaknya cukup baik, terutama karena sering Anda gunakan $(this).<something>ketika di sini Anda dapat melakukan this.hasAttribute('...')secara langsung (dan tentu saja tidak peduli dengan peramban yang lebih tua).
Alexis Wilke
8

Dalam JavaScript, ...

null == undefined

... mengembalikan true*. Perbedaan antara ==dan ===. Juga, nama undefineddapat didefinisikan (itu bukan kata kunci seperti nullapa) sehingga Anda lebih baik memeriksa beberapa cara lain. Cara yang paling dapat diandalkan adalah membandingkan nilai balik typeofoperator.

typeof o == "undefined"

Namun demikian, membandingkan dengan nol harus berhasil dalam kasus ini.

* Dengan asumsi undefinedsebenarnya tidak terdefinisi.

bambam
sumber
Undefined bukan kata kunci yang disediakan dalam JavaScript. Dalam jQuery dimungkinkan munging namanya persis karena itu dibangun dengan konstruktor "var" dan tidak dihargai. Di atas kode perpustakaan ajaib, infact, ada baris yang menyatakan "var undefined;" dan dengan cara ini variabel yang tidak terdefinisi didefinisikan dengan nama itu dalam ruang lingkup jQuery ... Tetapi semuanya bisa saja dinamai "tanpa nama" dengan mengetikkan "var tanpa nama;"
Emanuele Del Grande
1
Ini tidak memeriksa atribut, ini memeriksa properti di objek javascript mengapa ini memiliki 6 upvote?
ncubica
5

$("input[attr]").length mungkin opsi yang lebih baik.

ssps
sumber
4

Beberapa ide dilontarkan menggunakan "typeof", jQuery ".is" dan ".filter" jadi saya pikir saya akan memposting perbandingan cepat dari mereka. Typeof tampaknya menjadi pilihan terbaik untuk ini. Sementara yang lain akan bekerja, tampaknya ada perbedaan kinerja yang jelas ketika meminta pustaka jq untuk upaya ini.

Daved
sumber
2
if (!$("#element").attr('my_attr')){
  //return false
  //attribute doesn't exists
}
Kemarahan
sumber
1
ini mungkin tidak akan berhasil, karena Anda dapat menambahkan atribut tanpa nilai. dalam kasus seperti itu, kondisi ini akan berlalu, meskipun perilaku yang diinginkan dapat mengembalikan true, atribut ditetapkan. mirip dengan PHP isset()atau misalnya dalam js $("#element").attr('my_attr') === false,
ulkas
2

seperti pada posting ini , menggunakan .isdan pemilih atribut [], Anda dapat dengan mudah menambahkan fungsi (atau prototipe):

function hasAttr($sel,attr) {
    return $sel.is('['+attr+']');
}
dhc
sumber
1
$("input#A").attr("myattr") == null
Mathias F
sumber
1
$ (). attr () tidak akan mengembalikan nol seperti yang disarankan oleh contoh kami, sebaliknya ia akan kembali tidak terdefinisi.
Stefan Gehrig
Bekerja untuk saya di pembakar, tapi itu mungkin hal pembakar
Mathias F
Belum mencobanya, tapi itulah yang dikatakan dalam dokumentasi: docs.jquery.com/Attributes/attr#name
Stefan Gehrig
1

secara sederhana:

$('input[name*="value"]')

info lebih lanjut: dokumen resmi

Kambiz
sumber
1
Kutipan ganda tidak terhapuskan dalam string yang didefinisikan dengan tanda kutip ganda, bukan string yang valid. Sayangnya saya tidak dapat mengeditnya untuk Anda karena hasil edit harus diubah 6 karakter atau lebih, perlu diubah.
Jimbo Jonny
0

Selain memilih semua elemen dengan atribut $('[someAttribute]')atau $('input[someAttribute]')Anda juga dapat menggunakan fungsi untuk melakukan pemeriksaan boolean pada objek seperti dalam penangan klik:

if(! this.hasAttribute('myattr') ) { ...

AaronLS
sumber
0

Saya telah membuat paket npm dengan perilaku yang dimaksudkan seperti dijelaskan di atas dalam pertanyaan.

Tautan ke [npm] dan [github]

Penggunaannya sangat sederhana. Sebagai contoh:

<p id="test" class="test">something</p>
$("#test").hasAttr("class")

mengembalikan true.

Bekerja dengan camelcase juga.

Shoter
sumber
0

Untuk memilih elemen yang memiliki atribut tertentu, lihat jawaban di atas.

Untuk menentukan apakah elemen jQuery yang diberikan memiliki atribut spesifik, saya menggunakan plugin kecil yang mengembalikan truejika elemen pertama dalam koleksi ajQuery memiliki atribut ini:

/** hasAttr
 ** helper plugin returning boolean if the first element of the collection has a certain attribute
 **/
$.fn.hasAttr = function(attr) {
   return 0 < this.length
       && 'undefined' !== typeof attr
       && undefined !== attr
       && this[0].hasAttribute(attr)
}
ErnestV
sumber
-5

JQuery akan mengembalikan atribut sebagai string. Oleh karena itu Anda dapat memeriksa panjang string itu untuk menentukan apakah diset:

if ($("input#A").attr("myattr").length == 0)
 return null;
else
 return $("input#A").attr("myattr");
zach
sumber
Jadi, saya tahu ini sudah lebih dari setahun dan saya harus mengatasinya sejak lama. Saya ingin tahu tentang bagian mana yang tidak berfungsi? Jika saya tahu Anda hanya mencoba untuk memilih mereka, saya tidak akan memberikan kode di atas. Saya pikir Anda ingin memeriksanya secara individual. JQuery sebenarnya mengembalikan atribut sebagai string dan Anda dapat memeriksa panjang string itu sama seperti string lainnya. Jadi selama pemilih dan atribut Anda benar, Anda seharusnya dapat menguji untuk melihat apakah input tertentu memiliki atribut itu. Lagi pula, saya hanya tidak ingin orang mengabaikan prinsip karena itu berhasil.
Zach
6
itu akan gagal dalam kasus di mana atribut tidak hadir dalam kasus $ ("input # A"). attr ("myattr") mengembalikan undefined daripada string dan undefined.length akan gagal
Rune FS
Hanya mendeteksi atribut kosong vs. atribut dengan konten, gagal pada atribut yang tidak ada. Pertanyaan aslinya adalah tentang mendeteksi keberadaan atribut, menjadikannya gagal sebagai jawaban atas pertanyaan.
Jimbo Jonny