Javascript 在原生iPhone应用程序的UIWebView中使用InnerHTML是否存在缺陷?
我有一个相当大的HTML/JS/CSS应用程序,在iPhone上以Safari作为web应用程序运行时效果非常好 在本机iPhone应用程序中的UIWebView中运行此应用程序时,在jQuery中调用以创建HTML片段会自动失败(即:Javascript 在原生iPhone应用程序的UIWebView中使用InnerHTML是否存在缺陷?,javascript,iphone,jquery,uiwebview,Javascript,Iphone,Jquery,Uiwebview,我有一个相当大的HTML/JS/CSS应用程序,在iPhone上以Safari作为web应用程序运行时效果非常好 在本机iPhone应用程序中的UIWebView中运行此应用程序时,在jQuery中调用以创建HTML片段会自动失败(即:$(“HELLO WORLD”);不会创建元素 我在clean jQuery方法中找到了以下等效的代码片段: var div=document.createElement(“div”); div.innerHTML=“你好世界” 当我查看div.outerHTML
$(“HELLO WORLD”);
不会创建元素
我在clean jQuery方法中找到了以下等效的代码片段:
var div=document.createElement(“div”);
div.innerHTML=“你好世界”
当我查看div.outerHTML时,我看到
/
div.innerHTML
返回一个空字符串
这似乎不是一个jQuery问题,也不是100%的情况下都会发生。我还没有找到一个模式,但在某些情况下,它可以连续工作2-3次,有时如果连续失败5-6次。这似乎只在Objective-C应用程序的UIWebView中运行应用程序时才会出现。而且我只使用了在运行iOS 4.2的实际设备上,而不是在仿真器上
有人遇到过类似的情况吗?有人有解决办法吗?我也遇到过这个问题。当手机的CPU非常忙(比如100%)时会发生这种情况。然后渲染引擎有时会忘记innerHTML设置 my中包含的解决方案是测试childNodes中是否有元素,否则再次应用它
var target = document.createElement("div");
var text = "<div>Hello World</div>";
target.innerHTML = text;
var self = this;
self.__intervalHandle = window.setInterval(function() {
target.innerHTML = text:
if (target.firstChild) {
window.clearInterval(self.__intervalHandle);
self.__intervalHandle = null;
}
}, 100);
var target=document.createElement(“div”);
var text=“你好,世界”;
target.innerHTML=文本;
var self=这个;
self.\uu intervalHandle=window.setInterval(函数(){
target.innerHTML=文本:
if(target.firstChild){
窗口清除间隔(self.\u intervalHandle);
self.\uu intervalHandle=null;
}
}, 100);
这迫使渲染引擎将innerHTML应用于DOM,并给渲染引擎一些时间(在本例中为100毫秒,在我们的测试中为一个很好的值)来处理它。好的,解决方案[不是生产质量解决方案]由Sebastian发布的帖子有效,但我无法确认CPU负载是否会导致此问题。我在iOS主机上生成了大量后台负载,无法重现此问题 经过进一步调查,呈现问题似乎是iOS shell取消导航的副作用。一旦iOS shell取消导航,呈现引擎可能会认为不需要呈现更多UI[在一小段时间内基本上不呈现任何内容] 解决此问题的一种方法是将命令作为散列(
#
)参数而不是URL发送到iOS shell。这样iOS shell将获得命令,而不需要取消导航。这种方法似乎在下面的测试代码中起作用。因此,如果window.location设置为location1,它将发出“At:1”警报元素e2没有值。如果window.location设置为location2,则会发出“At:0”警报,元素e2具有该值
@凯文,你能确认发生这种行为时你正在取消iOS主机上的导航吗
测试代码:
Javascript:
var location1 = "myApp://Test";
var location2 = "#myApp://Test";
$("#change").live("click", function (e) {
var element = document.getElementById("e1");
window.location = location1; var i = 0;
element.innerHTML = "At: " + i;
window.__intervalHandle = window.setInterval(function () {
var html = element.innerHTML;
if (html) {
alert(html);
window.clearInterval(window.__intervalHandle);
window.__intervalHandle = null;
} else {
element.innerHTML = "At: " + ++i;
}
}, 1);
document.getElementById("e2").innerHTML = "Test";
});
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
NSURL* u = [ request URL];
if( [[u scheme] compare:@"myapp" ] == NSOrderedSame) {
{
return NO; // don’t navigate
}
return YES; // navigate
}
iOS伪代码:
var location1 = "myApp://Test";
var location2 = "#myApp://Test";
$("#change").live("click", function (e) {
var element = document.getElementById("e1");
window.location = location1; var i = 0;
element.innerHTML = "At: " + i;
window.__intervalHandle = window.setInterval(function () {
var html = element.innerHTML;
if (html) {
alert(html);
window.clearInterval(window.__intervalHandle);
window.__intervalHandle = null;
} else {
element.innerHTML = "At: " + ++i;
}
}, 1);
document.getElementById("e2").innerHTML = "Test";
});
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
NSURL* u = [ request URL];
if( [[u scheme] compare:@"myapp" ] == NSOrderedSame) {
{
return NO; // don’t navigate
}
return YES; // navigate
}
你应该看一看
事实证明,取消作为
-webView:shouldStartLoadWithRequest:
委托方法一部分的导航可能会导致innerHTML出现问题。我更新了我们的JS代码,使用了那篇文章中推荐的方法,我已经有一段时间没有看到innerHTML出现问题了。谢谢Sebastian-这可能会让我找到正确的方法这个调用实际上是在jQuery中,所以异步方法可能不起作用,但知道发生了什么很好,我可能会考虑到这一点来开发一些解决方案。感谢C.Ross-我无法直接将失败行为与我正在做的任何事情联系起来,但当我回到应用程序时,我会将所有代码更改为您建议的代码现在我发现,如果我创建的元素没有任何子元素,然后在元素创建并连接到DOM后添加子元素,它似乎工作正常。这花了一段时间,但似乎解决了问题。