iOS之UIWebView无法获取web标题
最近遇到了一个问题,就是在UIWebView
的代理方法里,执行document.title
的js
代码无法获取网页标题,代码如下:
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
// 取加载html文件的标题名
NSString *title = [webView stringByEvaluatingJavaScriptFromString:@"document.title"];
}
出现这个问题,我首先确定是不是代码的问题,经过分析,发现代码没有改动,但这次却无法获取网页标题,甚是奇怪。经过查找分析,问题是在这一版中,前端人员把网页的标题设置放在了异步操作里,导致UIWebView
在加载网页完成后,在代理方法webViewDidFinishLoad:
里无法立即获取标题,因为获取标题的方法是异步的,而网页加载完就会调用该代理方法,那时候的网页title
还没有值,所以获取不到title
的值。
下面是网页异步获取title
的代码,使用了jQuery
和Ajax
技术来异步获取title
:
$.ajax({
url: remoteur+'/api/innerMessageApi/noticeMessage.htm?callBackFunc=xx',
type: 'get',
dataType: 'jsonp',
jsonpCallback:"xx",
data: {msgId: msgId},
success: function(res){
console.log(res);
if ( res.successFlag == 'Y' ){
content = res.content;
title = res.title;
}
},
complete:function(res){
document.title = title;
$('body').append(content);
}
})
出现这个问题的时候,恰是项目要上线的那天晚上,在集体加班时,遇到这个问题,感觉那一夜,被深深伤害。。。
好了,闲话不多说,下面来介绍解决办法:
方法一
如果只是考虑iOS
方面的解决方法,可能就是延时获取title
,具体就是在webViewDidFinishLoad:
里通过延时来执行document.title
来获取标题,虽然可以解决,但是有风险,因为网页获取标题是异步的,而异步的时间就不确定,所以延时的时间也不确定,虽然可以加大延时的时间,但是不是完美的解决方法
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
self.title = [webView stringByEvaluatingJavaScriptFromString:@"document.title"];
});
方法二
如果考虑网页端,可以把网页中获取title
的异步操作改成同步操作,根据上述的js
代码,可以添加一个同步的字段async: false
,修改后的网页代码如下:
$.ajax({
url: remoteur+'/api/innerMessageApi/noticeMessage.htm?callBackFunc=xx',
type: 'get',
dataType: 'jsonp',
jsonpCallback:"xx",
data: {msgId: msgId},
// 设置同步操作
async: false,
success: function(res){
// 同步设置标题
document.title = res.title;
complete:function(res){
...
}
})
虽然这样可以解决该问题,但是依然不是很好的解决办法,比如网页在加载时,用同步的方式获取网页标题,假如同步操作被阻塞,那么网页加载就被阻塞,进而导致网页无法展示,所以依然不是最优的解决方法。
方法三
如果把网页端和iOS
端结合起来,可以在网页端异步获取标题,在获取到标题后通过js
调用原生的方法来设置标题,这样既可以不因同步获取标题而阻塞网页加载过程,也不会因延时获取标题而造成延时时间无法确定的问题,所以该方法可以完美解决这个问题
js
端代码:
$.ajax({
url: remoteur+'/api/innerMessageApi/noticeMessage.htm?callBackFunc=xx',
type: 'get',
dataType: 'jsonp',
jsonpCallback:"xx",
data: {msgId: msgId},
// 设置同步操作
async: false,
success: function(res){
// 同步设置标题
document.title = res.title;
// js调用原生方法来设置标题
setWebViewTitle(title);
complete:function(res){
...
}
})
iOS
端代码:
context[@"setWebViewTitle"] = ^(){
NSArray *args = [JSContext currentArguments];
if (args.count == 1) {
// 设置标题,只需要传递一个参数
self.title = [args firstObject];
}
};
其实,js
调用原生的方式很多,这里只是一种比较简单的方式,具体用哪种方式都是可以的,如果对这一块的知识不甚了解,可以参考其它资料。
我找了网上许多的资料,发现动态修改网页标题的大多都是同步操作,比较少介绍用异步操作动态修改标题的,所以我把动态设置标题的方法总结如上,希望给有需要的朋友一点帮助。
iOS之UIWebView无法获取web标题的更多相关文章
- 自定义带进度条的WebView , 增加获取web标题和url 回掉
1.自定义ProgressWebView package com.app.android05; import android.content.Context; import android.graph ...
- IOS客户端UIwebview下web页面闪屏问题
基于ios客户端uiwebview下的web页面,在其内容高度大于视窗高度时,如果点击超过视窗下文档的底部按钮,收缩内容高度,会发生闪屏问题. 外因是由文档的高度大于视窗的高度所致,本质原因未知. 解 ...
- UIWebView如何获取内容高度
iOS UIWebView如何获取到内容的高度呢?我们经常会遇到项目中需要使用UIWebView来加载H5页面,但是页面的高度并不确定,而我们前端需要根据内容的高度呈现出来,且不允许webview滚动 ...
- iOS基础 - UIWebView
一.UIWebView简介 是iOS内置的浏览器控件,可以浏览网页.打开文档等 能够加载html/htm.pdf.docx.txt等格式的文件 系统自带的Safari浏览器就是通过UIWebView实 ...
- iOS(UIWebView 和WKWebView)OC与JS交互 之二
在iOS应用的开发过程中,我们经常会使用到WebView,当我们对WebView进行操作的时候,有时会需要进行源生的操作.那么我记下来就与大家分享一下OC与JS交互. 首先先说第一种方法,并没有牵扯O ...
- iOS Programming UIWebView 2
iOS Programming UIWebView 1 Instances of UIWebView render web content. UIWebView可以显示web content. In ...
- Java获取Web服务器文件
Java获取Web服务器文件 如果获取的是服务器上某个目录下的有关文件,就相对比较容易,可以设定死绝对目录,但是如果不能设定死绝对目录,也不确定web服务器的安装目录,可以考虑如下两种方式: 方法一: ...
- 传递多个参数并获取Web API的数据
近段时间学习Web Api觉得非常有意思.默认的路由情况之下,获取数据时,它不必指定Action操作名. 还有另外感想,就是自从学习asp.net MVC之后,加上jQuery,让Insus.NET已 ...
- php正则获取网页标题、关键字、网页描述代码
php正则获取网页关键字,代码如下: function get_keywords($html) { $html=strtolower($html); preg_match("@<hea ...
随机推荐
- 学习java 的经验
一.学习java首先应该对他有个全局的看法 ,他由几部分组成 1.java 的基础语法 2.使用Swing 来做桌面应用,可做嵌入式开发. 3.JDBC数据库的链接 4.网络编程,主要是socket编 ...
- Scrapy爬虫实例教程(二)---数据存入MySQL
书接上回 实例教程(一) 本文将详细描述使用scrapy爬去左岸读书所有文章并存入本地MySql数据库中,文中所有操作都是建立在scrapy已经配置完毕,并且系统中已经安装了Mysql数据库(有权限操 ...
- java操作DBF的使用
1.引入javadbf.4.1.jar 2. import com.linuxense.javadbf.DBFField; import com.linuxense.javadbf.DBFRead ...
- window.onload 和 $(document).ready()
一. window.onload 1. 必须等到页面上所有元素(包括图片, JS文件,CSS文件等外部资源)加载完成后才执行 2. window.onload绑定多个函数时,只会执行最后一个 < ...
- 关于springmvc配置validator的注意事项
<mvc:annotation-driven validator="validator" /> 在使用springmvc整合hibernate-validator做表单 ...
- 手机摄像头扫描识别车牌号,移动端车牌识别sdk
一.移动端车牌识别应用背景 (技术交流:18701686857 QQ:283870550) 随着经济水平的不断提高,汽车数量的不断激增为汽车管理带来了不小的难度.路边违章停车的现象越来越频繁.现在, ...
- web组件工具之获取表单数据:webUtils
本文需要的架包:commons-beanutils-1.8.3.jar.commons-logging-1.1.3.jar.servlet-api.jar. 本文共分为五部分:1)封装通用工具类:从表 ...
- jqthumb.js缩略图插件-让缩略图正常显示而不变形
插件介绍 项目中有图片的时候,有的宽大于高,有的宽小于高,尤其在做图片列表的时候,经常发现缩略图会有变形的.我们怎样来解决这一问题呢. 方法一:用photoshop来处理缩略图.小的项目还可以,大的项 ...
- Linux(4)系统管理
系统管理 cal :查看当前月份和日历, 加-y查看整年日历 date :显示或设置时间 设置时间格式(需要管理员权限) date [MMDDhhmm[[CC]YY][.ss]]+format CC为 ...
- Android文件上传与下载
文件上传与下载 文件上传 -- 服务端 以Tomcat为服务器,Android客服端访问Servlet,经Servlet处理逻辑,最终将文件上传,这里就是简单模拟该功能,就将文件上传到本机的D:\\u ...