getComputedStyle宽度和高度在真正的Android设备上的chrome webview中不起作用

时间:2016-03-18 14:31:58

标签: javascript webview

我有这个javascript函数:

function onFontLoad(cb,font,size,table,interval)
{
var div=document.createElement("div");
div.style.fontFamily=font;
div.style.fontSize=size;
div.style.position="absolute";
div.style.top="-100px"
div.style.left="-100px"
document.body.appendChild(div);
var checkInterval=setInterval(function()
{
    for(character in table)
    {
        div.textContent=character;
        var t=table[character];
        var s=getComputedStyle(div);
        if(parseInt(s.width)!=t[0]||parseInt(s.height)!=t[1]) return;
    }
    div.parentNode.removeChild(div);
    clearTimeout(checkInterval);
    cb();
},interval||200);

它起作用,因为android中的webview基于webkit。 由于WebView已更改为chrome,因此即使在Chromium浏览器中,我的功能也会停止工作。我建议使用Math.ceil进行舍入,也避免使用parseInt。

现在我有了这个功能:

function onFontLoad(cb, font, size, table, interval) {
var div = document.createElement("div");
div.style.fontFamily = font;
div.style.fontSize = size;
div.style.position = "absolute";
document.body.appendChild(div);
var getRawPixels = function (cssUnit) {
    // Round up to the highest unit.
    var re = /([\d.]+)(px)/; // css measure units.
    var results = cssUnit.replace(re, "$1");
    return Math.ceil((results * 10) / 10) ;
};
var checkInterval = setInterval(function () {
    for (var character in table) {
        div.textContent = character;
        var t = table[character];
        var s = getComputedStyle(div);
        if (getRawPixels(s.width) != t[0] || getRawPixels(s.height) != t[1]) return;
    }
    div.parentNode.removeChild(div);
    clearTimeout(checkInterval);
    cb();
}, interval || 200);

功能现在可以在Chromium浏览器或Android中使用(从4.4到6个模拟器开始),我在模拟器中进行webview渲染没有问题。但它在一些真实的设备上是空白的,即使没有webview硬件加速。(主要是android 5.x设备)但我很漂亮画布渲染没有问题,因为如果我评论或删除这个字符串:

  if (getRawPixels(s.width) != t[0] || getRawPixels(s.height) != t[1]) return;

即使使用我测试应用程序的真实Android设备,Webview也将按照预期重新开始渲染,但不使用onFontLoad函数的样式。

我在流程中发现的另一件事是Chrome开发者工具中的破碎webview在div之后添加了<i>。但是在模拟器中运行的相同代码很好地显示了画布并且在div之后没有任何<i>。但是如果我用div位置删除字符串,我可以在模拟器中破坏画布。在这个厄运之后,我也会在div之后的页面源代码中看到<i>

另外,我发现Chromium过去也遇到过getComputedStyle的问题。但我觉得getComputedStyle工作正常。

1 个答案:

答案 0 :(得分:1)

这是div隐藏的东西。我刚刚删除了隐藏,因为隐藏div后用应用程序在画布中摧毁了自己。简单就是关键。

function onFontLoad(cb, font, size, table, interval) {
    var div = document.createElement("div");
    div.style.fontFamily = font;
    div.style.fontSize = size;
    //div.style.position = "relative";
    document.body.appendChild(div);
    var checkInterval = setInterval(function () {
        for (var character in table) {
            div.textContent = character;
            var t = table[character];
            var s = getComputedStyle(div);
        }
        clearTimeout(checkInterval);
        cb();
    }, interval || 200);
}