Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Ошибка Uncaught TypeError, почему появилась? (https://javascript.ru/forum/misc/75468-oshibka-uncaught-typeerror-pochemu-poyavilas.html)

Artur_Hopf 12.10.2018 15:22

Ошибка Uncaught TypeError, почему появилась?
 
Добрый день. Есть функция для печати:
function printSticker(elem){    
    var mywindow = window.open('', 'PRINT', 'height=400,width=600,left=300,top=300');
    mywindow.document.write(document.getElementById(elem).innerHTML);
    mywindow.document.close();
    mywindow.focus();
    mywindow.print();
    mywindow.close();
    return true;
}

Я передавал в нее id блока который нужно было печатать, все работало.

Теперь же мне нужно было отправлять GET запрос на сервер, получать ответ, и вставлять ответ в блок печати. Делаю так:
function getPrintPlan(){
    $.getJSON('index.php', function(data) {
        printPlan(data[1]);
    });
}

function printPlan(data){
   //делаю свои дела, могу тут ничего не делать, ошибка остается
   printSticker('elem');
    
}

function printSticker(elem){    
    var mywindow = window.open('', 'PRINT', 'height=400,width=600,left=300,top=300');
    mywindow.document.write(document.getElementById(elem).innerHTML);
    mywindow.document.close();
    mywindow.focus();
    mywindow.print();
    mywindow.close();
    return true;
}


Выходит ошибка :
Код:

Uncaught TypeError: Cannot read property 'document' of null
И жалуется на эту строку :
Код:

mywindow.document.write(document.getElementById(elem).innerHTML);
В чем проблема? :-?

SuperZen 12.10.2018 15:50

а если добавить window перед document?
mywindow.document.write(window.document.getElementById(elem).innerHTML);

Aetae 12.10.2018 20:09

Проблема в том, что это твоё mywindow не открылось. А не открылось оно потому, что браузер не блокирует только те окна, что открываются сразу в ответ на действия пользователя.
У тебя же загрузка index.php занимает некоторое время, а потому создание нового окна блокируется как нежелательное.
Сначала открывай окно, а уж потом шли запросы и пиши в него.

Artur_Hopf 15.10.2018 10:03

Aetae,
Спасибо, сделал так, работает:
function getPrintPlan(){
    $.ajaxSetup({
        async: false
    });
    $.getJSON('index.php', function(data) {
        printPlan(data[1]);
    });
}

Aetae 15.10.2018 21:19

Artur_Hopf, синхронный ajax - моветон. Но воля ваша.)


Часовой пояс GMT +3, время: 12:03.