Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在原生iPhone应用程序的UIWebView中使用InnerHTML是否存在缺陷?_Javascript_Iphone_Jquery_Uiwebview - Fatal编程技术网

Javascript 在原生iPhone应用程序的UIWebView中使用InnerHTML是否存在缺陷?

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

我有一个相当大的HTML/JS/CSS应用程序,在iPhone上以Safari作为web应用程序运行时效果非常好

在本机iPhone应用程序中的UIWebView中运行此应用程序时,在jQuery中调用以创建HTML片段会自动失败(即:
$(“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后添加子元素,它似乎工作正常。这花了一段时间,但似乎解决了问题。