私が抱えている本当に厄介な問題を解決しようとしています。ユーザーが描画できるHTML5キャンバスがあり、iframeにロードされています。ページが最初に読み込まれると、モバイル デバイスを使用しているかどうかがチェックされ、モバイル デバイスが使用されている場合は、iframe を含むページ全体のサイズが変更されます。次に、数秒ごとに実行される setTimeout を使用して、キャンバスが読み込まれたフレームと異なるサイズであるかどうかを確認します。異なる場合は、キャンバスのサイズを変更してから再初期化します (Kineticjs 1.0 を使用して、新しいバージョンですが、アップグレードする準備ができていません)。
これは、テストしたほとんどのモバイル ブラウザーで機能しますが、Chrome (iOS および Android) では、ページが最初に縦向きで読み込まれたとき、または向きが変更された後に、キャンバスに描画できません。ページをスクロールするだけで (標準のタッチ イベント)、すべての preventDefaults を無視します。向きが変わった後、タッチスタートでアラートを出すことさえできません。
誰もこれに遭遇したことがありますか?キャンバス自体が変化しているという事実、または新しいステージ(キャンバス)がキネティックで作成されると、定義されたすべてのリスナーが無視されるようになると考えています。
更新:
これが私が扱っているコードの一部です:
// 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 ピクセル、高さ 210 ピクセルしかありませんが、Chrome モバイルで描画できます。キャンバスを伸ばしたらもう描けないらしい。より大きなストロークを持つより大きなキャンバスでさえ、何も起こらず、タッチスタートはトリガーされません。