Загрузка iframe без внедрения его в DOM - PullRequest
3 голосов
/ 01 декабря 2011

У меня есть в основном проблема, противоположная этому вопросу: Как предотвратить загрузку iframe при вводе в DOM? Я хочу загрузить элемент IFRAME, который не вводится в DOM.

Я пытаюсь распечатать страницу с помощью 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 для URL-адреса атрибута src.Я надеялся, что сначала будет вызван обработчик по умолчанию, затем мой подключенный обработчик сработает и напечатает содержимое iframe, но мой обработчик загрузки просто вызывается немедленно.

Я не могу прикрепить вызов print ксобытие iframe contentDocument.onready, поскольку contentDocument равно нулю до тех пор, пока не будет загружен кадр.Я не знаю, можете ли вы сфокусировать элемент не в DOM или это необходимо для печати, но код, который я видел в другом месте, имел .focus(), предшествующий .print() (я также пытался использовать window.frames['printjob'].print(), но яподозреваемый window.frames['printjob'] равен нулю, если iframe еще не находится в окне:)

Ответы [ 2 ]

5 голосов
/ 01 декабря 2011

Как сказал Том ван дер Вурдт, iframe не будет загружаться, если вы не добавите его в DOM.

Но это не значит, что его нужно загружать везде, где его видит пользователь:

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

Живой пример (без печати)

Хитрость заключается в том, чтобы выяснить, когда его снимать.Вы можете попробовать удалить его через X секунд после получения события load, но это звучит как вызов проблемы.


Примечание: Как пользователь, я очень предпочитаючтобы увидеть, что я собираюсь напечатать перед печатью.Но если у вас есть способ избежать этого, возможно, это поможет.

2 голосов
/ 01 декабря 2011

Не поэтому ли был изобретен AJAX?Может быть, это поможет.

Чтобы ответить на ваш настоящий вопрос: вы не можете.<iframe> не будет загружаться, если вы не вставите его в DOM.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...