加载iframe而不将其注入DOM

时间:2011-12-01 11:06:00

标签: javascript jquery dom iframe

我对这个问题基本上有相反的问题:How to prevent iframe from loading when injected into the DOM? 我希望加载一个未注入DOM的IFRAME元素。

我正在尝试通过javascript打印页面。目标是避免必须导航链接,发出打印命令并导航回来。

我可以使用jQuery。

// fake table that illustrates pertanent DOM
<table class=diary><tr><td data-job=12345 contextmenu=job_menu><a href=/jobs/12345>view job 12345</a></table>

// real code
<menu type="context" id="job_menu">
    <menuitem label="Print Job" onclick="PrintJob(); return false;"></menuitem>
</menu>
<script type="text/javascript">
    var target = null;

    function PrintJob()
    {
        var job_no = $(target).data('job');
        if(job_no > 0) {
            $('<iframe name="printjob" src="/jobs/'+job_no+'">').load(function () {
                this.focus();
                this.print();
            })
            .trigger('load');
        }
    }

    $('.diary').bind('contextmenu', function (ev) {
        var td = ev.target;
        while(td && td.nodeName != 'TD')
            td = td.parentNode;
        target = td;
    });
</script>

问题是,在生成的.trigger('load')元素上调用IFRAME不会在GET属性网址上引发src请求。我希望首先调用默认处理程序,然后我的附加处理程序将触发,并打印iframe的内容,但我的加载处理程序只是立即被调用。

我无法将打印调用附加到iframe的contentDocument.onready事件,因为contentDocument在框架加载之前为零。我不知道你是否可以将一个元素集中在DOM中,或者是否需要打印,但我在其他地方看到的代码都在.focus() .print()之前 (我也尝试使用window.frames['printjob'].print(),但如果iframe尚未出现在窗口中,我怀疑window.frames['printjob']为nil:)

2 个答案:

答案 0 :(得分:5)

正如Tom van der Woerdt所说,除非您将其添加到DOM,否则iframe将无法加载。

但这并不意味着必须在用户可以看到的任何地方加载它:

$('<iframe name="printjob" src="/jobs/'+job_no+'">')
    .load(function() {
        this.focus();
        this.print();
    })
    .css({position: "absolute", left: "-10000px", top: "0px"})
    .appendTo(document.body);

Live example(不打印)

诀窍是弄清楚何时将其移除。您可以尝试在收到load事件后的X秒内删除它,但这听起来像是在寻找麻烦。


附注:作为用户,我非常喜欢在打印之前看到我要打印的内容。但是如果你有一个避免这种情况的用例,也许这会有所帮助。

答案 1 :(得分:2)

这不是为什么AJAX被发明了吗?也许这可能有所帮助。

回答你的实际问题:你做不到。如果不将其插入DOM,则不会加载<iframe>