जावास्क्रिप्ट: सेटिंग स्थान .href बनाम स्थान


311

आप locationURL स्ट्रिंग बनाम सेटिंग पर कब सेट होंगे location.href?

location = "http://www.stackoverflow.com";

बनाम

location.href = "http://www.stackoverflow.com";

मोज़िला डेवलपर नेटवर्क संदर्भ


6
location.hrefसमान-मूल-नीति के कारण मेल सेट करना विफल: javascript.info/tutorial/…
Taha Jahangir


1
मेरे पास एक Angular 4 ऐप है जो टाइपस्क्रिप्ट 2.6.2 का उपयोग करता है। window.location को केवल पढ़ा जाता है और मैं केवल window.location.href (एक कोणीय सदस्यता से कॉलबैक के संदर्भ में) का उपयोग करके असाइन कर सकता हूं, बिना कंपाइलर त्रुटियों के पुन: प्रस्तुत किया जा सकता है- शायद यह किसी प्रकार की जावास्क्रिप्ट 1.0 कॉम्पैटिबिलिटी चीज़ है या एसिंक्रोनस हैंडलिंग से संबंधित है । मूल रूप से window.location.href केवल एक चीज लगती है जो हमेशा काम करती है।
क्रिस हैल्क्रो

जवाबों:


261

आप locationसीधे सेट कर सकते हैं क्योंकि यह थोड़ा छोटा है। यदि आप कोशिश कर रहे हैं, तो आप आमतौर पर window.भी छोड़ सकते हैं।

दोनों को यूआरएल असाइनमेंट location.hrefऔर locationजावास्क्रिप्ट 1.0 में काम करने के लिए परिभाषित किया गया है, नेटस्केप 2 में वापस, और तब से हर ब्राउज़र में लागू किया गया है। इसलिए अपना चयन करें और जो भी आपको स्पष्ट लगे, उसका उपयोग करें।


9
जैसे नीचे दिए गए उत्तर में @SwissMister द्वारा उल्लेख किया गया है, ऐसा लगता है कि window.location.href को XHR अनुरोध की तरह माना जाता है। यदि XHR की सफलता कॉलबैक के भीतर से निकाल दिया जाता है, तो window.location.href को XHR के रूप में माना जाएगा जबकि window.location एक लिंक पर क्लिक करने का अनुकरण करता है।
अक्षय राजे

147

यहां तक ​​कि अगर दोनों काम करते हैं, तो मैं बाद का उपयोग करूंगा। locationएक ऑब्जेक्ट है, और किसी ऑब्जेक्ट को स्ट्रिंग असाइन करना पठनीयता या रखरखाव के लिए अच्छी तरह से नहीं है।


60
एक जटिल पेपैल एकीकरण को लागू करते समय, मुझे उपयोग करने के लिए एक बहुत ही सम्मोहक कारण का सामना करना पड़ा window.location: इसकी आवश्यकता नहीं हैSAME ORIGIN
स्विस मिस्टर

4
शायद यह सिर्फ मुझे है, लेकिन location = 'http://www.example.com'सुपर पठनीय लगता है। एक विशेष मामले के रूप में, यद्यपि। यह पीछे की ओर संगत है और निकट भविष्य में संगत बनी रहेगी
एलेक्स डब्ल्यू

10
यदि window.location एक वस्तु थी, तो उसे एक स्ट्रिंग प्रदान करना इसे एक स्ट्रिंग के साथ अधिलेखित कर देगा। वास्तव में window.location एक संपत्ति है जिसमें गेट्टर और सेटर विधियां हैं। जब आप इसे सेट करते हैं, तो स्ट्रिंग की उम्मीद की जाती है और वैश्विक स्थान ऑब्जेक्ट को सेटर द्वारा अपडेट किया जाता है। जब आप इसे प्राप्त करते हैं, तो वैश्विक स्थान ऑब्जेक्ट वापस आ जाता है।
जुकप

64

जैसा कि पहले ही कहा जा चुका है, locationएक वस्तु हैलेकिन उस व्यक्ति ने या तो उपयोग करने का सुझाव दिया। लेकिन, आप .hrefसंस्करण का उपयोग करने के लिए बेहतर करेंगे ।

ऑब्जेक्ट्स में डिफ़ॉल्ट गुण होते हैं, जो यदि कुछ और निर्दिष्ट नहीं करते हैं, तो उन्हें मान लिया जाता है। locationवस्तु के मामले में , इसके पास एक संपत्ति है .href। और असाइनमेंट के दौरान किसी भी संपत्ति को निर्दिष्ट नहीं करके, यह डिफ़ॉल्ट रूप से "href" मान लेगा।

यह सभी अच्छी तरह से और ठीक है जब तक कि बाद में ऑब्जेक्ट मॉडल संस्करण नहीं बदलता है और या तो डिफ़ॉल्ट संपत्ति नहीं है, या डिफ़ॉल्ट संपत्ति बदल जाती है। फिर आपका कार्यक्रम अप्रत्याशित रूप से टूट जाता है।

यदि आपका मतलब है href, तो आपको निर्दिष्ट करना चाहिए href


13
अच्छी व्याख्या, पठनीयता या रखरखाव के बारे में सामान्य टिप्पणियों से बेहतर है। वास्तव में इस विशेष मामले में ऑब्जेक्ट मॉडल को नहीं बदला जाएगा, क्योंकि आधा वेब रुक जाएगा - इसलिए या तो उपयोग करें ... इससे कोई फर्क नहीं पड़ता
Neromancer

71
यह अच्छा लगता है लेकिन वास्तव में सच नहीं है। DOM या जावास्क्रिप्ट में सामान्य रूप से डिफ़ॉल्ट संपत्ति की कोई अवधारणा नहीं है। locationकाम करने के लिए एक स्ट्रिंग सौंपना क्योंकि संपत्ति को इस विशेष असाइनमेंट व्यवहार को जावास्क्रिप्ट 1.0 में वापस परिभाषित किया गया था और तब से हर ब्राउज़र ने इसे लागू किया है। HTML5 को अब इसकी आवश्यकता है। इसलिए जब तक यह प्रीटियर या अधिक सुसंगत हो सकता है .href, तब तक ऐसा करने के लिए कोई पिछड़ा या आगे संगतता लाभ नहीं है।
बॉब

6
सावधानी मायने रखती है।
टॉम एंडरसन

4
window.location = urlखूबसूरत है
एरिक Muyser

21
location = urlis cuter
fregante

20

कुछ साल पहले, locationIE में मेरे लिए काम नहीं location.hrefकिया और (और दोनों अन्य ब्राउज़रों में काम किया)। तब से मैंने हमेशा सिर्फ इस्तेमाल किया है location.hrefऔर फिर कभी परेशानी नहीं हुई। मुझे याद नहीं है कि IE का कौन सा संस्करण था।


42
यह शायद IE का एक संस्करण था जहां इसने गलत किया और हर दूसरे ब्राउज़र ने इसे सही ढंग से किया। ;-)
शॉन डी।

9
में strict modeक्रोम यदि आप के लिए सीधे आवंटित करने के लिए कोशिश एक अपवाद फेंक देते हैं location, भी तो मैं हमेशा उपयोगlocation.href
Hashbrown

9
IE का "एक" संस्करण?
Lpc_dark

@ शॉन डी। एक ब्राउज़र चीजों को सही ढंग से कर रहा है? वह कब हुआ! : D
user2173353

15

बस स्पष्ट करने के लिए, आप ऐसा नहीं कर सकते location.split('#'), locationएक वस्तु है, न कि एक स्ट्रिंग। लेकिन आप कर सकते हैं location.href.split('#');क्योंकि location.hrefएक स्ट्रिंग है।


3
आपकी टिप्पणी सही है, लेकिन आप स्थान वस्तु के href विशेषता, स्ट्रिंग को प्राप्त करने के बारे में बात कर रहे हैं । अन्य सभी विचार-विमर्श एक मान निर्दिष्ट करने के साथ काम कर रहे हैं , मूल्य नहीं पढ़ रहे हैं। लेकिन आपकी बात सही है। अंतर यह है कि href एक स्ट्रिंग है जबकि स्थान एक ऑब्जेक्ट है।
फिल डीडी

15

एक अंतर ध्यान में रखना है, हालांकि।

मान लें कि आप वर्तमान URL का उपयोग करके कुछ URL बनाना चाहते हैं। निम्नलिखित कोड वास्तव में आपको पुनर्निर्देशित करेगा, क्योंकि यह कॉलिंग नहीं है String.replaceलेकिन Location.replace:

nextUrl = window.location.replace('/step1', '/step2');

निम्नलिखित कोड काम करते हैं:

// cast to string
nextUrl = (window.location+'').replace('/step1', '/step2');

// href property
nextUrl = window.location.href.replace('/step1', '/step2');

3

टाइपस्क्रिप्ट उपयोग के window.location.hrefसाथ window.locationतकनीकी रूप से एक वस्तु है:

Properties
hash 
host 
hostname
href    <--- you need this
pathname (relative to the host)
port 
protocol 
search 

सेटिंग window.locationटाइप त्रुटि उत्पन्न करेगा, जबकि window.location.hrefटाइप स्ट्रिंग का है।

स्रोत

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.