Закрытие библиотеки по устройствам никогда не производится

Уважаемые программисты Javascript,

Google Closure Library всегда хороша, чтобы сводить людей с ума. Я надеюсь, что вы можете помочь мне в этом вопросе:

Я хочу поймать ondevicemotion- Событие с помощью javascript в функции внутри библиотеки Closure. Без Closure все работает нормально со следующим кодом, который я взял с этой страницы (спасибо автору): http://www.peterfriese.de/how-to-use-the-gyroscope-of-your-iphone-in-a-mobile-web-app/

Следующий фрагмент кода показывает мой код:

if (window.DeviceMotionEvent != undefined) {
    console.log("DME");
    window.ondevicemotion = function(e) {
    console.log("ODM");

    // handle events like e.rotationRate
    ...
    }
}

Это прекрасно работает на отдельной HTML-странице. И то и другое console.logсрабатывают.

В отличие от закрытия, кажется, есть проблема с window.ondevicemotion = function(e) { потому что консоль регистрирует "DME", но не "ODM". Нет никаких предупреждений компилятора или ошибок.

Кто-нибудь тоже признавал такую ​​проблему? К сожалению, я понятия не имею, почему Закрытие действует так глупо (более вероятно, что я так глуп).;-)

Спасибо за прочтение! Любая помощь приветствуется!

1 ответ

Решение

Работая в ADVANCED_COMPILATION, компилятор Closure минимизируется и запутывается window.ondevicemotion для меня, поэтому я предполагаю, что это и ваша проблема. Есть два способа обойти это:

1. Используйте скобочные обозначения для установки / доступа к свойству.

Закрывающий компьютер не будет переименовывать какие-либо свойства, на которые ссылаются в скобках. Следующее не должно быть запутано (хотя, потенциально, оно может быть переписано как window.ondevicemotion):

window['ondevicemotion'] = function(event) { ... }

2. Используйте extern, чтобы сообщить компилятору не переименовывать это свойство.

Как и в ситуации выше, Closure Compiler получает подсказку и не переписывает свойство, оставляя его как есть. Это, однако, имеет приятное преимущество, давая вам некоторую проверку типов, так как вы определяете, что является сигнатурой extern для Closure Compiler:

/**
 * @param {goog.events.Event} event
 */
window.ondevicemotion = function(event) {};

Решение о том, какой из них использовать, в конечном итоге остается за вами. В этом сценарии я бы, скорее всего, выбрал второй вариант и вернулся к первому, только если была какая-то причина, по которой вы не могли использовать внешние.

Другие вопросы по тегам