2

我一直在使用该Diagram.makeSVG()方法从我的图表中生成 SVG。之后,我使用此代码将 SVG 添加到新的空白选项卡(diagram是我的图表对象):

function print() {
  var newTab = window.open(),
      svg  = aclDiagram.makeSVG({
        some: options
      });
  newTab.document.body.appendChild(svg);
}

它在 Chrome 和 Firefox 中运行良好。它在 IE11 中不起作用。

我做了一些调试,发现这不仅仅是浏览器的问题。生成 SVG 时,在调试器中查看它的类型时,GoJS 没有生成正确的 SVG(在我看来)

SVGSVG元素

正如我所说,它在 FF 和 Chrome 中运行良好。我认为这是由于 Chrome 和 Firefox 容忍了非官方的 HTMLElement 类型,并说“嗯,让我们尝试添加它”,而 IE 11 则说“哇哇哇,没有办法添加这个元素,这甚至不是某种类型的 HTML 元素”。或者我在这里有什么问题吗?

我现在正试图找到一种解决方法,使其在 IE 中工作。但是,我不知何故找不到改变对象类型的方法。

有什么建议么?提前致谢。

4

3 回答 3

2

好的,经过无休止的研究,我现在可以说:“Internet Explorer 的行为很奇怪。经常”。我们必须处理的问题不是我所期望的 GoJS 的起源,而是 Internet Explorer 的一些有问题的(个人意见)功能。

游戏名称:层次结构

当使用var newTab = window.open()Internet Explorer 打开一个新选项卡时,会打开一个全新的工作区。这意味着该newTab变量现在是一个新的window,具有自己的document安全限制。

GoJS 的makeSvg()方法在窗口上生成一个 SVG。无法指定它在哪个窗口上生成 SVG。我想你可以看到我要去哪里。通过说

newTab.document.body.appendChild(svg);

安全限制阻止我将元素添加到不打算出现的位置。Big E只是说“不”,打断程序并抛出异常。通过它自己。但是,嘿,您可能想知道:“这个异常去哪儿了?” 我不完全理解它,但是,不知何故,它直接从 IE 转到 IE,而 IE 弄错了,并向控制台抛出异常,说异常(“我不能将该元素添加到它不是的窗口created for" ) 未被捕获。但是 IE 不会费心给我它无法处理的异常。它只打印出关于未被捕获的异常的异常。 使困惑?我曾是。

那么我们如何解决这个问题呢?

  1. 声明一个空的 HTMLElement( div),您可以将 SVG 放入第一个窗口(不是新选项卡)。
  2. 将 SVG 添加到div您刚刚创建的文件中。
  3. div'sinnerHTML添加到新选项卡中。

因此,您不是在向新选项卡添加一个 HTMLElement,而是一个字符串。

我可能忽略了更聪明的解决方案。但是,以下代码是唯一对我有用的代码,因为它能够胜过 IE 的“安全”功能。

newTab = window.open();
div = document.createElement("div");
div.appendChild(picture);
newTab.document.body.innerHTML = div.innerHTML;
于 2015-08-12T12:06:05.053 回答
1

这似乎在 IE Edge 中运行良好:

var svg = myDiagram.makeSvg({
    scale: 0.5
  });
svg.style.border = "1px solid black";
document.body.appendChild(svg);

http://codepen.io/simonsarris/pen/qdgeGR?editors=101

就此而言,制作 SVG 介绍页面上的所有示例似乎都可以在 IE 边缘上正常工作。

你还有别的事情在做吗?

于 2015-08-07T13:55:06.530 回答
0

我只是按照 GOJs 的例子,它工作得很好

[ https://gojs.net/latest/samples/minimalBlob.html][1]

  function myCallback(blob) {
    var url = window.URL.createObjectURL(blob);
    var filename = "myBlobFile.png";

    var a = document.createElement("a");
    a.style = "display: none";
    a.href = url;
    a.download = filename;

    // IE 11
    if (window.navigator.msSaveBlob !== undefined) {
      window.navigator.msSaveBlob(blob, filename);
      return;
    }

    document.body.appendChild(a);
    requestAnimationFrame(function() {
      a.click();
      window.URL.revokeObjectURL(url);
      document.body.removeChild(a);
    });
  }

  function makeBlob() {
    var blob = myDiagram.makeImageData( { background: "white", returnType: "blob", callback: myCallback });
  }
于 2019-01-21T15:13:01.017 回答