如何在非root元素上注册keypress事件监听器?

时间:2011-03-13 18:35:39

标签: svg

我一直在开发基于SVG的文本编辑器,我现在正在尝试 使它可以在一个SVG中实例化多个实例 文献。我一直试图实现这一点的方法是包装DOM 使用单个父级表示每个文本编辑器实例 元素(或者),然后附加一个按键事件 监听父元素。我遇到的问题, 似乎按键事件只是由文档接收 根。此外,对于我尝试过的所有浏览器SVG实现, target,originalTarget和explicitOriginalTarget事件属性, 当它们存在时,也设置为文档根目录,所以它不会 事件似乎可以通过附加单个来破解解决方案 文件根目录上的事件监听器,然后手动调度 通过读取事件的originalTarget属性来记录事件。

到目前为止,我已经测试了Firefox 3.6,Chromium 9,Opera 11和Batik Squiggle 1.7,包含以下测试用例:

http://stuff.echo-flow.com/svg-developers/testEventListener.svg

只有Batik按预期工作,rect元素接收 按键事件。在Firefox,target,originalTarget和 explicitOriginalTarget都等于根元素。在Chromium 和Opera,target设置为根元素,以及originalTarget和 explicitOriginalTarget未定义。

基本上,我要做的是将按键事件与之相关联 最初解雇它的元素。我想我可能会得到 如果我使用HTML上下文和嵌入的iframe,这可以工作;或者,如果我 在foreignObject中使用iframe。但我想知道是否有 更清洁的解决方法,不需要使用iframe。

此外,我认为在最糟糕的情况下,我可以做自己的打击 通过检查keypress的clientX / clientY属性进行测试 事件,并将其与所有文本编辑器组的bbox进行比较 元素。但是再一次,这似乎非常hacky,我想知道是否 有更好的方法。

1 个答案:

答案 0 :(得分:1)

首先,最好指定您在SVG文档中使用的SVG版本和baseProfile。

到目前为止,SVG仅支持(在规范中)those events,没有按键事件。浏览器比规范略胜一筹,所以,我们假设它得到了支持。

因此,您正在使用DOM 3事件keypress,因为它doesn't exist in DOM 2 Events 查看按键事件上下文信息:

  

Event.target:聚焦元素处理关键事件,如果没有合适的输入元素聚焦,则为根元素

焦点不是鼠标位置。在SVG 1.1规范中,不存在“可聚焦”属性,但您可以在SVG 2.0 draft中找到它。

所以Batik使用错误的“按键事件”实现。您可以使用“鼠标悬停事件”来了解您正在悬停的元素,或尝试“可聚焦”属性是否已在某些浏览器上运行。

此外,originalTarget和explicitOriginalTarget是特定于Mozilla的非标准格式,用于向其他浏览器解释您的结果。