我正在使用 Google 闭包在 HTML/JS 中创建一个简单的交互式图形,以便在 iPad Safari 上查看。
下面的代码示例显示了 Safari Mac 和所有其他主要浏览器上的预期行为(单击时会出现一个圆圈会生成控制台消息),但不是 Safari iPad。没有向圈子注册事件处理程序。相反,会引发错误。
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] 的结果不是对象。
我想我已经将问题追溯到缺少圆的 DOM 元素,以及在圆上注册侦听器试图在 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">
在 Mac Safari 上。
在 Mac 和 iPad Safari 上,圆圈的绘制方式相同。唯一的区别是错误。使用“touchstart”作为事件名称而不是 goog.events.EventType.MOUSEDOWN 没有区别。
我想用 circle 注册一个事件侦听器,而不会在 iPad 上生成错误。我怎样才能做到这一点?