Чи можу я змінити метатег viewport у мобільному сафарі на ходу?


98

У мене є додаток AJAX, створений для мобільного браузера Safari, який повинен відображати різні типи вмісту.

Для одного змісту мені потрібно, 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

Я усвідомлюю, що це трохи старе, але, так, це можна зробити. Деякі JavaScript для початку роботи:

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

Просто змініть потрібні деталі, і Mobile Safari поважатиме нові налаштування.

Оновлення:

Якщо у вас вже немає тегу метапогляду в джерелі, ви можете додати його безпосередньо таким чином:

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
Приємно! На жаль, я не можу зробити так, щоб це спрацювало. Моя ситуація дещо інша: я працюю з сайтом, який має ширину 980 пікселів. Зміст йде прямо до краю дизайну, тому на iPad це виглядає незручно. Я думав, що я встановив вікно перегляду на ширину 1020px, щоб забезпечити 20px поля з обох сторін ... але не пощастило: viewport = document.querySelector("meta[name=viewport]"); viewport.setAttribute('content', 'width=1020'); (Просто для певного контексту: я ставлю це в дещо замкненому екземплярі Drupal ... тому я не маю прямого доступу до області голови і мені потрібно використовувати Javascript)
Сам

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
@the_nuts Ти маєш рацію, appendChild очікує вузол, а не рядок. Оновлено. Дякую.
markquezada

1
@basZero: Ви можете використовувати агент користувача, щоб перевірити, на якому пристрої працює сценарій, перш ніж запустити вищевказаний код, але в цілому, я думаю, це погана ідея. Спробуйте узагальнити на основі функцій пристрою (або розміру екрана, якщо потрібно), а не фактичних пристроїв. Наприклад, ви можете виявити, чи пристрій підтримує сенсорні події тощо (тобто за допомогою модернізатора ). Залежить від того, що ви намагаєтеся зробити.
markquezada

8

у вашому <head>

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

десь у вашому javascript

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% -ве діло закрите ...
Стефан Мюллер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.