【问题标题】:Event Object on FirefoxFirefox 上的事件对象
【发布时间】:2013-03-29 05:49:59
【问题描述】:

抱歉,这似乎很讨人喜欢...这就是为什么 firefox 没有像 Chrome 一样更改其代码以完全符合 Event 对象的原因。我已经完成了作业,尝试了 StackOverflow 上给出的几种解决方案,但似乎没有任何效果。我有这个代码:

function xpto(e) {
if( !e ) e = window.event;
  var x = e.target||e.srcElement;
alert(x);
    ........
}

调用如下:

<svg id="graph-svg" onclick="xpto(event)" style="outline: none;" preserveAspectRatio="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">

是的...这是一个 svg 元素,我试图点击它。我没有放完整的代码,因为它与问题无关。底线,

alert(x)

在 Firefox 上总是以未定义的形式发出警报,并且在 Chrome 上工作就像一个魅力。我可以在 Firefox 上抓取事件,但“x”总是未定义。

在 DOM 描述的 firefox 中,支持 Event 和 SVG。为了向后兼容,甚至使用“target”和“srcElement”属性定义了事件。

我在 Ubuntu 上使用 Firefox 20...有人可以帮忙吗?

【问题讨论】:

  • 你试过console.log(x);在 firebug 中查看更多详细信息?
  • 是的,即使是 Firebug,它也说调用中的“事件”未定义......它向我显示了一个错误,其中 onclick 应该显示为:function onclick(evt) { xpto(event) }我猜是火狐上onclick的定义……然后就落入handler中……
  • 当我在 Firebug 中运行类似的代码时......像 onclick="doSomething(event)" 和 doSomething(event){console.log(event);} 它确实出现了......(并且有目标)
  • 我的没有...可能是因为我在 Ubuntu 上运行,但是根据您的回答,我得到了提示并利用了它。在您回复后,我查看了代码,发现在 firefox 中有效的参数不是“event”或“Event”而是“evt”...... Firebug 中的控制台(应该是真正的浏览器名称......)显示了这一点: function onclick(evt) { xpto(event) } 因此,我意识到处理程序是用“event”而不是原始参数“evt”调用的。然后当它落入处理程序时,“事件”被作为“空”传递。我真的,真的希望这对某人有所帮助。
  • 这在 Chrome 中有效的唯一原因是它复制了 IE 的 window.event,而不是因为它更“合规”。

标签: javascript jquery events firefox object


【解决方案1】:

在 d'alar'cop 回复后,我查看了代码,发现在 firefox 中有效的参数不是“event”或“Event”而是“evt”...... Firebug 中的控制台显示了这一点:

    function onclick(evt) { xpto(event) }

因此,我意识到处理程序是用“event”而不是原始参数“evt”调用的。然后当它落入处理程序时,“事件”将变为“空”......未定义。

【讨论】:

  • 是的。 SVG 规范定义了 SVG 元素上的事件处理程序使用 evt 作为参数,而不是像 HTML 那样使用 event。为什么他们决定不做与 HTML 相同的事情……谁知道呢。 :(
  • 我们也在使用广泛的 SVG。我们最近不得不在 SVG 中的函数中添加一个事件。在我们在 Android 上试用 Firefox 之前,所有主流浏览器都在多个操作系统/设备上运行。错误是事件为空。在网上搜索并在几分钟内找到了此链接。您的修复无疑为我们节省了数小时或数天。
【解决方案2】:

很多时候我看到事件处理程序内联在 HTML 代码中,而不是依赖更强大的 event listeners

改为使用onclick 为什么不将侦听器附加到SVG 元素?你可以试试这个:

var addListener = function (element, event, callback) {
    // We define a cross-browser function
    if (window.addEventListener) {
        // Mozilla/Webkit/Opera
        element.addEventListener(event, callback, false);
    } else {
        // IE
        element.attachEvent('on' + event, callback);
    }
};

// Then we attach the event listener to the SVG element
addListener(document.getElementById('graph-svg'), 'click', function (evt) {
    // Here you can manage the fired event
    alert(evt);
});

或者,使用 jQuery:

$('#graph-svg').on('click', function(evt){
    alert(evt);
});

您可以使用此 fiddle 进行尝试(在 Ubuntu 12.10 上使用 FF 20.0 和 Chrome 26 进行测试)。

当然,内联处理程序并不总是邪恶的,但很多时候它们不是解决方案,恕我直言。

【讨论】:

  • 问题不在于以这种方式完成的事件处理程序......这是我的浏览器没有检测到“事件”。我可以用你告诉的任何方式来做,jquery,raw javascript listener,但是一旦我通过“事件”,它就会在“目标”上空出来。当我开始通过“evt”时,它起作用了。我的问题出在浏览器本身,而不是架构 :) 但是感谢您的建议。
  • 是的,FF 使用evt 作为全局事件处理程序,但我的观点是,通常使用内联代码(在某些情况下也被环境禁止)作为事件处理程序是 bad 习惯,因为给我们带来了很多我们不会遇到的使用事件监听器的问题。无论如何都欢迎你:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-18
  • 2015-11-14
  • 2016-03-29
  • 1970-01-01
  • 2017-10-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多