在iPhone 3G上运行iOS 3.0的Phonegap应用程序忽略了更新DOM的调用

问题描述:

我正在使用phonegap/jquery/jqtouch开发iPhone应用程序。当使用运行iOS 3.0.1的iPhone 3G测试应用程序时,对DOM进行更改(例如'append()')的jquery调用不能一致地工作。在iPhone 3G上运行iOS 3.0的Phonegap应用程序忽略了更新DOM的调用

在呼叫'append'之前,我有一个警报呼叫,并在'append'呼叫之后有另一个警报呼叫。两个警报一致工作,但“追加”呼叫随机工作。有时DOM会被更新,有时不会。这些调用也不会导致错误。就好像他们被忽略了一样。

在iOS 4.0.2的iPhone 4上,该应用程序完美无瑕。

该应用程序需要适用于iOS 3.0及以上版本,因此我不愿意将3G手机升级到iOS 4.0,因为我无法将其恢复到iOS 3.0.1。

我已经尝试了3.2和4.0的基础SDK。 '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”出现,但文本“样本”只是有时会出现。

我找到了下面的线程来描述这个问题。 http://groups.google.com/group/phonegap/browse_thread/thread/81460667fd771735

基于线程的,我要请尝试以下建议,并将张贴在这里无论是它的工作: $(“mySelector”)问题是由手机的缓慢和访问DOM引起.get(0).innerHTML ='我的html代码';

+0

显示一些代码在这里会有所帮助,尤其是对你所说的“append”的调用并不一致。 – 2010-09-05 00:03:53

有一个在innerHTML的在移动Safari/UIWebView中(至少3.2及以下)的一个错误: http://blog.johnmckerrell.com/2007/03/07/problems-with-safari-and-innerhtml/

我使用的解决方法从该博客。

我们通过覆盖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); 
}; 
+0

所以这是一个phonegap bug?这个错误是什么? 没有尝试你的解决方案,但你应该警告phonegap团队! – Samuel 2011-05-20 21:12:13

+0

Samuel Michelot:错误在于,当加载一个新的URL时,文档被优化为忽略一些DOM更新。 (如果我们正在加载新页面,为什么还要刷新DOM?)PhoneGap桥接调用通过在Objective-C侧取消的'location.href'重定向实现 – rpetrich 2011-07-10 11:39:42