Закрытие библиотеки по устройствам никогда не производится
Уважаемые программисты 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) {};
Решение о том, какой из них использовать, в конечном итоге остается за вами. В этом сценарии я бы, скорее всего, выбрал второй вариант и вернулся к первому, только если была какая-то причина, по которой вы не могли использовать внешние.