javascript - 克隆时 SVG 变黑

标签 javascript jquery html svg clone

我在玩 clone()当我发现一个奇怪的行为时从 jQuery 调用函数。

此代码重现了该问题。第一个 div 包含一个 SVG。两个按钮允许将 SVG 克隆到第二个 div 中。尝试两次会使圆圈变黑。

enter image description here enter image description here

HTML

<div id="orgdiv">
    <svg width="200" height="200" style="margin:0">
        <linearGradient  id="r" x1="0" y1="0" x2="1" y2="1">
            <stop offset="0%" stop-color="#00ffff"></stop>
            <stop  offset="100%" stop-color="#ffff00"></stop>
        </linearGradient>
        <circle cx="100" cy="100" r="80" style="fill:url(#r)" />
    </svg>
</div>

<input type="button" value="copy">
<input type="button" value="clear">

<div id="copydiv"></div>

JS

$('input[value="copy"]').click(function(){
    $("#copydiv").html($("#orgdiv").clone());
});

$('input[value="clear"]').click(function(){
    $("#copydiv").empty();
});

jsFiddle here

备注:

  • 使用 jQuery 或 Javascript 进行克隆会导致相同的错误。

最佳答案

我有一种预感,这可能是因为您正在克隆 linearGradient,它有一个 id 属性(当然,它应该在整个文档中是唯一的。)这可能会使 SVG 混淆处理器。

我的理论似乎通过在克隆过程中更改 ID 得到证实:

$('input[value="copy"]').click(function () {
    var clone = $("#orgdiv").clone();
    // Change the ID of the clone, so we don't have duplicate IDs
    clone.find("#r").attr('id', 'unique');
    $("#copydiv").html(clone);
});

...这似乎可以防止出现问题。 (在这种情况下,即使克隆渐变的 ID 已更改,克隆仍会获得渐变,因为它是通过 ID 找到原始渐变。)

JSFiddle 在这里:http://jsfiddle.net/2K4xv/2/

我猜你的情况“在引擎盖下”发生的事情是处理器正在拾取你为第一个圆圈创建的第二个渐变过滤器元素,然后在它被你的 empty() 破坏了,因此你只剩下圆圈但没有渐变。确切地说,为什么这种情况只发生第二次,可能取决于 SVG 渲染器与 HTML5 文档交互的实现细节。

this earlier question 中有关于此问题的更多信息.

关于javascript - 克隆时 SVG 变黑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19658908/

相关文章:

javascript - 表达处理多个级别的请求参数

javascript - 如何删除隐藏的 HTML 元素?

javascript - Jquery/Ajax 模式未加载

Javascript如何根据创建的月份显示用户数量

jquery 相当于 mootools 中的 every

javascript - 创建输入元素继续 ID 枚举

javascript - 如何仅使用一个提交按钮将文件发送到 MVC 操作

javascript - jQuery 动画页面滚动上的 Div 边距

html - 表格中的固定高度元素

javascript - 将类名从 div 移动到 div