Сенсорные события не работают в iOS-сборке приложения Cordova

У меня есть очень простое приложение Cordova, которое является расширением стандартного шаблона Cordova «готово к устройству». Он имеет одну кнопку с прикрепленным простым событием клика.

как видно здесь, работает на симуляторе iOS.

Простое приложение Cordova

Ниже приведен код моего проекта

index.html

<html>
<head>
    <meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *">
    <meta name="format-detection" content="telephone=no">
    <meta name="msapplication-tap-highlight" content="no">
    <meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width">
    <link rel="stylesheet" type="text/css" href="css/index.css">
    <title>Hello World</title>
</head>
<body>
    <div class="app">
        <h1>Simple App</h1>
        <div id="deviceready" class="blink">
            <p class="event listening">Connecting to Device</p>
            <p class="event received">Device is Ready</p>
        </div>
        <button type="button" id="testBttn">Press me</button>
    </div>
    <script type="text/javascript" src="cordova.js"></script>
    <script type="text/javascript" src="js/index.js"></script>
</body>
</html>

index.js

var app = {
    // Application Constructor
    initialize: function() {
        this.bindEvents();
    },
    // Bind Event Listeners
    //
    // Bind any events that are required on startup. Common events are:
    // 'load', 'deviceready', 'offline', and 'online'.
    bindEvents: function() {
        document.addEventListener('deviceready', this.onDeviceReady, false);
    },
    // deviceready Event Handler
    //
    // The scope of 'this' is the event. In order to call the 'receivedEvent'
    // function, we must explicitly call 'app.receivedEvent(...);'
onDeviceReady: function() {
       app.receivedEvent('deviceready');
    },
    // Update DOM on a Received Event
    receivedEvent: function(id) {
        var parentElement = document.getElementById(id);
        var listeningElement = parentElement.querySelector('.listening');
        var receivedElement = parentElement.querySelector('.received');

        listeningElement.setAttribute('style', 'display:none;');
        receivedElement.setAttribute('style', 'display:block;');

        console.log('Received Event: ' + id);
    }
};

app.initialize();

console.log('ready to test button');

document.getElementById("testBttn").addEventListener("click", function (){
  console.log('button was pressed!');
});

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

Кнопка работает нормально и выводит данные на консоль при запуске в браузере

Когда я запускаю приложение через XCode на симуляторе вместо CLI, я получаю тот же результат, хотя я получаю следующий вывод, как только я нажимаю в любом месте на экране симулятора.

2016-10-13 00:16:57.738602 CordovaApp[14845:2773283] subsystem: com.apple.UIKit, category: Touch, enable_level: 0, persist_level: 0, default_ttl: 1, info_ttl: 0, debug_ttl: 0, generate_symptoms: 0, enable_oversize: 1, privacy_setting: 2, enable_private_data: 0
2016-10-13 00:16:57.739331 CordovaApp[14845:2773283] subsystem: com.apple.UIKit, category: Gesture, enable_level: 0, persist_level: 0, default_ttl: 1, info_ttl: 0, debug_ttl: 0, generate_symptoms: 0, enable_oversize: 1, privacy_setting: 2, enable_private_data: 0
2016-10-13 00:16:57.741806 CordovaApp[14845:2773283] subsystem: com.apple.UIKit, category: GestureExclusion, enable_level: 0, persist_level: 0, default_ttl: 1, info_ttl: 0, debug_ttl: 0, generate_symptoms: 0, enable_oversize: 1, privacy_setting: 2, enable_private_data: 0

Этот вывод дает мало информации, но может указывать на очевидную проблему. У меня никогда не было такого вывода при создании собственных приложений ios.

Любая помощь приветствуется.

Изменить: я использую XCode 8.0

Я упоминаю об этом, так как кажется, что такой вывод консоли довольно распространен в XCode 8 при создании приложений для iOS 10. Из того, что я могу найти, кажется, что этот вывод консоли тривиален и не является чем-то необычным.


person Danoram    schedule 12.10.2016    source источник
comment
пожалуйста, напишите document.getElementById(testBttn).addEventListener(click, function(){ console.log('кнопка была нажата!'); }); в функции ReceiveEvent   -  person Naitik    schedule 12.10.2016
comment
если вы запускаете кросс-платформу, пожалуйста, ionicframework.com/getting-started у него есть лучший код для этого и также с помощью кордовы.   -  person Naitik    schedule 12.10.2016
comment
Добавление прослушивателя событий к функции ReceiveEvent, как вы предложили, к сожалению, не дает никакого другого результата: (   -  person Danoram    schedule 12.10.2016


Ответы (2)


Я обнаружил, что то же самое происходит со мной сегодня внезапно. Единственное решение, которое я нашел, на самом деле вовсе не решение, но когда я переключаюсь на другое приложение, а затем снова переключаюсь на свое приложение, все сенсорные события снова начинают работать. Но только что открытое приложение совершенно не отвечает. Так что это не совсем решение, но посмотрите, испытываете ли вы такое же поведение.

person Aaron    schedule 12.10.2016
comment
Просто слышать, что у кого-то еще есть эта проблема и ее воспроизводимость, - это музыка для моих ушей. По крайней мере, это проблема, которая выходит за рамки нашей вины, и ответ в этой теме может помочь любому в будущем решить ту же проблему. - person Danoram; 12.10.2016
comment
На самом деле я предоставил временное решение. - person Aaron; 13.10.2016

Использование touchstart должно работать:

initialize: function() {
    document.getElementById('testBtn').addEventListener('touchstart', this.clickedBtn.bind(this), false);
},

clickedBtn: function() {
    console.log('CLICKED THE BUTTON!');
},
person Roger Garza    schedule 26.08.2017