Estoy en Safari 12.0.3. Tengo:
function doThisOnlyOnce() { if (MyNamespace.firstUserGesture) { console.log('Do stuff only once!') } MyNamespace.firstUserGesture = false } function init() { window.MyNamespace = {} // Easy access to some vars. MyNamespace.firstUserGesture = true MyNamespace.vid = document.getElementById("vid") MyNamespace.vid.addEventListener('click', doThisOnlyOnce) } <body onload="init()"> <div id="vid">x</div> </body> En Safari, doThisOnlyOnce() se ejecuta con cada clic. MyNamespace.firstUserGesture no está establecido en false en absoluto.
En cualquier otro navegador, doThisOnlyOnce() se ejecuta solo con el primer clic, como se esperaba.
¿Qué me estoy perdiendo?
Revisar el código línea por línea con el depurador Safari JS indica que una de las declaraciones de la función doThisOnlyOnce estaba generando una excepción. Al eliminar la causa de la excepción, también se eliminó este comportamiento extraño.