Dengan javascript bagaimana saya bisa menambahkan parameter string kueri ke url jika tidak ada atau jika ada, perbarui nilai saat ini? Saya menggunakan jquery untuk pengembangan sisi klien saya.
javascript
jquery
query-string
amatir
sumber
sumber
String#split
mengambil parameter kedua untuk pemisahan maksimum. jQuerymap
juga akan sangat membantu.Jawaban:
Saya menulis fungsi berikut yang mencapai apa yang ingin saya capai:
sumber
[?|&]
seharusnya[?&]
var
sesaat sebelum deklarasi pemisah.value = encodeURIComponent(value);
di baris pertama, jika tidak, jeda baris tidak lolos dengan benar.Saya telah memperluas solusi dan menggabungkannya dengan yang lain yang saya temukan untuk mengganti / memperbarui / menghapus parameter querystring berdasarkan input pengguna dan mempertimbangkan jangkar url sebagai pertimbangan.
Tidak memasok nilai akan menghapus parameter, memasok satu akan menambah / memperbarui parameter. Jika tidak ada URL yang diberikan, itu akan diambil dari window.location
Memperbarui
Ada bug ketika menghapus parameter pertama dalam querystring, saya telah mengerjakan ulang regex dan tes untuk memasukkan perbaikan.
Pembaruan Kedua
Seperti yang disarankan oleh @ JarónBarends - Tweak memeriksa nilai untuk memeriksa terhadap tidak terdefinisi dan nol untuk memungkinkan pengaturan nilai 0
Pembaruan Ketiga
Ada bug di mana menghapus variabel querystring langsung sebelum tagar akan kehilangan simbol tagar yang telah diperbaiki
Pembaruan Keempat
Terima kasih @rooby untuk menunjukkan optimasi regex di objek RegExp pertama. Setel regex awal ke ([? &]) Karena ada masalah dengan penggunaan (\? | &) Yang ditemukan oleh @YonatanKarni
Pembaruan Kelima
Menghapus mendeklarasikan hash var di pernyataan if / else
sumber
value
akan menyebabkan ini untuk menghapus variabel dari querystring ketika Anda menetapkan nilainya menjadi 0. jadi alih-alihif (value) {}
Anda harus menggunakanif (typeOf value !== 'undefined' && value !== null) {}
hash
dinyatakan dua kali;)The URLSearchParams utilitas dapat berguna untuk ini dalam kombinasi dengan
window.location.search
. Sebagai contoh:Sekarang
foo
telah diatur untukbar
terlepas dari apakah sudah ada atau belum.Namun, penugasan di atas
window.location.search
akan menyebabkan pemuatan halaman, jadi jika itu tidak diinginkan, gunakan API Sejarah sebagai berikut:Sekarang Anda tidak perlu menulis regex atau logika Anda sendiri untuk menangani kemungkinan keberadaan string kueri.
Namun, dukungan browser buruk karena saat ini masih eksperimental dan hanya digunakan dalam versi terbaru dari Chrome, Firefox, Safari, iOS Safari, Browser Android, Android Chrome dan Opera. Gunakan dengan polyfill jika Anda memutuskan untuk menggunakannya.
Pembaruan: Dukungan browser telah meningkat sejak jawaban awal saya.
sumber
Unable to set property '__URLSearchParams__:0.8503766759030615' of undefined or null reference
pada ie11 Anda mendapatkan kesalahan itu. itu bukan pollyfill jika tidak berfungsi sebagai fallback.newRelativePathQuery
var newRelativePathQuery = window.location.pathname + '?' + searchParams.toString() + window.location.hash;
Berdasarkan jawaban @ amatir (dan sekarang memasukkan perbaikan dari komentar @j_walker_dev), tetapi dengan mempertimbangkan komentar tentang tag hash di url saya menggunakan yang berikut:
Diedit untuk diperbaiki
[?|&]
di regex yang tentu saja harus[?&]
seperti yang ditunjukkan dalam komentarSunting: Versi alternatif untuk mendukung penghapusan params URL juga. Saya telah menggunakan
value === undefined
sebagai cara untuk menunjukkan penghapusan. Bisa menggunakanvalue === false
atau bahkan param input terpisah seperti yang diinginkan.Lihat beraksi di https://jsfiddle.net/bp3tmuxh/1/
sumber
var separator
garis ke kanan di atas pengembalian memperbaiki bug dengan "/ app # / cool? Fun = true". Ini akan memilih "&" sebagai pemisah meskipun belum ada params string kueri yang sebenarnya. Hanya klien.[?|&]
harus adil[?&]
(jika tidak akan cocok|
)."([?|&])"
itu tidak baik. Harap perbaiki ini sebagai salah satuvar re = new RegExp("(?|&)" + key + "=.*?(&|#|$)", "i");
atauvar re = new RegExp("([?&])" + key + "=.*?(&|#|$)", "i");
(ekstensi yang bagus dengan cara lain!)var re = new RegExp("(?|&)" + key + "=.*?(&|#|$)", "i");
tidak berfungsi, yang kedua tidakInilah perpustakaan saya untuk melakukan itu: https://github.com/Mikhus/jsurl
sumber
Saya menyadari pertanyaan ini sudah lama dan sudah dijawab sampai mati, tapi inilah yang saya lakukan. Saya mencoba menemukan kembali roda di sini karena saya menggunakan jawaban yang saat ini diterima dan kesalahan penanganan fragmen URL baru-baru ini menggigit saya dalam sebuah proyek.
Fungsinya di bawah. Ini cukup panjang, tetapi dibuat untuk menjadi sekuat mungkin. Saya ingin saran untuk memperpendek / memperbaikinya. Saya mengumpulkan test suite jsFiddle kecil untuk itu (atau fungsi serupa lainnya). Jika suatu fungsi dapat lulus semua tes di sana, saya katakan itu mungkin baik untuk pergi.
Pembaruan: Saya menemukan fungsi keren untuk menggunakan DOM untuk mem-parsing URL , jadi saya memasukkan teknik itu di sini. Itu membuat fungsi lebih pendek dan lebih dapat diandalkan. Alat peraga untuk penulis fungsi itu.
sumber
window.location.search adalah baca / tulis.
Namun - memodifikasi string kueri akan mengarahkan ulang halaman Anda dan menyebabkan penyegaran dari server.
Jika apa yang Anda coba lakukan adalah mempertahankan status sisi klien (dan berpotensi menjadikannya mampu bookmark), Anda ingin memodifikasi hash URL alih-alih string kueri, yang membuat Anda tetap berada di halaman yang sama (window.location. hash dibaca / tulis). Ini adalah bagaimana situs web seperti twitter.com melakukan ini.
Anda juga ingin tombol kembali berfungsi, Anda harus mengikat acara javascript ke acara perubahan hash, sebuah plugin yang bagus untuk itu adalah http://benalman.com/projects/jquery-hashchange-plugin/
sumber
Jika tidak disetel atau ingin diperbarui dengan nilai baru yang dapat Anda gunakan:
Omong-omong, ini dalam Javascript sederhana.
EDIT
Anda mungkin ingin mencoba menggunakan plugin kueri-objek jquery
sumber
Inilah pendekatan saya:
location.params()
Fungsi (ditampilkan di bawah) dapat digunakan sebagai pengambil atau penyetel. Contoh:URL yang diberikan adalah
http://example.com/?foo=bar&baz#some-hash
,location.params()
akan kembali objek dengan semua parameter query:{foo: 'bar', baz: true}
.location.params('foo')
akan kembali'bar'
.location.params({foo: undefined, hello: 'world', test: true})
akan mengubah URL menjadihttp://example.com/?baz&hello=world&test#some-hash
.Berikut adalah
params()
fungsinya, yang secara opsional dapat ditugaskan kewindow.location
objek.sumber
Ini adalah preferensi saya, dan itu mencakup kasus-kasus yang dapat saya pikirkan. Adakah yang bisa memikirkan cara untuk menguranginya menjadi satu penggantian?
sumber
Saya tahu ini cukup lama tetapi saya ingin memecat versi kerja saya di sini.
CATATAN Ini adalah versi modifikasi dari @elreimundo
sumber
Saya ambil dari sini (kompatibel dengan "gunakan ketat"; tidak benar-benar menggunakan jQuery):
Contoh penggunaan:
sumber
Berdasarkan jawaban yang diberikan @ellemayo, saya menemukan solusi berikut yang memungkinkan untuk menonaktifkan tag hash jika diinginkan:
Sebut saja seperti ini:
Hasil dalam:
sumber
typeof value !== 'undefined' && value !== null
lebih eksplisit, tetapivalue != null
berarti hal yang sama dan lebih ringkas.Ini adalah versi yang lebih singkat yang harus diperhatikan
Kode:
The regex deskripsi dapat ditemukan di sini .
CATATAN : Solusi ini didasarkan pada jawaban @amateur, tetapi dengan banyak peningkatan.
sumber
Kode yang menambahkan daftar parameter ke url yang ada menggunakan ES6 dan jQuery:
Di mana listOfParams berada
Contoh Penggunaan:
Tes cepat:
sumber
Pendekatan yang berbeda tanpa menggunakan ekspresi reguler . Mendukung jangkar 'hash' di akhir url serta beberapa tanda tanya (?). Seharusnya sedikit lebih cepat daripada pendekatan ekspresi reguler.
sumber
Gunakan fungsi ini untuk menambah, menghapus, dan mengubah parameter string kueri dari URL berdasarkan jquery
Tambahkan yang baru dan ubah parameter yang ada ke url
Hapus yang ada
sumber
Dengan menggunakan
jQuery
bisa kita lakukan seperti di bawah iniDalam variabel
new_url
kita akan memiliki parameter kueri baru.Referensi: http://api.jquery.com/jquery.param/
sumber
Untuk memberikan contoh kode untuk memodifikasi
window.location.search
seperti yang disarankan oleh Gal dan tradyblix:sumber
Kode skrip Java untuk menemukan string kueri tertentu dan mengganti nilainya *
sumber
Ya saya punya masalah di mana querystring saya akan meluap dan menggandakan, tapi ini karena kelesuan saya sendiri. jadi saya bermain sedikit dan mengerjakan beberapa js jquery (sebenarnya sizzle) dan C # magick.
Jadi saya baru menyadari bahwa setelah server selesai dengan nilai yang diteruskan, nilai tidak masalah lagi, tidak ada penggunaan kembali, jika klien ingin melakukan hal yang sama ternyata akan selalu menjadi permintaan baru, bahkan jika itu adalah parameter yang sama dilewatkan. Dan itu semua sisi klien, sehingga beberapa caching / cookies dll bisa menjadi keren dalam hal itu.
JS:
HTML:
C #:
Tidak ada duplikat, setiap permintaan seunik Anda memodifikasinya, dan karena cara ini disusun, mudah untuk menambahkan lebih banyak permintaan secara dinamis dari dalam dom.
sumber
Berikut adalah metode alternatif menggunakan properti inbuilt dari elemen HTML anchor:
sumber
jika Anda ingin mengatur beberapa parameter sekaligus:
fungsi yang sama dengan @ amatir
jika jslint memberi Anda kesalahan, tambahkan ini setelah for for
sumber
http://abc.def/?a&b&c
).Ada banyak jawaban yang aneh dan rumit pada halaman ini. Nilai tertinggi, @ amatir, cukup baik, meskipun memiliki sedikit bulu yang tidak perlu di RegExp. Ini adalah solusi yang sedikit lebih optimal dengan pembersih RegExp dan
replace
panggilan pembersih :Sebagai bonus tambahan, jika
uri
bukan string, Anda tidak akan mendapatkan kesalahan karena mencoba meneleponmatch
ataureplace
pada sesuatu yang mungkin tidak menerapkan metode tersebut.Dan jika Anda ingin menangani kasus hash (dan Anda sudah melakukan pemeriksaan untuk HTML yang diformat dengan benar), Anda dapat memanfaatkan fungsi yang ada alih-alih menulis fungsi baru yang berisi logika yang sama:
Atau Anda dapat membuat sedikit perubahan pada jawaban @ Adam yang luar biasa:
sumber
separator
tidak didefinisikan dalamupdateQueryStringParamsNoHash
. DalamupdateQueryStringParameter
, semuanya rusak jika parameter yang Anda ganti tidak diberi nilai (misalnyahttp://abc.def/?a&b&c
).Ini harus melayani tujuan:
sumber