Esto ha sido respondido en su mayor parte, pero ampliaré ...
Paso 1
Mi objetivo era habilitar el zoom en ciertos momentos y deshabilitarlo en otros.
// 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');
Paso 2
La etiqueta de la ventana gráfica se actualizaría, ¡pero el zoom aún estaba activo! Tenía que encontrar una manera de que la página recogiera los cambios ...
Es una solución de pirateo, pero alternar la opacidad del cuerpo funcionó. Estoy seguro de que hay otras formas de lograr esto, pero esto es lo que funcionó para mí.
// after updating viewport tag, force the page to pick up changes
document.body.style.opacity = .9999;
setTimeout(function(){
document.body.style.opacity = 1;
}, 1);
Paso 3
Mi problema se resolvió en su mayoría en este punto, pero no del todo. Necesitaba saber el nivel de zoom actual de la página para poder cambiar el tamaño de algunos elementos para que quepan en la página (piense en los marcadores del mapa).
// check zoom level during user interaction, or on animation frame
var currentZoom = $document.width() / window.innerWidth;
Espero que esto ayude a alguien. Pasé varias horas golpeando el mouse antes de encontrar una solución.
viewport = document.querySelector("meta[name=viewport]"); viewport.setAttribute('content', 'width=1020');
tuve suerte: (Solo para un poco de contexto: estoy poniendo esto en una instancia de Drupal algo bloqueada ... así que no tengo acceso directo al área de la cabeza y necesito usar Javascript)