webview下改变title无法生效

今天遇到这么一种情况,
hybrid列表页item点击后跳转到详情页,同时将详情id传到详情页,详情页发送ajax请求把内容填入dom中。
这种情况下webview中的<title>会为空,因为webview抓取内容渲染页面是发生在js将内容填充到<title>之前的,因此渲染的时候<title>是空。

正确的流程应该是这样:

1. webview获得title字段
2. webview将title字段填入<title>中
3. webview渲染<title>与展示<title>标签

此时的流程为:

//这个流程是错误的,导致结果就是开头的问题
1. (3)webview渲染与展示了一个空的<title>
2. (1)webview获得title字段
3. (2)webview将title字段填入<title>中

网上找到解决方案如下:

//----------代码块  1 -------------
//需要jQuery 
var $body = $('body'); 
document.title = 'test'; 
// hack在微信等webview中无法修改document.title的情况 
var $iframe = $('<iframe src="/favicon.ico"></iframe>'); 
$iframe.on('load',function() { 
    setTimeout(function() { 
        $iframe.off('load').remove(); 
    }, 0); 
}).appendTo($body);

以上方案是确实可以改变<title>的,但是大部分需要js改变<title>的情况都是需要发送ajax请求从后台获取title再填充到<title>中的,此时把上面的代码放入ajax的回调函数中,失效。

将以下代码放到回调之外,发现未生效,因此断定在下一个event loop中调用代码块1会失效

//--------- 代码块 2 --------------
//在代码块1放入setTimeout中模拟回调函数
setTimeout(function(){
    //需要jQuery 
    var $body = $('body'); 
    document.title = 'test'; 
    // hack在微信等webview中无法修改document.title的情况 
    var $iframe = $('<iframe src="/favicon.ico"></iframe>');
    $iframe.on('load',function() { 
        setTimeout(function() { 
            $iframe.off('load').remove(); 
        }, 0); 
    }).appendTo($body);
},0);

再到网上搜,找到另外一种纯js写法,是OK的,原理一样,只是不依赖jq

//以下代码可以解决以上问题,不依赖jq
//放入回调函数中请自行取掉setTimeout
setTimeout(function(){
    //利用iframe的onload事件刷新页面 
    document.title = 'test'; 
    var iframe = document.createElement('iframe');
    iframe.style.visibility = 'hidden'; 
    iframe.style.width = '1px'; 
    iframe.style.height = '1px'; 
    iframe.onload = function () { 
        setTimeout(function () {
            document.body.removeChild(iframe); 
        }, 0); 
    }; 
    document.body.appendChild(iframe);
},0);
总结

webview下js改变title无法生效的问题我在去年遇到过,当时不知道怎么解决了,这是个古老的问题,但是貌似没有什么正统的解法。以上两种代码——依赖与不依赖jq,其原理都是利用iframe的加载可以局部刷新页面,从而使<title>被重新渲染。

以下两个为留存疑问,有时间研究一下再补充,

  1. 上面两种代码为什么一个可以用一个不可以?区别在哪?
  2. 底层的原理是什么?
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,316评论 25 708
  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,801评论 1 92
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,241评论 4 61
  • 冬天的季节总是神秘莫测,忽而阳光普照,温暖如春,午后的那一刻太阳挂在中天,令人眩晕的光线,折射出多彩的人间事像。忽...
    奶酪没有酱阅读 254评论 0 1
  • 陪宝排练,在一个文化培训学校,前台老师和音响师都是十分不开心的样子,行业中人,照理说应该理解孩子的好奇,会有方法引...
    天蓝Sea阅读 205评论 0 0