Apa perbedaan antara window.location = dan window.location.replace ()?

Jawaban:

408

window.location menambahkan item ke riwayat Anda sehingga Anda dapat (atau seharusnya bisa) mengklik "Kembali" dan kembali ke halaman saat ini.

window.location.replace mengganti item riwayat saat ini sehingga Anda tidak dapat kembali ke sana.

Lihat window.location:

assign(url): Muat dokumen di URL yang disediakan.

replace(url): Ganti dokumen saat ini dengan yang ada di URL yang disediakan. Perbedaan dari assign()metode ini adalah bahwa setelah menggunakan replace()halaman saat ini tidak akan disimpan dalam riwayat sesi, yang berarti pengguna tidak akan dapat menggunakan tombol Kembali untuk menavigasi ke sana.

Oh dan secara umum:

window.location.href = url;

disukai:

window.location = url;
cletus
sumber
52
Mengapa window.location.hrefdisukai window.location?
Mathias Bynens
13
Diskusi di sini: stackoverflow.com/questions/2383401/…
selamat tinggal
1
Pertanyaan - Jika saya menggunakan window.location.replace(URL)URL yang persis sama dengan URL saat ini, dapatkah saya berharap untuk me-refresh / memuat ulang atau apakah ada opsi untuk tidak melakukan apa-apa?
user9645
11

TLDR;

gunakan location.hrefatau gunakan lebih baik window.location.href;

Namun jika Anda membaca ini, Anda akan mendapatkan bukti yang tidak dapat disangkal.

Sebenarnya itu boleh saja digunakan tetapi mengapa melakukan hal-hal yang dipertanyakan. Anda harus mengambil jalan yang lebih tinggi dan lakukan saja dengan cara yang mungkin harus dilakukan.

location = "#/mypath/otherside"
var sections = location.split('/')

Kode ini benar-benar sintaksis-bijaksana, logika-bijaksana, tipe-bijaksana Anda tahu satu-satunya hal yang salah dengan itu?

itu locationbukanlocation.href

bagaimana dengan ini

var mystring = location = "#/some/spa/route"

apa nilainya mystring? apakah ada yang benar-benar tahu tanpa melakukan tes. Tidak ada yang tahu apa yang sebenarnya akan terjadi di sini. Persetan saya baru saja menulis ini dan saya bahkan tidak tahu apa fungsinya. locationadalah sebuah objek tetapi saya menugaskan sebuah string apakah akan meneruskan string atau melewatkan objek lokasi. Katakanlah ada beberapa jawaban untuk bagaimana ini harus dilaksanakan. Bisakah Anda menjamin semua browser akan melakukan hal yang sama?

Ini saya bisa menebak semua browser akan menangani hal yang sama.

var mystring = location.href = "#/some/spa/route"

Bagaimana jika Anda menempatkan ini dalam naskah yang akan rusak karena kompiler jenis akan mengatakan ini seharusnya menjadi objek?

Namun percakapan ini jauh lebih dalam dari sekedar locationobjek. Konversi apa ini tentang programmer seperti apa yang Anda inginkan?

Jika Anda mengambil jalan pintas ini, ya itu mungkin baik-baik saja hari ini, kamu mungkin baik-baik saja besok, neraka mungkin baik-baik saja selamanya, tetapi Anda sekarang menjadi programmer yang buruk. Ini tidak akan apa-apa untuk Anda dan itu akan mengecewakan Anda.

Akan ada lebih banyak objek. Akan ada sintaks baru.

Anda mungkin mendefinisikan pengambil yang hanya mengambil string tetapi mengembalikan objek dan bagian terburuknya adalah Anda akan berpikir Anda melakukan sesuatu yang benar, Anda mungkin berpikir Anda brilian untuk metode pintar ini karena orang-orang di sini telah memalukan Anda.

var Person.name = {first:"John":last:"Doe"}
console.log(Person.name) // "John Doe"

Dengan getter dan setter, kode ini akan benar-benar berfungsi, tetapi hanya karena itu bisa dilakukan tidak berarti itu 'WISE' untuk melakukannya.

Kebanyakan orang yang memprogram suka untuk memprogram dan suka untuk menjadi lebih baik. Selama beberapa tahun terakhir saya menjadi cukup baik dan belajar banyak. Hal terpenting yang saya tahu sekarang terutama ketika Anda menulis Perpustakaan adalah konsistensi dan prediktabilitas.

Lakukan hal-hal yang dapat Anda lakukan secara konsisten.

+"2"<- ini di sini mem-parsing string ke nomor. haruskah kamu menggunakannya? atau yang harus Anda gunakan parseInt("2")?

bagaimana var num =+"2"?

Dari apa yang telah Anda pelajari, dari pikiran stackoverflow saya tidak terlalu berharap.

Jika Anda mulai mengikuti 2 kata ini konsisten dan dapat diprediksi. Anda akan tahu jawaban yang tepat untuk banyak pertanyaan di stackoverflow.

Mari saya tunjukkan bagaimana ini terbayar. Biasanya saya letakkan ;di setiap baris javascript yang saya tulis. Saya tahu ini lebih ekspresif. Saya tahu ini lebih jelas. Saya telah mengikuti aturan saya. Suatu hari saya memutuskan untuk tidak melakukannya. Mengapa? Karena begitu banyak orang mengatakan kepada saya bahwa itu tidak diperlukan lagi dan JavaScript dapat melakukannya tanpa itu. Jadi apa yang saya putuskan untuk melakukan ini. Sekarang karena saya telah menjadi yakin akan diri saya sebagai seorang programmer (seperti Anda harus menikmati buah dari penguasaan bahasa) saya menulis sesuatu yang sangat sederhana dan saya tidak memeriksanya. Saya menghapus satu koma dan saya pikir saya tidak perlu menguji ulang untuk hal sederhana seperti menghilangkan satu koma.

Saya menulis sesuatu yang mirip dengan ini di ES6 dan Babel

var a = "hello world"
(async function(){
  //do work
})()

Kode ini gagal dan butuh waktu lama untuk mencari tahu. Untuk beberapa alasan apa yang dilihatnya

var a = "hello world"(async function(){})()

tersembunyi jauh di dalam kode sumber itu mengatakan kepada saya "halo dunia" bukan fungsi.

Untuk lebih menyenangkan, simpul tidak menampilkan peta sumber kode yang diubah.

Menghabiskan begitu banyak waktu bodoh. Saya juga mempresentasikan kepada seseorang tentang bagaimana ES6 brilian dan kemudian saya harus mulai debugging dan menunjukkan bagaimana ES6 bebas sakit kepala dan lebih baik. Tidak meyakinkan itu.

Saya harap ini menjawab pertanyaan Anda. Ini menjadi pertanyaan lama lebih untuk generasi masa depan, orang-orang yang masih belajar.

Pertanyaan ketika orang mengatakan itu tidak masalah cara baik bekerja. Peluang orang bijak yang lebih bijaksana akan memberi tahu Anda hal-hal bijak lainnya.

bagaimana jika seseorang menimpa objek lokasi. Mereka akan melakukan shim untuk browser lama. Ini akan mendapatkan beberapa fitur baru yang perlu di-shim dan kode 3 tahun Anda akan gagal.

Catatan terakhir saya untuk direnungkan.

Menulis kode yang bersih dan jelas bertujuan melakukan sesuatu untuk kode Anda yang tidak dapat dijawab dengan benar atau salah. Apa yang dilakukannya adalah membuat kode Anda enabler.

Anda dapat menggunakan lebih banyak plugin hal-hal, Perpustakaan tanpa takut gangguan antara kode.

untuk catatan. menggunakan

window.location.href

Lpc_dark
sumber
24
Jawaban informatif yang panjang, penuh semangat. Tetapi dalam berdebat untuk penggunaan window.location.hreflebih window.location, Anda lupa pertanyaan itu sebenarnya menanyakan perbedaan antara ini danwindow.location.replace()
AntonChanning
10
Kapan pun saya melihat TLDR, saya mengharapkan jawaban SHORTER, bukan yang lebih panjang 5x.
user9645
3
TLDR; use location.href or better use window.location.href; TLDR adalah baris ini. Sisanya adalah "jawaban".
Elysiumplain
Saya tidak berpikir Anda membuat poin yang valid dengan memperkenalkan kasus penggunaan yang tidak umum. yaitu mystring = location.href = "#/some/spa/route". Selain itu, banyak bahasa akan memungkinkan (tersirat) mengetikkan beberapa cara. Pada akhirnya, javascript adalah bahasa yang diketik secara dinamis, meletakkan konsep tipe di atasnya dan mengatakan itu tidak baik tidak ada artinya.
apel apel
1
bagaimana jika seseorang menimpa objek lokasi . baik, seperti mengatakan bagaimana jika seseorang menimpa consoleatau membayangi window- Sekarang Anda memiliki masalah yang lebih besar .
apel apel