Не работает .appendChild() в место .innerHTML

227
04 февраля 2018, 02:56

Дамы и Господа, есть такой ajax код:

    function ajax(url, callback, data, request) {
    try {
        request = new(this.XMLHttpRequest || ActiveXObject)('MSXML2.XMLHTTP.3.0');
        request.open(data ? 'POST' : 'GET', url, 1);
        request.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
        request.setRequestHeader('Content-type', 'application/json');
        request.onreadystatechange = function () {
            request.readyState > 3 && callback && callback(request.responseText, request);
        };
        request.send(data)
    } catch (e) {
        window.console && console.log(e);
    }
};

в отдельной папке.

И в отдельной папке такой JS файл main.js:

   document.addEventListener("DOMContentLoaded", function() {
    const iDroot = document.getElementById('root');
        ajax('../pages/index.html', function(res) {
            iDroot.appendChild(res);
        })
    const wrapper = document.getElementById('wrapper');
    console.log('wrapper');   
});

Если в место строчки iDroot.appendChild(res); написать iDroot.innerHTML = 'res';, то все работает.

Объясните, почему в данном случае .innerHTML работает, а .appendChild() нет?

Больше всего смущает, что в консоли wrapper видит. В консоли показывает:

Answer 1

В вашем коде, тут: ajax('../pages/index.html', function(res) {

В аргумент callback функции res будет передана строка (браузер посылает http get запрос, получает ответ. Тело ответа - это всегда просто String).

После чего, при вызове .appendChild(res) браузер пытается добавить содержимое переменной res, предполагая что это экземпляр Node в конец списка дочерних элементов родителя. Но оказывается, что это строка, поэтому выбрасывается соответствующая ошибка parameter 1 is not of type 'Node'.

В случае использования element.innerHTML = '...' - браузер распарсит переданную строку, попытается на ее основе создать новые узлы Dom, и вставит их внутрь элемента.

Про appendChild: https://developer.mozilla.org/ru/docs/Web/API/Node/appendChild

Про innerHTML: https://developer.mozilla.org/ru/docs/Web/API/Element/innerHTML

READ ALSO
Angular: как прочитать заголовок у ответа?

Angular: как прочитать заголовок у ответа?

Как прочитать заголовок у ответа, к примеруContent-Type? У меня это не получается сделатьЯ пытаюсь хотя-бы отобразить все заголовки

286
Клик на родительский див через дочерний

Клик на родительский див через дочерний

При создании модального окна столкнулся с проблемойЕсть изображение, при клике на которое, открывается модальное окно, но на этом изображении...

236
В чем ошибка? Почему неожиданный, когда ожидаемый?

В чем ошибка? Почему неожиданный, когда ожидаемый?

Почему unexpected token '(' во второй функции?

176