试图解决我遇到的一个非常烦人的问题。我有一个允许用户绘制的 HTML5 画布,它加载在 iframe 中。当页面第一次加载时,它会检查我们是否在移动设备上,如果是,它会调整整个页面的大小,包括 iframe。然后我有一个每隔几秒运行一次的 setTimeout 来检查我的画布是否与它加载的框架的大小不同。如果不同,我更改画布大小然后重新初始化它(使用 Kineticjs 1.0,我知道有较新的版本,但我们还没有准备好升级)。
这适用于我们测试的大多数移动浏览器,但 Chrome(在 iOS 和 Android 上)不允许在页面首次纵向加载或方向更改后在画布上绘图。它只是滚动页面(标准触摸事件)并忽略我所有的 preventDefaults。方向改变后,我什至无法让它在 touchstart 上发出警报。
有没有人遇到过这个?我认为这要么是画布本身正在发生变化,要么是一旦在 Kinetic 中创建了新阶段(画布),所有已定义的侦听器都会被忽略。
更新:
这是我正在处理的一些代码:
// This page is loaded in a frame, so we check to see when the parent is loaded
parent.$(document).ready(function()
{
$(document).ready(function()
{
ut();
setTimeout('start_orientation_detect_timer()','2000');
});
});
function start_orientation_detect_timer()
{
if(document.getElementById("data").value.length == 0 && Math.floor(canvas.width) != Math.floor(parent.$(parent.top_origin.frame_array['sig_block_frame']).width()) || Math.floor(canvas.height) != Math.floor(parent.$(parent.top_origin.frame_array['sig_block_frame']).height()))
{
if(top_origin.misc_variables.mobile_device !== false && top.window.orientation == 0)
{
parent.$('#flip_to_landscape_msg').show();
parent.$('#flip_to_landscape_msg').effect("pulsate", { times:200 }, 2000);
}
else
{
parent.$('#flip_to_landscape_msg').stop(true, true);
parent.$('#flip_to_landscape_msg').hide();
}
ut();
}
else
{
// so from this frame several deep, we need to know the orientation, which will only be in the top of the DOM
if(document.getElementById("data").value.length == 0 && top_origin.misc_variables.mobile_device !== false && top.window.orientation == 0)
{
parent.$('#flip_to_landscape_msg').show();
parent.$('#flip_to_landscape_msg').effect("pulsate", { times:200 }, 2000);
}
else
{
parent.$('#flip_to_landscape_msg').stop(true, true);
parent.$('#flip_to_landscape_msg').hide();
}
}
setTimeout('start_orientation_detect_timer()','2000');
}
function ut()
{
canvas=document.getElementById("drawing_canvas");
context = canvas.getContext("2d");
//console.log(Math.floor(parent.$(parent.top_origin.frame_array['sig_block_frame']).width())+' '+Math.floor(canvas.width)+' '+Math.floor(parent.$(parent.top_origin.frame_array['sig_block_frame']).height())+' '+Math.floor(canvas.height));
canvas.width = parent.$(parent.top_origin.frame_array['sig_block_frame']).width();
document.getElementById('saved_layer').style.width = canvas.width;
canvas.height = parent.$(parent.top_origin.frame_array['sig_block_frame']).height();
document.getElementById('saved_layer').style.height = canvas.height;
myStage = new Kinetic.Stage(canvas);
canvas.onmousemove = function()
{
var mousePos = myStage.getMousePos();
var mouseDown = myStage.getMouseDown();
if (mousePos!=null && mouseDown)
{
draw_b(mousePos.x, mousePos.y);
}
else
{
new_segment = true;
}
};
canvas.ontouchstart = function()
{
BlockMove(event);
}
canvas.ontouchmove = function()
{
var mousePos = myStage.getMousePos();
console.log(mousePos);
if (mousePos!=null)
{
draw_b(mousePos.x, mousePos.y);
}
};
canvas.ontouchend = function()
{
new_segment = true;
};
myStage.listen();
}
function BlockMove(event)
{
// Tell Safari not to move the window.
event.preventDefault() ;
}
我知道其中一些不是最新的代码,但它确实可以在 Chrome 移动设备上使用。我已经做到了,如果我不调用 start_orientation_detect_timer 那么画布只有大约 100 像素宽 x 210 高,但我可以在 Chrome 移动设备上绘制它。似乎一旦画布被拉伸,我就不能再画了。甚至没有更大笔画的更大画布,什么也没有发生,也没有触发触摸启动。