【问题标题】:$.bind() on SVG elements breaks when new SVG replaces original当新的 SVG 替换原来的 SVG 元素时,$.bind() 会中断
【发布时间】:2011-04-29 15:22:19
【问题描述】:

我有一个 svg,其中包含我绑定到点击和键位的元素。如果用户编辑页面上的文本字段,它会更新 svg 中的相应文本元素。反之亦然,如果用户编辑 svg,它会更新 html 中相应的文本字段。使用 jQuery。

页面上的按钮允许用户从 DOM 中删除 svg 并在其位置添加不同的 svg(异步)。这个新的 svg 与第一个具有相同的元素,只是具有不同的图形设计。

加载第二个 svg 后,绑定停止工作。我通过调用下面的 AB.init() 重新初始化所有内容 - 取消绑定和重新绑定,但用户仍然无法编辑 svg。我该如何解决这个问题?

更新:根据@Pointy 的评论,所有 .bind() 现在都是 .delegate()。然而问题依然存在。我的 .delegate() 语法对命名空间有效吗?

AB = {
  svgns: "http://www.w3.org/2000/svg"

  f: {
      field1: {svg:null, jq:null},
      field2: {svg:null, jq:null}
  },

  /* last activated text field */       
  active:   undefined,

  init: function() {
    AB.f.field1.jq = $('#id_field_1');
    AB.f.field2.jq = $('#id_field_2');
    var svg_container = document.getElementById('svg_container');
    var svg_text_elements = svg_container.getElementsByTagNameNS(svgns, 'text');
    var length = svg_text_elements.length;
    for(var i=0; i < length; i++) {
      var e = svg_text_elements[i];
      if(e.id) {
        AB.set_svg_for_text_field(e);
      } else {
        var tspans = e.getElementsByTagName('tspan');
        for(var j = 0; j < tspans.length; j++) {
          var t = tspans[j];
          AB.set_svg_for_text_field(t);
        }
      }
    }
    AB.delegate_and_display_text_fields();
  },

  delegate_and_display_text_fields: function() {
    a = [];
    $.each(AB.f, function(key, value) {
      if(value.svg && value.jq){
        $('form').delegate('input', 'keyup click', function() {
          value.svg.textContent = value.jq.val();
          CB.set_active_element(key);
          CB.active = value;
        });
        $('#svg_container svg').delegate('text', 'keyup click', function() {
          value.svg.textContent = value.jq.val();
          CB.set_active_element(key);
          CB.active = value;
        });
        if(value.jq.val()) {
          value.svg.textContent = value.jq.val();
        }
        a.push(value);
        value.jq.parent().fadeIn();
      }
    });
  },
  set_svg_for_text_field: function(e) {
    switch(e.id) {
      case "field_1":
      AB.f.field1.svg = e;
      break;
      case "field_2":
      AB.f.field2.svg = e;
      break;
}
  },
  ...

【问题讨论】:

  • 实际绑定的代码在哪里?
  • 无论如何,只需查找 jQuery 的 ".delegate()" 方法并使用它来绑定您的事件处理程序。
  • @Pointy 我添加了执行绑定的代码。现在看 .delegate()...
  • 因为你正在修改一个元素(删除它并重新添加它),在你删除它的地方 - 绑定停止工作。您试图通过重新绑定所有内容来解决问题,但由于没有代码告诉我们您是如何做到的 - 我的假设是选择器不匹配。此外,出于这些目的,您应该使用 jQuer 的 .live() 而不是 .bind()。
  • @Pointy 或@Michael J.V.,我现在正在使用“.delegate()”,但选择器没有获取 svn 命名空间。想法?

标签: javascript jquery xml ajax svg


【解决方案1】:

试试 .live()

它将事件绑定到现在和将来匹配选择器的元素。我在动态隐藏和显示元素时遇到了类似的问题。 jQuery Live()

【讨论】:

  • 太棒了;谢谢。我实际上选择了 delegate() 但知道 live() 也可以。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-27
  • 2021-08-03
  • 1970-01-01
  • 2014-01-04
  • 2013-02-02
  • 1970-01-01
  • 2018-01-17
相关资源
最近更新 更多