【问题标题】:Remove all .fixed classes from force layout nodes with jQuery使用 jQuery 从强制布局节点中删除所有 .fixed 类
【发布时间】:2015-04-24 13:02:21
【问题描述】:

我有这个 结构,由 d3.js 强制布局制作:

<div id="familytreecontentsvg">
<g class="nodes">
    <g class="node" transform="translate(625.2095978696435,404.7159479251927)" style="border: 3px solid red;"></g>
    <g class="node" transform="translate(549.3595414086468,461.0475336079573)" style="border: 3px solid red;"></g>
    <g class="node fixed" transform="translate(617.2898371986196,498.8572888164544)" style="border: 3px solid red;"></g>
</g>

最后我想从所有节点中删除 .fixed 类。

所以触发这个事件我有一个按钮。为了检查它是否有效,我只是为了演示添加了一些有效的 css。不知何故,删除类不起作用。固定类没有被移除:

$("#familytreeUnfixallbutton").click(function() {
    $( "#familytreecontentsvg .node" ).css( "border", "3px solid red" );
    $( "#familytreecontentsvg .node" ).removeClass( "fixed" );
});

那么我如何从节点中删除所有固定类

当前状态

这个正在工作:

d3.select('#familytreeUnfixallbutton').on('click', function(){
    d3.selectAll('#familytreecontentsvg .node').classed('fixed', false)
});

它删除了 fixed 类。但不知何故 d3 对此不感兴趣。还是固定的=(

剩下的问题

我为剩下的问题创建了一个新问题:Removing fixed classes does not properly remove them from the presetation

【问题讨论】:

  • 让您检查浏览器控制台是否有任何错误。它在我身上工作你的代码
  • 日本,没有错误,正如我所说,css 编辑工作正常。 =/
  • 请问您使用的是jquery库版本吗?

标签: javascript jquery css d3.js force-layout


【解决方案1】:

似乎 jQuery addClass/removeClass/toggleClass 不适用于 SVG 元素。 jQuery 上有一个 ticket,但它已关闭并且“不会修复”。

您可以使用d3.selectAll('#familytreecontentsvg.node').classed('fixed', false) 或旧的jQuery.attr。所以你的代码应该是这样的:

$("#familytreeUnfixallbutton").click(function() {
    $( "#familytreecontentsvg .node" ).css( "border", "3px solid red" );
    d3.selectAll('#familytreecontentsvg.node').classed('fixed', false)
});

希望这会有所帮助。

【讨论】:

  • 不要更改点击监听器。我用完整的解决方案编辑了我的答案。
  • 一个 jsFiddle 将是理想的
  • 你的选择器在那个 jsFiddle 中是错误的。最后,应该是d3.selectAll('#main-right .node'),而不是d3.selectAll('#main-right.node')。 (.node有空格)
  • 我已经更新了 jsFiddle:jsfiddle.net/d2gjxy7n/9 如果你看到,当有一个固定的类时,当你点击按钮时它会被删除
  • 那是一个不同的问题......您可以接受答案并“问”另一个解决该特定问题的问题
【解决方案2】:

“skay”说的是正确的,只要确保你选择了正确的东西,否则它将不起作用。 在我看来,我会给节点 ID 并按 ID 选择它们,然后删除你想要的类。

nodes.attr("id", function(d,i){ return "nodes" + i;}); //unique ID
//or
nodes.attr("id", "nodes"); //same ID

//selecting using the second way of adding ID
    d3.select("#nodes").classed("fixed", false); //remove fixed class

如果你想添加一个类,就这么简单:

d3.select("#nodes").classed("fixed", true); //add fixed class

【讨论】:

【解决方案3】:

请使用以下代码

$("#familytreeUnfixallbutton").click(function() {
    $( "#familytreecontentsvg .node" ).each(function(){
       $(this).removeClass("fixed");
     });
  });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="familytreecontentsvg">
<g class="nodes">
    <g class="node" transform="translate(625.2095978696435,404.7159479251927)" style="border: 3px solid red;"></g>
    <g class="node" transform="translate(549.3595414086468,461.0475336079573)" style="border: 3px solid red;"></g>
    <g class="node fixed" transform="translate(617.2898371986196,498.8572888164544)" style="border: 3px solid red;"></g>
</g>
  <input id="familytreeUnfixallbutton" value="Test Button" type="button" style="float:right; margin-right:100px;" Text="Test Button" />

【讨论】:

  • 请检查它是否适合我。我更新了页面加载代码而不是按钮点击,因为我没有按钮点击事件。
  • 抱歉,我无法在我的办公室使用 jsfiddle。
  • 尝试在按钮上应用 setTimeout 再单击一件事,您使用的是什么版本的 JQuery?
  • 请检查现在我已经更新了按钮点击它的工作代码。
猜你喜欢
  • 2017-12-07
  • 2014-10-18
  • 2012-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-05
  • 1970-01-01
  • 2012-09-10
相关资源
最近更新 更多