क्या मैं फ़्लाई पर मोबाइल सफारी में व्यूपोर्ट मेटा टैग को बदल सकता हूं?


98

मेरे पास मोबाइल सफारी ब्राउज़र के लिए एक AJAX ऐप है जिसे विभिन्न प्रकार की सामग्री प्रदर्शित करने की आवश्यकता है।

कुछ सामग्री के लिए, मुझे ज़रूरत है user-scalable=1और अन्य लोगों के लिए, मुझे ज़रूरत है user-scalable=0

क्या पेज को रीफ्रेश किए बिना सामग्री विशेषता के मूल्य को संशोधित करने का कोई तरीका है?

<meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;" />

जवाबों:


148

मुझे लगता है कि यह थोड़ा पुराना है, लेकिन, हां यह किया जा सकता है। आपको शुरू करने के लिए कुछ जावास्क्रिप्ट:

viewport = document.querySelector("meta[name=viewport]");
viewport.setAttribute('content', 'width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0');

बस उन हिस्सों को बदलें जिनकी आपको ज़रूरत है और मोबाइल सफारी नई सेटिंग्स का सम्मान करेगी।

अपडेट करें:

यदि आपके पास स्रोत में पहले से ही मेटा व्यूपोर्ट टैग नहीं है, तो आप इसे सीधे कुछ इस तरह से जोड़ सकते हैं:

var metaTag=document.createElement('meta');
metaTag.name = "viewport"
metaTag.content = "width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0"
document.getElementsByTagName('head')[0].appendChild(metaTag);

या यदि आप jQuery का उपयोग कर रहे हैं:

$('head').append('<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">');

2
अच्छा! दुर्भाग्य से, मैं इसे काम करने के लिए प्राप्त नहीं कर सकता। मेरी स्थिति थोड़ी अलग है: मैं एक ऐसी साइट के साथ काम कर रहा हूं जिसकी 980px चौड़ाई है। सामग्री डिज़ाइन के किनारे पर सही जाती है, इसलिए iPad पर यह अजीब लगता है। मुझे लगा कि मैं व्यूपोर्ट को 1020px की चौड़ाई में दोनों ओर 20px मार्जिन की अनुमति देने के लिए सेट करूँगा ... लेकिन भाग्य नहीं: viewport = document.querySelector("meta[name=viewport]"); viewport.setAttribute('content', 'width=1020'); (बस कुछ संदर्भ के लिए: मैं इसे कुछ हद तक ड्रुपल इंस्टेंस में डाल रहा हूँ ... इसलिए मेरे पास सिर क्षेत्र तक सीधी पहुंच नहीं है और जावास्क्रिप्ट का उपयोग करने की आवश्यकता है)
सैम

7
यह काफी आसान होना चाहिए। बस इसे सीधे में लिखें। यदि आप jQuery का उपयोग कर रहे हैं तो यह कुछ इस तरह होगा: $('head').append('<meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;">'); या, jQuery के बिना:document.getElementsByTagName('head')[0].appendChild( ... );
markquezada

3
सामग्री विशेषताओं के लिए, मोबाइल सफारी के वेब इंस्पेक्टर अर्धविराम पर एक त्रुटि फेंक रहे हैं। यह अधिक मान्य प्रतीत होता है:viewport.setAttribute('content', 'width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0');
jfroom

1
@ END_nuts आप सही कह रहे हैं, appendChild एक स्ट्रिंग की नहीं बल्कि एक नोड की उम्मीद करता है। अपडेट किया गया। धन्यवाद।
मार्कजेडा

1
@basZero: आप उपर्युक्त कोड को चलाने से पहले यह जानने के लिए उपयोगकर्ता एजेंट का उपयोग कर सकते हैं कि स्क्रिप्ट किस उपकरण पर चल रही है, लेकिन सामान्य तौर पर मुझे लगता है कि यह एक बुरा विचार है। डिवाइस के फीचर्स (या स्क्रीन साइज अगर आपको चाहिए) के आधार पर सामान्य करने की कोशिश करें, न कि वास्तविक डिवाइस की। उदाहरण के लिए, आप पता लगा सकते हैं कि क्या उपकरण स्पर्श घटनाओं आदि का समर्थन करता है (यानी, आधुनिकीकरण के साथ )। आप क्या करने की कोशिश कर रहे हैं पर निर्भर करता है।
मार्केज़ादा

8

अपने में <head>

<meta id="viewport"
      name="viewport"
      content="width=1024, height=768, initial-scale=0, minimum-scale=0.25" />

आपकी जावास्क्रिप्ट में कहीं

document.getElementById("viewport").setAttribute("content",
      "initial-scale=0.5; maximum-scale=1.0; user-scalable=0;");

... लेकिन अपने डिवाइस के लिए इसे ट्विक करने के साथ शुभकामनाएं, घंटों तक फिडिंग ... और मैं अभी भी वहां नहीं हूं!

स्रोत


4

यह अधिकांश भाग के लिए उत्तर दिया गया है, लेकिन मैं विस्तार करूंगा ...

चरण 1

मेरा लक्ष्य निश्चित समय पर ज़ूम सक्षम करना था, और इसे दूसरों पर अक्षम करना था।

// enable pinch zoom
var $viewport = $('head meta[name="viewport"]');    
$viewport.attr('content', 'width=device-width, initial-scale=1, maximum-scale=4');

// ...later...

// disable pinch zoom
$viewport.attr('content', 'width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no');

चरण 2

व्यूपोर्ट टैग अपडेट होगा, लेकिन चुटकी ज़ूम अभी भी सक्रिय था !! मुझे परिवर्तन प्राप्त करने के लिए पृष्ठ प्राप्त करने का एक तरीका खोजना था ...

यह एक हैक समाधान है, लेकिन शरीर की अस्पष्टता टॉगल करने का काम किया। मुझे यकीन है कि इसे पूरा करने के अन्य तरीके हैं, लेकिन यहां मेरे लिए काम किया गया है।

// after updating viewport tag, force the page to pick up changes           
document.body.style.opacity = .9999;
setTimeout(function(){
    document.body.style.opacity = 1;
}, 1);

चरण 3

मेरी समस्या ज्यादातर इस बिंदु पर हल हो गई थी, लेकिन काफी नहीं। मुझे पृष्ठ के वर्तमान ज़ूम स्तर को जानने की आवश्यकता है ताकि मैं पृष्ठ पर फिट होने के लिए कुछ तत्वों का आकार बदल सकूं (मानचित्र मार्करों के बारे में सोचें)।

// check zoom level during user interaction, or on animation frame
var currentZoom = $document.width() / window.innerWidth;

मुझे उम्मीद है कि इससे किसी को मदद मिलेगी। मैंने समाधान खोजने से पहले अपने माउस को पीटने में कई घंटे लगा दिए।


इससे मेरी जान बच गई, लेकिन मुझे इसमें थोड़ी समस्या है: मान लें कि आप किसी चित्र को ओवरले डिव में 100% पर प्रदर्शित करते हैं और इसे मोबाइल डिवाइस पर ज़ूम इन करते हैं, आप मूल ब्राउज़र ज़ूम कार्यान्वयन का उपयोग करके ज़ूम करेंगे, जो आमतौर पर दृश्यमान को मापता है मूल फ़ाइल के किसी भी पुन: प्रतिपादन के बिना क्षेत्र। दूसरी तरफ, अगर मैं अक्षम ज़ूम स्थिति के लिए "चौड़ाई = डिवाइस-चौड़ाई" को हटाता हूं, तो यह ज़ूम करते समय चित्र को ठीक करता है, लेकिन 100% div बंद होने पर मैं अपनी अंतिम पृष्ठ स्थिति को ढीला कर देता हूं ...
स्टीफन मुलर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.