Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/453.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
UIWebView和JavaScript_Javascript_Iphone_Objective C_Cocoa Touch_Uiwebview - Fatal编程技术网

UIWebView和JavaScript

UIWebView和JavaScript,javascript,iphone,objective-c,cocoa-touch,uiwebview,Javascript,Iphone,Objective C,Cocoa Touch,Uiwebview,我发现UIWebView有一种奇怪的行为 在代表中 - (void)webViewDidFinishLoad:(UIWebView *)webView{ [self changeFont]; //[NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(changeFont) userInfo:nil repeats:NO]; } 在changeFont中,我调用java

我发现UIWebView有一种奇怪的行为

在代表中

- (void)webViewDidFinishLoad:(UIWebView *)webView{    
    [self changeFont];    
    //[NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(changeFont) userInfo:nil repeats:NO];
}
在changeFont中,我调用javaScript来更改网页的字体。它不会被应用,但如果我在代理webViewDidFinishLoad延迟几秒钟后调用ChangeFont方法,那么它将被应用。 如果文件很大,如果必须从代理webViewDidFinish启动计时器以应用文件的字体大小和样式,我们如何确定webview加载所需的时间

对此没有任何解释。我查了很多资料,文件里什么也没提到


为什么UIWebView会出现这种行为

尝试在主线程上调用“changeFont”方法。类似于[self-performSelectorInMainThread:…]

尝试在主线程上调用“changeFont”方法。类似于[self-performSelectorInMainThread:…]

我认为这是因为当
-(void)webViewDidStartLoad:(UIWebView*)webView
方法触发时,网页可能无法完全呈现(我指的是所有javascript、资源等)

这解释了为什么您的方法在延迟一段时间后第二次工作..(页面已完全加载)

您可以使用javascript到objective-c的回调来确定渲染过程是否结束, 有关此功能的更多信息(或小技巧)可以通过链接在“Javascript与Objective-C代码通信”部分找到


或者使用
stringByEvaluatingJavaScriptFromString:
-我已经提供了一个在另一个相关主题中使用它的示例

我认为这是因为在触发
-(void)webViewDidStartLoad:(UIWebView*)webView
方法时,网页可能无法完全呈现(我指的是所有javascript、资源等)

这解释了为什么您的方法在延迟一段时间后第二次工作..(页面已完全加载)

您可以使用javascript到objective-c的回调来确定渲染过程是否结束, 有关此功能的更多信息(或小技巧)可以通过链接在“Javascript与Objective-C代码通信”部分找到


或者使用
stringByEvaluatingJavaScriptFromString:
-我在另一个相关主题中提供了一个使用它的示例

苹果的文档解释说,在完成/开始加载帧时将调用
webviewdiffinishload
webviewdifestoad
因此,在调用
webViewDidFinishLoad
之后(当加载基本html时),页面中可能还有JavaScript或Ajax仍在执行。你需要等待他们全部完成

我建议两种尝试方法:

  • 向UIWebView的加载属性添加观察者
  • 将自定义JavaScript绑定到页面以判断您真正想要发生的事件(例如所有元素都加载了),然后使用JavaScript回调您的Objective-C
  • 后者在处理自定义事件时更强大。我回答的这个问题可能会有帮助:


  • 苹果的文档解释说,在完成/开始加载帧时,将调用
    webViewDidFinishLoad
    webViewDidStartLoad
    因此,在调用
    webViewDidFinishLoad
    之后(当加载基本html时),页面中可能还有JavaScript或Ajax仍在执行。你需要等待他们全部完成

    我建议两种尝试方法:

  • 向UIWebView的加载属性添加观察者
  • 将自定义JavaScript绑定到页面以判断您真正想要发生的事件(例如所有元素都加载了),然后使用JavaScript回调您的Objective-C
  • 后者在处理自定义事件时更强大。我回答的这个问题可能会有帮助:


  • 可能吗?不,它不会发射多次。它只发射一次。我的问题是,为什么在接收器中的内容仍在加载时调用委托。当receiver获得内容时,应调用webViewDidFinishLoad。在webViewDidFinishLoad中,如果(myWebView.loading==YES){NSlog(@“仍在加载”);}并且日志在控制台中打印,则表示未加载web视图并且正在调用委托。可能吗?不,它不会多次触发。它只触发一次。我的问题是,为什么在接收器中的内容仍在加载时调用委托。当receiver获得内容时,应调用webViewDidFinishLoad。在webViewDidFinishLoad中,如果(myWebView.loading==YES){NSlog(@“仍在加载”);}并且日志是在控制台中打印的,我会这样检查,这意味着未加载web视图,并且正在调用委托。