Haruskah keduanya merujuk objek yang sama?
Haruskah keduanya merujuk objek yang sama?
Jawaban:
Menurut W3C, mereka sama. Pada kenyataannya, untuk keamanan lintas browser, Anda harus menggunakan window.location
daripada document.location
.
window.location
) tanpa memberikan alasan apa pun untuknya. Jika Anda tidak akan memberikan justifikasi, mengapa orang harus menerima saran Anda? Jawaban Christoph jauh lebih berguna dalam hal ini.
Cara kanonik untuk mendapatkan objek lokasi saat ini adalah window.location
(lihat halaman MSDN ini dari 1996 dan draft W3C dari 2006 ).
Bandingkan ini dengan document.location
, yang awalnya hanya mengembalikan URL saat ini sebagai string (lihat halaman ini di MSDN ). Mungkin untuk menghindari kebingungan, document.location
diganti dengan document.URL
(lihat di sini di MSDN ), yang juga merupakan bagian dari DOM Level 1 .
Sejauh yang saya tahu, semua browser modern peta document.location
untuk window.location
, tapi aku masih lebih suka window.location
seperti itulah apa yang telah digunakan sejak saya menulis DHTML pertama saya.
window.location
, bukankah sama-sama berlaku untuk hanya menggunakan location
?
window
objek. Dengan demikian, setiap variabel atau fungsi yang Anda tetapkan di tingkat atas skrip Anda, adalah properti dari objek yang dirujuk oleh window
, yang kebetulan merupakan objek global. Objek global tersirat ketika tidak ada suka window.
- dengan demikian location
ditafsirkan sebagai window.location
. Peringatan - fe if(an_undefined_variable)
akan membuat kesalahan jika variabel tidak didefinisikan - if(window.an_undefined_variable)
tidak akan.
window.location adalah baca / tulis pada semua browser yang sesuai.
document.location hanya baca di Internet Explorer (setidaknya), tetapi baca / tulis di browser berbasis Gecko (Firefox, SeaMonkey).
document.location
hanya baca di IE. Saya dapat berhasil menetapkannya di IE 10, 9, 8 dan 6 (menggunakan VM dari modern.ie ).
console.log(location);
? !!
document.location
pada awalnya adalah properti hanya-baca, meskipun browser Gecko memungkinkan Anda untuk menugaskannya juga. Untuk keamanan lintas-browser, gunakan window.location
saja.
Baca lebih lajut:
Menariknya, jika Anda memiliki bingkai, gambar, atau formulir bernama 'lokasi', maka 'document.location' masing-masing memberikan referensi ke jendela bingkai, gambar, atau formulir, alih-alih objek Lokasi. Rupanya, ini karena document.forms, document.images, dan lookup nama koleksi window.frames mendapat prioritas di atas pemetaan ke window.location.
<img name='location' src='location.png'>
if (document.location.tagName == 'IMG') alert('Hello!')
window.location
dan document.location
tidak dapat dibayangi di Chrome atau Firefox.
Sejauh yang saya tahu, keduanya sama. Untuk keamanan lintas browser, Anda dapat menggunakan window.location
daripada document.location
.
Semua browser modern peta document.location
untuk window.location
, tapi aku masih lebih suka window.location
seperti itulah apa yang telah digunakan sejak saya menulis halaman web pertama saya. ini lebih konsisten.
Anda juga dapat melihat document.location === window.location
pengembalian true
, yang mengklarifikasi bahwa keduanya sama.
document.location === window.location
kembali true
juga
document.location.constructor === window.location.constructor
adalah true
Catatan: Baru diuji pada, Firefox 3.6, Opera 10 dan IE6
===
dan ==
setara.
"abc" == new String("abc")
kembali true
sambil "abc" === new String("abc")
kembali false
.
==
dan ===
setara. Lihat bagian spesifikasi 11.9.3 dan 11.9.6. Untuk nilai-nilai non-null, non-undefined, non-number, non-bool, non-string dengan tipe yang sama, ==
perilaku diatur oleh 11.9.3 bagian 1f, dan ===
perilaku oleh 11.9.6 bagian 7, yang secara identik membaca Return true
jika x dan y merujuk ke objek yang sama. Kalau tidak, kembalilah false
.
document.location
dan window.location
yang menunjuk ke objek. Anda melewatkan seluruh poin triple sama dengan; menggunakan 2 sama dengan tidak membuktikan bahwa mereka adalah objek yang sama. Kita harus menggunakan 3 sama dengan dan bukan 2 sama dengan karena 2 sama dengan akan memberi kita positif palsu. Pada browser di mana document.location adalah string URL sama dengan window.location.toString()
, Kemudian document.location==window.location
akan mengembalikan true sementara document.location===window.location
akan mengembalikan false.
document.location === window.location
perbandingan berjalan. Fakta bahwa .constructor
perbandingan dilemparkan juga berarti, saya pikir, bahwa jawaban ini masih masuk akal, tetapi menggunakan ===
akan menyederhanakan alasannya.
Ya, mereka sama. Ini adalah salah satu dari banyak kebiasaan historis di browser JS API. Coba lakukan:
window.location === document.location
Jarang melihat perbedaannya saat ini karena html 5 tidak mendukung frameset lagi. Tetapi kembali pada saat kita memiliki frameset, document.location hanya akan mengarahkan frame di mana kode sedang dieksekusi, dan window.location akan mengarahkan seluruh halaman.
Saya akan katakan window.location
adalah cara yang lebih dapat diandalkan untuk mendapatkan URL saat ini . Berikut ini adalah perbedaan antara window.location
dan document.url
yang muncul di depan dalam salah satu skenario di mana saya menambahkan parameter hash di URL dan membacanya nanti.
Setelah menambahkan parameter hash di URL.
Di browser yang lebih lama, saya tidak bisa mendapatkan parameter hash dari URL dengan menggunakan document.url
, tetapi ketika saya gunakan window.location
maka saya bisa mendapatkan parameter hash dari URL.
Jadi selalu lebih baik digunakan window.location
.
document.URL
- ini tentang window.location
dan document.location
. Juga, document.url
tidak ada = harus huruf besar.
document.location.constructor === window.location.constructor
adalah true
.
Itu karena benda itu persis sama dengan yang bisa Anda lihat document.location===window.location
.
Jadi tidak perlu membandingkan konstruktor atau properti lainnya.
Ya, mereka sama, tapi ....!
window.location
tidak berfungsi pada beberapa browser Internet Explorer.
Meskipun sebagian besar orang merekomendasikan di sini, seperti itulah protokol dinamis Google Analytics terlihat seperti untuk waktu yang lama (sebelum mereka pindah dari ga.js ke analytics.js baru-baru ini):
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
Info lebih lanjut: https://developers.google.com/analytics/devguides/collection/gajs/
Di versi baru mereka menggunakan '//' sehingga browser dapat secara otomatis menambahkan protokol:
'//www.google-analytics.com/analytics.js'
Jadi jika Google lebih memilih document.location ke window.location
ketika mereka membutuhkan protokol di JS, saya kira mereka memiliki beberapa alasan untuk itu.
KESELURUHAN : Saya pribadi percaya itu document.location
dan window.location
sama, tetapi jika raksasa dengan statistik terbesar tentang penggunaan browser seperti Google menggunakan document.location , saya sarankan untuk mengikuti mereka.
Sebenarnya saya melihat perbedaan dalam chrome di antara keduanya, Misalnya jika Anda ingin melakukan navigasi ke bingkai kotak pasir dari bingkai anak maka Anda dapat melakukan ini hanya dengan document.location tetapi tidak dengan window.location