जब

2017-04-30 10 views
8

नेविगेट कैसे आईओएस सफारी का स्टैंडअलोन मोड में रहने के लिए आईओएस 'स्टैंडअलोन वेब अनुप्रयोग काम करने में, और आप एक लिंक पर क्लिक करते हैं, कि लिंक के बजाय स्टैंडअलोन काम करने में रहने की मोबाइल सफारी में खोला गया है। यह मुझे कोई समझ नहीं आता है (कम से कम आंतरिक लिंक के लिए)।जब

एक ही रास्ता है कि मैं इस फिक्सिंग के बारे में सोच सकते document नोड के लिए एक क्लिक हैंडलर जोड़ रहा है, और मैन्युअल रूप से इस तरह नेविगेट:

if (window.navigator.standalone) { 
    document.addEventListener('click', (e) => { 
    if (e.target.tagName === 'A') { 
     e.preventDefault(); 
     window.location = e.target.getAttribute('href'); 
    }); 
} 

इस व्यवहार प्राप्त करने के एक कम hacky रास्ता नहीं है? यह वास्तव में मेरी आंखों को चोट पहुंचाता है।

उत्तर

2

उन पंक्तियों के साथ दुर्भाग्यपूर्ण कुछ ऐसा करने का मानक तरीका है। गिटहब पर आईआरए ने Stay Standalone नामक एक स्क्रिप्ट को एक साथ रखा है जो आपके लिए सभी गंदे काम को संभालेगा और विभिन्न किनारे के मामलों पर परीक्षण किया जाएगा। हालांकि लिपि थोड़ी पुरानी है, यह आईओएस के आधुनिक संस्करण पर काम करती है।

यह थोड़ा बदसूरत हो सकता है, लेकिन कोड लचीला है और इसे सामान्य जावास्क्रिप्ट बंडल में शामिल किया जा सकता है। यह अन्य परिदृश्यों के लिए व्यवहार नहीं बदलेगा। यह सिर्फ अटकलें है, लेकिन कारण मुझे लगता है कि एप्पल इस व्यवहार के लिए चुना है कि स्टैंडअलोन वेब एप्लिकेशन के लिए किसी को आगे या पीछे बटन और एक लिंक पर क्लिक एक "बेकार" राज्य में और पूर्ण क्षुधा करने योग्य नहीं बनाया वेबसाइटों के लिए एप्लिकेशन डाल सकता है। यह अंतिम उपयोगकर्ता के लिए सामान्य मामले में शायद सबसे वांछनीय व्यवहार है।

(function(document,navigator,standalone) { 
    // prevents links from apps from oppening in mobile safari 
    // this javascript must be the first script in your <head> 
    if ((standalone in navigator) && navigator[standalone]) { 
     var curnode, location=document.location, stop=/^(a|html)$/i; 
     document.addEventListener('click', function(e) { 
      curnode=e.target; 
      while (!(stop).test(curnode.nodeName)) { 
       curnode=curnode.parentNode; 
      } 
      // Condidions to do this only on links to your own app 
      // if you want all links, use if('href' in curnode) instead. 
      if(
       'href' in curnode && // is a link 
       (chref=curnode.href).replace(location.href,'').indexOf('#') && // is not an anchor 
       ( !(/^[a-z\+\.\-]+:/i).test(chref) ||      // either does not have a proper scheme (relative links) 
        chref.indexOf(location.protocol+'//'+location.host)===0) // or is in the same protocol and domain 
      ) { 
       e.preventDefault(); 
       location.href = curnode.href; 
      } 
     },false); 
    } 
})(document,window.navigator,'standalone'); 

आप the tests here देख सकते हैं:

यहाँ जावास्क्रिप्ट की एक प्रति है।

+0

इतने दुखी हैं कि यह वास्तविक दृष्टिकोण की आवश्यकता है। लेकिन एक टन धन्यवाद! –

+0

हाँ मैंने इसे काफी बमर भी पाया। मेरी इच्छा है कि एक मेटा टैग था जिसे हम सामान्य लिंक व्यवहार में चुनने के लिए उपयोग कर सकते थे। –