【问题标题】:Raphaeljs: Copy element or set to another paperRaphaeljs:复制元素或设置到另一张纸上
【发布时间】:2013-05-23 16:59:19
【问题描述】:

是否有可能将存在于一篇论文中的元素或集合添加到另一篇论文中,而无需从头开始创建每个元素两次?

背景:我将一个大型节点图可视化,并希望在另一篇论文中创建一个“概览图”。

【问题讨论】:

    标签: svg copy set raphael


    【解决方案1】:

    以下代码集为 Raphael Set 和 Raphael Elements 添加了一个 nw 函数。用法是在任何集合或元素上简单地调用.cloneToPaper(targetPaper)

    (function (R) {
        var cloneSet; // to cache set cloning function for optimisation
    
        /**
         * Clones Raphael element from one paper to another
         *     
         * @param {Paper} targetPaper is the paper to which this element 
         * has to be cloned
         *
         * @return RaphaelElement
         */
        R.el.cloneToPaper = function (targetPaper) {
            return (!this.removed &&
                targetPaper[this.type]().attr(this.attr()));
        };
    
        /**
         * Clones Raphael Set from one paper to another
         *     
         * @param {Paper} targetPaper is the paper to which this element 
         * has to be cloned
         *
         * @return RaphaelSet
         */
        R.st.cloneToPaper = function (targetPaper) {
            targetPaper.setStart();
            this.forEach(cloneSet || (cloneSet = function (el) {
                el.cloneToPaper(targetPaper);
            }));
            return targetPaper.setFinish();
        };
    }(Raphael));
    

    对于示例实现,您可以查看这个小提琴:http://jsfiddle.net/shamasis/39yTS/

    请注意,如果源元素上有事件,它们将不会被克隆到目标文件中。

    【讨论】:

      【解决方案2】:

      Raphael 不允许将元素从一张纸直接移动到另一张纸上。 所以最好在目标论文中创建一个具有相同属性的新元素。 我创建了以下示例方法。您可以在页面中添加代码并使用 cloneToPaper 函数将元素或集合克隆到另一篇论文中。

      function extractJSON(element) {
          var attr = element.attr(),
          newNodeJSON = {type: element.type},
          key;
          for (key in attr) {
              newNodeJSON[key] = attr[key];
          }
          return newNodeJSON;
      }
      /*
       * @param {Object} element: raphael element or set
       * @param {Object} paper: Target paper where to clone
       * @return {object}: newly created set or element
       */
      function cloneToPaper(element, paper) {
          var isSet = element.type === 'set',
          elementJSONArr = [],
          i, ln, newSet;
      
          if (isSet) {
              ln = element.items.length;
              for (i = 0; i < ln; i += 1) {
                  elementJSONArr.push(extractJSON(element.items[i]));
              }
          }
          else {
              elementJSONArr.push(extractJSON(element));
          }
          newSet = paper.add(elementJSONArr);
          return isSet ? newSet : newSet[0];
      }
      

      【讨论】:

      • 谢谢,这就像一个魅力。但它似乎不适用于嵌套集,是吗?
      猜你喜欢
      • 1970-01-01
      • 2020-02-02
      • 1970-01-01
      • 1970-01-01
      • 2022-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多