我可以动态更改移动版Safari中的视口元标记吗?

Pep*_*per 95 javascript mobile-safari viewport

我有一个为移动Safari构建的ajax应用程序,需要显示不同类型的内容.一些内容我需要用户可扩展= 1其他内容我需要user-scalable = 0.有没有办法在不刷新页面的情况下即时更新?

<meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;" />
Run Code Online (Sandbox Code Playgroud)

mar*_*ada 142

我意识到这有点老了,但是,是的,它可以做到.一些javascript让你入门:

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

只需更改您需要的部件,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);
Run Code Online (Sandbox Code Playgroud)

或者如果你正在使用jQuery:

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

  • 这应该很容易.直接写它.如果您正在使用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(...);` (7认同)
  • 对于内容属性,移动safari的Web检查器在分号上抛出错误.这看起来更有效:`viewport.setAttribute('content','width = device-width,initial-scale = 1.0,maximum-scale = 1.0,user-scalable = 0');` (3认同)
  • 太好了!不幸的是,我似乎无法让它发挥作用.我的情况有点不同:我正在使用宽度为980像素的网站.内容直接进入设计的边缘,所以在iPad上,它看起来很尴尬.我以为我将视口设置为1020px的宽度,以允许两边的20px边距......但没有运气:`viewport = document.querySelector("meta [name = viewport]"); viewport.setAttribute('content','width = 1020');`(仅适用于某些上下文:我将它放在一个有点锁定的Drupal实例中......所以我没有直接访问头部区域和需要使用Javascript) (2认同)

son*_*njz 8

在你的 <head>

<meta id="viewport"
      name="viewport"
      content="width=1024, height=768, initial-scale=0, minimum-scale=0.25" />
Run Code Online (Sandbox Code Playgroud)

在你的JavaScript中的某个地方

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

...但是好好为你的设备调整它,摆弄几个小时...我仍然不在那里!

资源


pos*_*abs 5

这已经在很大程度上得到了回答,但我会扩展......

第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');
Run Code Online (Sandbox Code Playgroud)

第2步

视口标签会更新,但双指缩放仍然有效!!我必须找到一种方法让页面接收更改...

这是一个 hack 解决方案,但是切换 body 的不透明度可以解决问题。我确信还有其他方法可以实现这一点,但这是对我有用的方法。

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

第 3 步

我的问题在这一点上基本解决了,但还没有完全解决。我需要知道页面的当前缩放级别,以便我可以调整一些元素的大小以适应页面(想想地图标记)。

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

我希望这对某人有帮助。在找到解决方案之前,我花了几个小时敲打鼠标。