【问题标题】:Simulating contenteditable in SVG without foreignobject在没有异物的情况下模拟 SVG 中的 contenteditable
【发布时间】:2013-12-06 17:05:58
【问题描述】:

我编写了一个网络应用程序,用户可以在其中创建带有文本的 svg 元素。我想模拟 svg 元素内部的 contenteditable 元素,以便用户可以动态编辑 svg 元素的内容。也就是说,当用户单击这些元素之一时,应该会出现一个光标,以便可以编辑文本。我不想使用 foreignobject 来实现这一点,因为 IE 不支持。我在网上找不到任何有用的东西,请问有什么办法吗?

编辑:为了澄清,这里是一个例子:

<svg>
    <rect width="192" height="192" style="stroke-width: 3; fill:red"></rect>
    <text x="30" y="20">A sample text</text><!-- when the user clicks on this, it should be editable-->
</svg>

【问题讨论】:

  • 不知道为什么 Erik 不是可靠的或官方的消息来源。他是 SVG 规范的编辑之一。

标签: html svg contenteditable


【解决方案1】:

这是一个例子:

<div contenteditable="true">
    <svg>
        <circle cx="10" cy="10" r="5" fill="green" />
        <text y="2em">Hello world</text>
    </svg>
</div>

http://jsfiddle.net/ZEAwB/

适用于 Opera 18、Chrome 33、Firefox (Nightly) 28 和 IE9。可能也可以在早期版本的 Opera、Chrome 和 Firefox 中使用,但不太确定有多远。

【讨论】:

  • 感谢您的回答。不过,这似乎不适用于嵌套的 SVG,例如当我想编辑一个圆圈中的内容时,该圆圈本身包含在另一个 svg 元素中,例如 g 元素。光标在 chrome 31 上的位置也很糟糕,但我应该可以解决这个问题。
  • 更新:在最新的 chrome (49.0.2623.110) 中不起作用
  • @Erik Dalhström,为什么 contenteditable 位于外部
    元素而不是实际的目标元素 上有充分的理由吗?
  • @ATL_DEV 我也想知道 - 看起来是因为它不是 SVG 规范的一部分,因此它不起作用 - 有一个建议添加它,复制 HTML 语义:github.com/w3c/svgwg/issues/332
【解决方案2】:

@Erik Dalhström 的解决方案似乎没有解决这个问题:如示例所示,他希望能够编辑 SVG 对象顶部(“内部”)的文本内容。在 Firefox 上,Erik 的代码确实使文本可编辑,但在 10 x 10 圆圈下方,而不是在 SVG 空间内。

我在https://github.com/artursapek/mondrian/issues/12 找到了解决方法:

当用户点击 SVG &lt;text&gt; 元素时, 将 HTML 命名空间中最近祖先的 contenteditableattribute 设置为 true (例如document.body.contentEditable = true;), 然后使 SVG &lt;text&gt; 元素可选 (例如svgTextElement.style.webkitUserSelect = 'text';)。

当用户完成文本编辑时(例如,通过点击画布) 将祖先的contentEditable 属性设置回false

我还没有尝试过,如果可行,希望有人报告。 我们不必等待 CSS 2.0 来获得这个非常需要的功能。

【讨论】:

    猜你喜欢
    相关资源
    最近更新 更多
    热门标签