Safari неправильно устанавливает переменную JavaScript

#javascript #html #safari

Вопрос:

Я на Сафари 12.0.3. У меня есть:

 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) } 
 lt;body onload="init()"gt;  lt;div id="vid"gt;xlt;/divgt; lt;/bodygt; 

Проблема

В Safari doThisOnlyOnce() запускается при каждом щелчке мыши. MyNamespace.firstUserGesture не установлено false вообще.

В любом другом браузере doThisOnlyOnce() запускается только при первом щелчке, как и ожидалось.

Что я упускаю?

Комментарии:

1. Сафари на Mac OS или сафари на iOS? (Или и то, и другое?)

2. @Ти Джей Краудер Извините, я удалил тег мобильного сафари . На данный момент я могу подтвердить только для рабочего стола Safari 🙂

3. @Ти Джей Краудер, это очень странно. Но здесь, в этом посте StackOverflow, когда я запускаю фрагмент кода в том же 12 браузере Safari, функция запускается только один раз! Я в замешательстве 🙁

4. @user3405291 Очевидно, что ваш локальный код каким-то образом отличается от кода, который вы опубликовали здесь, так что

5. Кажется исключительно маловероятным, что Safari нарушен таким фундаментальным образом, что говорит о том, что происходит нечто большее. Например, если у вас неверная HTML-разметка (размещение p элементов внутри span элементов и тому подобное), способы, которыми разные браузеры «исправляют» ее при создании DOM, не всегда на 100% согласованы между поставщиками браузеров. Я подозреваю, что именно это здесь и происходит. В Safari я предлагаю щелкнуть правой кнопкой мыши vid элемент и выбрать «Проверить» (или как там это называется в Safari), чтобы просмотреть фактический DOM (а не источник просмотра). Похоже, что щелчок перезагружает страницу.

Ответ №1:

Просмотр кода построчно с помощью отладчика Safari JS указывает на то, что один из операторов doThisOnlyOnce функции создавал исключение. Удаление причины исключения также устранило это странное поведение.

Комментарии:

1. По какой-то причине другие браузеры НЕ выдают это исключение.