Замена всего содержимого HTML убивает теги HEAD и BODY после HTTP-запроса! - PullRequest
0 голосов
/ 23 октября 2009

После нажатия кнопки я отправляю весь HTML-контент с веб-страницы (часть внутри тегов <html>) в CGI-скрипт, который манипулирует контентом и отправляет его обратно.

Сейчас я пытаюсь заменить существующий контент новым. К сожалению, после назначения все теги <head> или <body> (а также закрывающие) будут убиты.

Используя некоторые оповещения, я просмотрел возвращаемое значение, а также исходный HTML. Оба абсолютно как ожидалось.

Но после задания происходит какая-то магия. Пожалуйста, помогите мне выяснить, что происходит.

Вот используемый код JavaScript, который я использовал:

var originalBodyInnerHTML = document.body.innerHTML;
var htmlNode = document.getElementsByTagName('html')[0];
var post_parameters = encodeURIComponent(htmlNode.innerHTML);

makePOSTRequest("POST", "http://whatever.com/cgi-bin/doit.cgi", post_parameters, htmlNode);

function makePOSTRequest(method, url, parameters, htmlNode) {
  var http_request = getRequestObj();

  if (!http_request) {
    alert('Cannot create XMLHTTP instance');
    return false;
  }

  http_request.onreadystatechange = function() 
  {
     if (http_request.readyState < 4)
     {
        var waitingPageBody = '< img src="/img/ajaxloader.gif" alt="in progress..."/>';
        document.body.innerHTML = waitingPageBody;
     }
     else //if (http_request.readyState == 4)
     {
        if (http_request.status == 200)
        {
           alert('1response: ' + http_request.responseText);
           alert('2innerhtml: ' + document.getElementsByTagName('html')[0].innerHTML);
           document.getElementsByTagName('html')[0].innerHTML = http_request.responseText;
        }//end of if (http_request.status == 200)
        else
        {//other http statuses
           alert("There was a problem (" + http_request.statusText + ", " + http_request.status + ' error)');
           bodyNode.innerHTML = originalBodyInnerHTML;
        }
     }//end of else if http_request.readyState == 4
  }

  http_request.open(method, url, true); //async
  http_request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
  http_request.setRequestHeader("Accept", "application/atom+xml,application/xml,text/xml");
  http_request.setRequestHeader("Connection", "close");
  http_request.send(parameters);
}

function getRequestObj() {
  var http_request = false;

  if (window.XMLHttpRequest) 
  { // Mozilla, Safari,...
     http_request = new XMLHttpRequest();

     if (http_request.overrideMimeType) 
     {
       http_request.overrideMimeType('text/html');
      }
  } 
  else if (window.ActiveXObject) 
  { // IE
     try { 
       http_request = new ActiveXObject("Msxml2.XMLHTTP");  
     } 
     catch (e) 
     {
        try {
          http_request = new ActiveXObject("Microsoft.XMLHTTP"); 
        } 
        catch (e) {}
     }
  }

  return http_request;
}

Ответы [ 4 ]

2 голосов
/ 05 октября 2012

Это простое решение, которое сработало для меня. Просто для справки.

document.clear();
document.write(newHtml);

где newHtml - полный HTML-код новой веб-страницы.

1 голос
/ 23 октября 2009

Вы не можете этого сделать. Невозможно заменить содержимое всего тега HTML. Вы можете избежать замены только содержимого тега body. Элемент head является магическим, и браузер обычно не поддерживает его замену.

Если вы хотите изменить весь документ, перенаправьте на него.

Если вы хотите изменить только части головы, попробуйте отправить их в другой форме (например, JSON) и внести соответствующие изменения, используя API JavaScript.

1 голос
/ 23 октября 2009

хорошо, с этим

document.getElementsByTagName('html')[0].innerHTML = http_request.responseText

вы заменяете все, что находится внутри html, "убивая" тело, голову и все ... может быть, вы хотели

document.body.innerHTML = http_request.responseText

Кроме того, я бы использовал jquery , это делает вашу жизнь ооочень проще

0 голосов
/ 25 октября 2009

Спасибо qbeuek за ответ!

Чтобы изменить только заголовок, Firefox фактически разрешит что-то вроде этого:

document.getElementsByTagName('head')[0] += "e.g. some scripts"
Но для Internet Explorer необходимо добавить каждый элемент отдельно в дерево DOM.
var script = document.createElement("script");
script.setAttribute('type','text/javascript');
objHead.appendChild(script); 

Тем не менее, действительно странно, что Firefox ведет себя так и не всплывает с некоторой ошибкой ...

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