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

IT技术 javascript mobile-safari viewport
2021-02-09 08:45:57

我有一个为移动 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个回答

我意识到这有点旧,但是,是可以做到的。一些 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">');
对于内容属性,移动 safari 的网络检查器在分号上抛出错误。这似乎更有效:viewport.setAttribute('content', 'width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0');
2021-03-17 08:45:57
好的!不幸的是,我似乎无法让它工作。我的情况有点不同:我正在使用一个宽度为 980 像素的网站。内容正好在设计的边缘,所以在 iPad 上,它看起来很尴尬。我以为我会将视口设置为 1020 像素的宽度,以允许两侧有 20 像素的边距……但没有运气:( viewport = document.querySelector("meta[name=viewport]"); viewport.setAttribute('content', 'width=1020'); 仅在某些情况下:我将其放在一个有点锁定的 Drupal 实例中……所以我无法直接访问头部区域,需要使用 Javascript)
2021-04-01 08:45:57
@the_nuts 你说得对, appendChild 需要一个节点,而不是一个字符串。更新。谢谢。
2021-04-03 08:45:57
@basZero:在运行上述代码之前,您可以使用用户代理来检查脚本在哪个设备上运行,但总的来说,我认为这是一个坏主意。尝试根据设备功能(或屏幕大小,如果必须)而不是实际设备进行概括。例如,您可以检测设备是否支持触摸事件等(即使用modernizr)。取决于你想做什么。
2021-04-08 08:45:57
这应该很容易。直接写进去就行了 如果您使用 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( ... );
2021-04-09 08:45:57

在你的 <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;");

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

来源

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

步骤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步

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

这是一个 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);

第 3 步

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

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

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

这救了我一命,但我有一个小问题:假设您在叠加 div 中以 100% 显示图片并在移动设备上放大它,您将使用本机浏览器缩放实现进行缩放,这通常只是缩放可见区域而无需对原始文件进行任何重新渲染。另一方面,如果我删除禁用缩放状态的“宽度=设备宽度”,它会在缩放时渲染图片,但是当 100% div 关闭时我会丢失最后一页的位置......
2021-04-12 08:45:57