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

时间:2010-08-27 22:48:54

标签: javascript mobile-safari viewport

我有一个为移动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;" />

3 个答案:

答案 0 :(得分:139)

我意识到这有点老了,但是,是的,它可以做到。一些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">');

答案 1 :(得分:7)

<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;");

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

source

答案 2 :(得分: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;

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