使用JavaScript打印HTML对象标记的内容

使用JavaScript打印HTML对象标记的内容,javascript,jquery,html,d3.js,Javascript,Jquery,Html,D3.js,我目前正在尝试创建一个方法,该方法调用浏览器的打印功能来打印嵌入在我的页面中的文档内容。已经包含了D3.js和jQuery库。我希望实现这一目标的过程如下: <head> <script type="text/javascript"> var floatButton = d3.select("body").append("div") .attr("class", "printbutton") $(".printbutton").click

我目前正在尝试创建一个方法,该方法调用浏览器的打印功能来打印嵌入在我的页面中的
文档
内容。已经包含了D3.js和jQuery库。我希望实现这一目标的过程如下:

<head>
  <script type="text/javascript">
   var floatButton = d3.select("body").append("div")
        .attr("class", "printbutton")

   $(".printbutton").click(function() {
        var Popup = window.open(URL);
        $(Popup.document).load(function() {
            document.getElementsByTagName('svg')[0].style.opacity = 1;
            window.print();
            window.close();
        });
    });
  </script>
</head>

<body>
  <object id="Graph_Container" data="URL" type="image/svg+xml"></object>
</body>
另一种方法是在父页面上解析
根目录中的XML结构,这样我就不需要打开新页面,但我已经能够对此了如指掌了

关于如何在
对象
标记内打印
文档
的任何提示/想法,我将不胜感激

已更新

window.name = "PersistWindow";
$(".printbutton").click(function() {
    debugger;
    Popup = window.open(URL, "TempWindow");
    $(Popup.document).load(function() {
        Popup.document.getElementsByTagName('svg')[0].style.opacity = 1;
        window.print();
        window.close();
    });
});
window.open()
函数可以接受另一个参数,即窗口名。首先,为当前窗口指定一个名称,如
window.name=“persistents”popup=window.open(URL,“popped”)
这将确保刚刚打开的URL不会替换您正在运行的代码,并且
Popup
变量允许您访问弹出窗口中所需的任何内容——例如,使用
Popup.document
访问文档对象

我将在下面的评论中补充这一点。可以将代码分为两个不同的函数。一个保存
window.open()
指令,另一个——我们称之为“操纵器()”——保存代码以访问文档对象并处理该数据。在许多情况下,浏览器不会立即执行JavaScript要求它执行的操作;它等待当前运行的JavaScript函数结束,然后再执行该操作。这意味着您需要一种将第一个函数连接到第二个函数的方法,最简单的方法是通过
setTimeout()
。例如,在调用
window.open()
之后,可以指定
setTimeout(“操纵器();”,250)
,然后从第一个函数执行
返回


manipular()
函数将在1/4秒后调用,但在运行之前,浏览器将执行
window.open()
操作。因此,当
操纵器()
函数运行时,您将能够在其中访问刚刚打开的窗口的文档对象,并使用该数据执行操作。(请注意,这种在不同函数之间划分工作的方式是全局变量在JavaScript中非常有用的一个主要原因--“Popup”在这里应该是全局变量。)

这与
var Popup=window.open(URL)
然后
$(Popup.document).load
有何不同?在这种情况下,
Popup
是否与
handl
一样?我是不是应该通过
name
而不是
var
来调用?区别不在于
Popup
handl
;区别在于
window.open(URL)vs
窗口打开(URL,“弹出”)--并确保“popped”是与调用
window.open()
的窗口名称不同的窗口名称。默认情况下,
window.open()
将在现有窗口中打开一个新页面,这将替换您正在运行的JavaScript以打开该新页面。我将编辑我的答案以删除
handl
。更新我的代码。直到
$(popup.document)之后,才会加载弹出窗口。调用load
,因此跳过
.load
中的脚本。抱歉,我忘记了这一点。JavaScript可以告诉浏览器做某事,但浏览器通常在JavaScript函数结束后才做,JavaScript函数包含了告诉浏览器做某事的指令。您应该调用
setTimeout(“操纵器();”,250)window.open()
后的code>。然后让该函数结束/返回。“操纵器”函数将在1/4秒后被调用,在该函数中,您将访问刚刚打开的窗口的文档对象。欢迎使用。抱歉,我之前没有考虑过需要给浏览器一个机会,让它真正做你想让它做的事情,然后你才能做一些假设浏览器已经做了的事情。
window.name = "PersistWindow";
$(".printbutton").click(function() {
    debugger;
    Popup = window.open(URL, "TempWindow");
    $(Popup.document).load(function() {
        Popup.document.getElementsByTagName('svg')[0].style.opacity = 1;
        window.print();
        window.close();
    });
});