Призывы к обновлению DOM игнорируются в приложении Phonegap с iPhone 3G под управлением iOS 3.0 - PullRequest
2 голосов
/ 05 сентября 2010

Я использую phonegap / jquery / jqtouch для разработки приложения для iPhone. При тестировании приложения с iPhone 3G под управлением iOS 3.0.1 вызовы jquery, которые вносят изменения в DOM (например, 'append ()'), не работают согласованно.

У меня есть тревожный вызов прямо перед вызовом "добавить", и еще один предупредительный звонок сразу после вызова "добавить". Оба оповещения работают согласованно, но вызов 'append' работает случайным образом. Иногда DOM обновляется, а иногда нет. Звонки также не вызывают ошибку. Как будто их игнорируют.

На iPhone 4 с iOS 4.0.2 приложение работает без нареканий.

Приложение должно работать на iOS 3.0 и выше, поэтому я не решаюсь обновить 3G-телефон до iOS 4.0, потому что у меня не будет способа вернуть его на iOS 3.0.1.

Я пробовал оба базовых SDK 3.2 и 4.0. «Цель развертывания iPhone OS» установлена ​​на «iPhone OS 3.0».

Кто-нибудь знает, что может происходить? Любые советы о том, как отладить это?

Спасибо!

Код, вызвавший проблему:

var sample = $('<div></div>').text('sample');
navigator.notification.alert("test 1", "Test", "Dismiss");
$('#test').append(sample);
navigator.notification.alert("test 2", "Test", "Dismiss");

Появляются оба предупреждения «тест 1» и «тест 2», но текст «образец» появляется только иногда.

Я нашел следующую ветку, описывающую проблему. Проблема вызвана медлительностью телефона и доступом к DOM: http://groups.google.com/group/phonegap/browse_thread/thread/81460667fd771735

Исходя из этой темы, я опробую следующую рекомендацию и опубликую здесь, работает ли она: $ ('mySelector'). get (0) .innerHTML = 'my html code';

Ответы [ 2 ]

1 голос
/ 11 марта 2011

Мы решили эту проблему, переопределив функцию PhoneGap.run_command.

PhoneGap.run_command = function() {
  if (!PhoneGap.available || !PhoneGap.queue.ready)
    return;

  PhoneGap.queue.ready = false;

  var args = PhoneGap.queue.commands.shift();
  if (PhoneGap.queue.commands.length == 0) {
  clearInterval(PhoneGap.queue.timer);
  PhoneGap.queue.timer = null;
  }

  var uri = [];
  var dict = null;
  for (var i = 1; i < args.length; i++) {
    var arg = args[i];
    if (arg == undefined || arg == null)
    arg = '';
    if (typeof(arg) == 'object')
      dict = arg;
    else
      uri.push(encodeURIComponent(arg));
  }
  var url = "gap://" + args[0] + "/" + uri.join("/");
  if (dict != null) {
    url += "?" + encodeURIComponent(JSON.stringify(dict));
  }

  // Replaced document.location=url with these three lines to prevent the PhoneGap+innerHTML bug
  var iframe = document.createElement("IFRAME");
  iframe.setAttribute("src", url);
  var body = document.getElementsByTagName("BODY")[0];
  body.appendChild(iframe);
  body.removeChild(iframe);
};
1 голос
/ 07 сентября 2010

Существует ошибка в innerHTML в мобильном safari / uiwebview (минимум 3.2 и ниже): http://blog.johnmckerrell.com/2007/03/07/problems-with-safari-and-innerhtml/

Я использовал обходной путь из этого блога.

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