一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - IOS - iOS之UIWebView無法獲取web標題的解決方法

iOS之UIWebView無法獲取web標題的解決方法

2021-03-24 22:44飛魚灣 IOS

這篇文章主要為大家詳細介紹了iOS之UIWebView無法獲取web標題的解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下

最近遇到了一個問題,就是在UIWebView的代理方法里,執行document.titlejs代碼無法獲取網頁標題,代碼如下:

?
1
2
3
4
5
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
  // 取加載html文件的標題名
  NSString *title = [webView stringByEvaluatingJavaScriptFromString:@"document.title"];
}

出現這個問題,我首先確定是不是代碼的問題,經過分析,發現代碼沒有改動,但這次卻無法獲取網頁標題,甚是奇怪。經過查找分析,問題是在這一版中,前端人員把網頁的標題設置放在了異步操作里,導致UIWebView在加載網頁完成后,在代理方法webViewDidFinishLoad:里無法立即獲取標題,因為獲取標題的方法是異步的,而網頁加載完就會調用該代理方法,那時候的網頁title還沒有值,所以獲取不到title的值。

下面是網頁異步獲取title的代碼,使用了jQueryAjax技術來異步獲取title:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$.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來獲取標題,雖然可以解決,但是有風險,因為網頁獲取標題是異步的,而異步的時間就不確定,所以延時的時間也不確定,雖然可以加大延時的時間,但是不是完美的解決方法

?
1
2
3
4
5
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,修改后的網頁代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$.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端代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$.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端代碼:

?
1
2
3
4
5
6
7
context[@"setWebViewTitle"] = ^(){
  NSArray *args = [JSContext currentArguments];
  if (args.count == 1) {
    // 設置標題,只需要傳遞一個參數
    self.title = [args firstObject];
  }
};

其實,js調用原生的方式很多,這里只是一種比較簡單的方式,具體用哪種方式都是可以的,如果對這一塊的知識不甚了解,可以參考其它資料。

我找了網上許多的資料,發現動態修改網頁標題的大多都是同步操作,比較少介紹用異步操作動態修改標題的,所以我把動態設置標題的方法總結如上,希望給有需要的朋友一點幫助。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

延伸 · 閱讀

精彩推薦
  • IOSiOS實現控制屏幕常亮不變暗的方法示例

    iOS實現控制屏幕常亮不變暗的方法示例

    最近在工作中遇到了要將iOS屏幕保持常亮的需求,所以下面這篇文章主要給大家介紹了關于利用iOS如何實現控制屏幕常亮不變暗的方法,文中給出了詳細的...

    隨風13332021-04-02
  • IOSiOS中UILabel實現長按復制功能實例代碼

    iOS中UILabel實現長按復制功能實例代碼

    在iOS開發過程中,有時候會用到UILabel展示的內容,那么就設計到點擊UILabel復制它上面展示的內容的功能,也就是Label長按復制功能,下面這篇文章主要給大...

    devilx12792021-04-02
  • IOSiOS開發之視圖切換

    iOS開發之視圖切換

    在iOS開發中視圖的切換是很頻繁的,獨立的視圖應用在實際開發過程中并不常見,除非你的應用足夠簡單。在iOS開發中常用的視圖切換有三種,今天我們將...

    執著丶執念5282021-01-16
  • IOSiOS中滑動控制屏幕亮度和系統音量(附加AVAudioPlayer基本用法和Masonry簡單使用)

    iOS中滑動控制屏幕亮度和系統音量(附加AVAudioPlayer基本用法和

    這篇文章主要介紹了iOS中滑動控制屏幕亮度和系統音量(附加AVAudioPlayer基本用法和Masonry簡單使用)的相關資料,需要的朋友可以參考下...

    CodingFire13652021-02-26
  • IOSiOS開發技巧之狀態欄字體顏色的設置方法

    iOS開發技巧之狀態欄字體顏色的設置方法

    有時候我們需要根據不同的背景修改狀態欄字體的顏色,下面這篇文章主要給大家介紹了關于iOS開發技巧之狀態欄字體顏色的設置方法,文中通過示例代碼...

    夢想家-mxj8922021-05-10
  • IOSiOS自定義UICollectionViewFlowLayout實現圖片瀏覽效果

    iOS自定義UICollectionViewFlowLayout實現圖片瀏覽效果

    這篇文章主要介紹了iOS自定義UICollectionViewFlowLayout實現圖片瀏覽效果的相關資料,需要的朋友可以參考下...

    jiangamh8882021-01-11
  • IOS詳解iOS中多個網絡請求的同步問題總結

    詳解iOS中多個網絡請求的同步問題總結

    這篇文章主要介紹了詳解iOS中多個網絡請求的同步問題總結,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧...

    liang199111312021-03-15
  • IOSiOS中MD5加密算法的介紹和使用

    iOS中MD5加密算法的介紹和使用

    MD5加密是最常用的加密方法之一,是從一段字符串中通過相應特征生成一段32位的數字字母混合碼。對輸入信息生成唯一的128位散列值(32個字符)。這篇文...

    LYSNote5432021-02-04
主站蜘蛛池模板: 久久久久夜 | 亚洲AV蜜桃永久无码精品红樱桃 | 久久久免费观成人影院 | 国产未成女年一区二区 | 精品视频入口 | 日韩成本大片35分钟免费播放 | 亚洲www美色 | 日本亚欧乱色视频在线观看 | 羞羞视频免费观看网站 | 日韩亚洲一区中文字幕在线 | 国产农村一一级特黄毛片 | 操美女 | 成年美女黄网色大观看全 | 亚洲国产美女精品久久久久 | 日韩欧美亚洲一区二区综合 | 99精品国产高清自在线看超 | 国产午夜小视频 | av91在线 | 久久人妻少妇嫩草AV无码 | 大伊人青草狠狠久久 | 五月最新商场女厕所高跟嘘嘘 | 美国video| 日产2021免费一二三四区 | 久久99精品国产免费观看 | 给我免费观看的视频在线播放 | 青青草影院在线观看 | 边摸边吃奶玩乳尖视频 | 日韩欧美亚洲每日更新网 | 日韩欧美国内 | 百合互慰吃奶互揉漫画 | 国产成人精品视频午夜 | 亚洲国产第一 | 美国video | 三上悠亚精品专区久久 | 帅老头恋帅老头同性tv | 国内精品视频九九九九 | 午夜神器老司机高清无码 | 日韩欧美一区二区三区中文精品 | 香蕉视频在线观看网址 | 亚洲视频一区网站 | 高清麻生希在线 |