모바일 사파리에서 뷰포트 메타 태그를 즉시 변경할 수 있습니까?


98

다양한 유형의 콘텐츠를 표시해야하는 모바일 Safari 브라우저 용으로 제작 된 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');

필요한 부분 만 변경하면 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
좋은! 안타깝게도 작동하지 않는 것 같습니다. 내 상황은 약간 다릅니다. 너비가 980px 인 사이트에서 작업하고 있습니다. 콘텐츠가 디자인의 가장자리까지 이동하므로 iPad에서는 어색해 보입니다. 나는 뷰포트를 1020px 너비로 설정하여 양쪽에 20px 여백을 허용한다고 생각했지만 운이 없습니다 : viewport = document.querySelector("meta[name=viewport]"); viewport.setAttribute('content', 'width=1020'); (일부 상황에 따라 약간 잠긴 Drupal 인스턴스에 넣습니다 ... 그래서 나는 헤드 영역에 직접 액세스 할 수없고 Javascript를 사용해야합니다)
Sam

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 : 위의 코드를 실행하기 전에 사용자 에이전트를 사용하여 스크립트가 실행중인 장치를 확인할 수 있지만 일반적으로 그것은 나쁜 생각이라고 생각합니다. 실제 장치가 아닌 장치 기능 (또는 필요한 경우 화면 크기)을 기준으로 일반화하십시오. 예를 들어 기기가 터치 이벤트 등을 지원하는지 감지 할 수 있습니다 (예 : modernizr 사용 ). 무엇을 하려는지에 따라 다릅니다.
markquezada

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;

누군가에게 도움이되기를 바랍니다. 해결책을 찾기 전에 마우스를 두드리는 데 몇 시간을 보냈습니다.


이것은 내 생명을 구했지만 약간의 문제가 있습니다. 오버레이 div에 사진을 100 %로 표시하고 모바일 장치에서 확대한다고 가정하면 일반적으로 표시되는 크기를 간단히 조정하는 기본 브라우저 확대 / 축소 구현을 사용하여 확대 / 축소합니다. 원본 파일을 다시 렌더링하지 않고 영역. 반면에, 비활성화 된 확대 / 축소 상태에 대해 "width = device-width"를 제거하면 확대 / 축소하는 동안 사진이 잘 렌더링되지만 100 % div가 닫히면 마지막 페이지 위치가 느슨해집니다 ...
Stefan Müller
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.