Cela a été répondu pour la plupart, mais je vais développer ...
Étape 1
Mon objectif était d'activer le zoom à certains moments et de le désactiver à d'autres.
// 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');
Étape 2
La balise de la fenêtre serait mise à jour, mais le zoom par pincement était toujours actif !! J'ai dû trouver un moyen pour que la page reprenne les modifications ...
C'est une solution de piratage, mais basculer l'opacité du corps a fait l'affaire. Je suis sûr qu'il existe d'autres façons d'accomplir cela, mais voici ce qui a fonctionné pour moi.
// after updating viewport tag, force the page to pick up changes
document.body.style.opacity = .9999;
setTimeout(function(){
document.body.style.opacity = 1;
}, 1);
Étape 3
Mon problème a été en grande partie résolu à ce stade, mais pas tout à fait. J'avais besoin de connaître le niveau de zoom actuel de la page afin de pouvoir redimensionner certains éléments pour les adapter à la page (pensez aux marqueurs de carte).
// check zoom level during user interaction, or on animation frame
var currentZoom = $document.width() / window.innerWidth;
J'espère que cela aide quelqu'un. J'ai passé plusieurs heures à frapper ma souris avant de trouver une solution.
viewport = document.querySelector("meta[name=viewport]"); viewport.setAttribute('content', 'width=1020');
(Juste pour un certain contexte: je mets cela dans une instance Drupal quelque peu verrouillée ... donc je n'ai pas d'accès direct à la zone de la tête et dois utiliser Javascript)