Ошибки / ошибки в разработке для WebKit на iOS или Android - PullRequest
19 голосов
/ 12 января 2011

Я собираюсь разработать основное мобильное приложение WebKit с сенсорным управлением.

Я ищу любые подсказки или советы о вещах, которые отличаются от стандартного настольного браузера(s).

Например:

  • на iOS click события не распространяются вверх к элементу body над элементами, за исключением некоторых случаев (ссылки, входы, элементы с прикрепленными событиями и т. д.).

  • Android WebKit не генерирует события для мультитач.

Я знаю об этом. Есть ли другие проблемы?Знаете ли вы о каком-то списке известных проблем?

Ответы [ 9 ]

10 голосов
/ 22 февраля 2011

Я обнаружил несколько вещей в своих недавних попытках с iPad.

1: В версии 4.2 в iOS есть ошибка, при которой выполняется слишком много document.getElementById ('foo');приведет к зависанию браузера и, следовательно, не выполнит команды правильно.Чтобы исправить это, вам нужно создать переменные для хранения этой информации и выполнять команды выбора только при необходимости.Версия 4.3 iOS действительно исправляет это, поскольку я тестировал это на своем iPad.

2: При работе с позиционированием я обнаружил, что при создании собственного видеоконтроллера (для html5), если вы попытаетесь изменить размер контейнера видео, используя position: относительный или position: absolute, вы больше не увидите видео, но получите хороший черный экран (со звуком!).Чтобы исправить это, просто наведите курсор на родительский фрейм, и все готово.

3: Если вы используете iScroll , обязательно поставьтевремя ожидания загрузки;особенно если у вас есть несколько других javascript-скриптов на странице, даже если документ загружается при «загрузке страницы» с помощью:

// Load iScroll when DOM content is ready.
document.addEventListener('DOMContentLoaded', loaded, false);

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

$(function(){
   //other page loaded items to do
   //the iScroller init
   setTimeout('iScrollerInit();',200);
});

, и это очень быстро решило проблему.

4: Если вы обнаружите, что ваши клики не совсем корректно работают, я 'Мы обнаружили, что многие из мобильных SDK содержат обязательные элементы для всего, что затрудняет получение кликов на обычные вещи, которые вы хотите.Поэтому, чтобы исправить это, вы можете сделать что-то вроде:

$("#yourId").unbind("click").click(function(){ 
    //what to do when clicked
});

, и я обнаружил, что это работает наиболее блестяще.

**UPDATE - Nov 2012 **: It's been a few years, and there is so much more to add to this so wanted to update the list a bit.

5: Javascript стоит дорого на нескольких устройствах до сих пор (декабрь 2012 г.).Выполнение действий, которые манипулируют DOM, приводит к большим задержкам на устройствах, и вы должны быть очень осторожны при выполнении этих действий.Обязательно протестируйте свои мобильные веб-страницы как на старых устройствах Android, так и на старых устройствах iPhone, поскольку по нашим показателям это все еще хорошо используемые устройства.

6: Если выПередача HTML для загрузки в веб-виде на устройстве (iPhone App или Android App) бывают случаи, когда вы видите почти высоту 0. Что вам нужно сделать, это сделать, чтобы приложение iPhone или Android выполняло вызов Javascript на фактическомстраница, нацеленная на div, чтобы проверить смещение страницы, которое затем позволит точно установить высоту веб-просмотра.

**UPDATE - Dec 2012 **: Few more awesome findings

7: Я обнаружил, что когда вы выбираете div для событий click, мобильные браузеры будут ждать 300 мс, прежде чем запускать событие, эффективно создаваялаг.Они делают это, чтобы подтвердить, что щелчок не был двойным нажатием.чтобы избежать этого, вы можете вместо этого связать события касания, которые будут срабатывать мгновенно!

Вот фрагмент кода

$(document).ready(function() {
    $('#element').bind('touchstart', function(event) {
        event.stopPropagation();
        event.preventDefault();
        $(this).toggleClass('hover_heading');
    });

    $('#element').bind('touchend', function(event) {
        event.preventDefault();
        $(this).toggleClass('hover_heading');
    });
});

Затем, как только вы заметите мигание над вашими предметами, используйте это, чтобы удалить это.

body * {
    -webkit-tap-highlight-color: rgba(0,0,0,0);  
}

Также, если вы хотите проверить выдающуюся статью, написанную Google на эту тему, вы можете просмотреть ее здесь: - Создание быстрых кнопок для мобильных веб-приложений

**UPDATE - Feb 2013 **: Few more awesome findings

8 : при создании версий ваших CSS-файлов и их кэшировании с помощью таких URL-адресов, как: mydomain.com/css/styles.css?v=123 (или что-то еще),будьте осторожны на устройствах Android 2.2 и более ранних версиях, так как это вызывает крайне странное поведение.

Исходя из моих выводов, Android сделает это совершенно неправильно и заставит html даже испортиться.Лучший способ при работе с этими старыми устройствами - это, к сожалению, изменить фактическое имя файла.

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

6 голосов
/ 19 февраля 2011

Я не знаю скомпилированного списка, но могу перечислить несколько:

  • SVG не поддерживается (в настоящее время) в Android, так как он отключен.Поддержка идет в сотах.Напротив, iOS оставила поддержку SVG включенной, и она, кажется, работает хорошо.
  • Хотя оба браузера поддерживают непрозрачность CSS3, убедитесь, что вы тщательно протестировали любую анимацию, поскольку она может быть довольно изменчивой для более сложной графики (особенно снесколько уровней непрозрачности.)
  • В моем javascript я обычно слушаю события "touchstart", "touchmove" или "touchend" ради скорости (событие "click" обычно вызывает заметное отставание) и гранулярность.
  • Такие функции HTML5, как localStorage и новые теги аудио и видео, работают хорошо.Однако на iphone вы не можете автоматически воспроизводить аудио или видео, так как событие воспроизведения (и соответствующая загрузка) должно быть инициировано пользователем напрямую.
  • Переходы, включающие движение (изменение координат x и y), являются достаточно плавными.,Напротив, переходы, включающие непрозрачность, могут быть довольно изменчивыми в зависимости от используемых ресурсов (иногда вам может понадобиться использовать спрайт, чтобы получить более плавное ощущение.)

Просто некоторые быстрые наблюдения.

1 голос
/ 13 декабря 2011

3D-webkit в Android не работает, особенно когда дело касается чего-либо, связанного с полями ввода.

http://code.google.com/p/android/issues/detail?id=13048

Было несколько случаев, когда я пытался отследитьслучайное поведение CSS, которое в конечном итоге сводится к -webkit-transform:translate3d(0,0,0); в более высоком элементе (для включения аппаратного ускорения на устройствах iOS), отбрасывая все.

1 голос
/ 11 мая 2011

Недавно я написал сообщение в блоге о некоторых коттеджах с использованием фреймворка html5 - в моем случае Sencha Touch для создания собственного приложения, обернутого в PhoneGap.

0 голосов
/ 12 декабря 2012

переполнение: прокрутка не поддерживается на Android 2.3

Вы должны вручную сделать прокрутку divs (touchmove + scrollTop change), если они находятся в контейнерах

есть неприятная ошибка, при которой блоки выбора на Android 2.3 не активируются, если они или их контейнер были спрятаны в любой точке

http://code.google.com/p/android/issues/detail?id=10280

0 голосов
/ 28 июня 2012

Блочные цитаты в событиях кликов в iOS не распространяются вверх по элементам тела над элементами, за исключением некоторых случаев (ссылки, входы, элементы с прикрепленными событиями и т. Д.)

Это помоглоя в восторге - спасибо.

Один элемент UX, который появился в пользовательском тестировании нашего веб-приложения, заключается в том, что взаимодействие iOS с выбранными элементами является паршивым.Требуется 3 щелчка: 1) щелкнуть элемент селектора, 2) щелкнуть элемент, который вы хотите выбрать, 3) нажать Готово.И нет ни одного события, которое я мог бы найти, что происходит, когда вы нажимаете Готово.Поэтому для коротких списков может быть лучше создать собственное всплывающее меню или другое взаимодействие.

0 голосов
/ 22 февраля 2011

Две "особенности", с которыми я столкнулся:

  1. Поля ввода не реагируют на сенсорные события (ontouchstart, ontouchmove, ontouchcancel), что также означает ontouchmove = "event.preventDefault() "не будет препятствовать прокрутке страницы, если вы создаете приложение с фиксированной страницей, без возможности прокрутки.(Можно создать обходной обходной путь, используя скрытые div.)

  2. Невозможно использовать автофокус или element.focus () для любого поля формы в WebKit, как на Android, так и на iOS.Элемент получит курсор, но клавиатура не появится.Я все еще пытаюсь найти обходной путь для этого, но на данный момент это известное намеренное ограничение.: (

0 голосов
/ 19 февраля 2011

Что ж, в Android есть досадная ошибка, из-за которой установка каретки или выделения с помощью Javascript не влияет на то, где происходит ввод.
Я задал вопрос об этом, и пришел к выводу, что это ошибка браузера:(это бывает в 2.2 и 2.3.

Фокус текстовой области с кареткой после текста в браузере Android

0 голосов
/ 19 февраля 2011

position: fixed не работает.

Мобильная часть QuirksMode , вероятно, очень пригодится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...