私はGoogleクロージャーを使用して、iPadSafariで表示するHTML/JSでシンプルなインタラクティブグラフィックを作成しています。
以下のコードサンプルは、Safari Macおよびその他すべての主要なブラウザで予想される動作を示しています(クリックするとコンソールメッセージが生成される円が表示されます)が、SafariiPadでは表示されません。サークルにイベントハンドラーが登録されていません。代わりに、エラーがスローされます。
goog.require('goog.graphics');
goog.require('goog.events.EventType');
goog.require('goog.graphics.Stroke');
goog.require('goog.graphics.SolidFill');
var showCircle = function() {
var graphics = goog.graphics.createGraphics(400, 400);
var stroke = new goog.graphics.Stroke(1, 'black');
var fill = new goog.graphics.SolidFill('#00ff00', 0.5);
var circle = graphics.drawEllipse(100, 100, 30, 30, stroke, fill);
var element = goog.dom.getElement('demo');
graphics.render(element);
console.info(circle.getElement());
goog.events.listen(circle, goog.events.EventType.MOUSEDOWN, function(e) {
console.info('mousedown');
});
};
エラーは次のようになります(base.jsからスローされます):
804行目のJavaScriptエラー...TypeError:式'obj'[null]の結果はオブジェクトではありません。
この問題は、circleにDOM要素がないことと、リスナーをcircleに登録しようとするとcircle.getElement()にリスナーを登録しようとすることに起因していると思います。クエリを実行すると、circle.getElement()はnullを返し、エラーを説明します。iPad Safariではコンソール出力メッセージがnullと出力されることに注意してください。ただし、次の点に注意してください。
<ellipse cx="100" cy= "100" rx="30" ry="30" stroke="black" stroke-width="1" fill= "#00ff00" fill-opacity="0.5">
MacSafariで。
MacとiPadSafariの両方で、円は同じように描かれます。唯一の違いはエラーです。goog.events.EventType.MOUSEDOWNの代わりにイベント名として「touchstart」を使用しても違いはありません。
iPadでエラーが発生しないようにイベントリスナーをサークルに登録したい。これどうやってするの?