javascript - w3school - www 3schools com php




ajax HTML 응답에서 body 태그 찾기 (3)

나는 무언가를 놀랍다 (나는 생각한다!)

html로 문자열을 얻었습니까?

var results = //probably an ajax response

다음은 현재 DOM에 첨부 된 요소와 똑같이 작동하는 jquery 객체입니다.

var superConvenient = $($.parseXML(response)).children('html');

superConvenient 에서 아무것도 제거되지 않습니다! superConvenient.find('body') 또는 심지어

superConvenient.find('head > script');

superConvenient 는 jquery 요소와 똑같이 작동합니다.

노트

이 경우 문자열 results 는 JQuery의 parseXML 메소드에 parseXML 되므로 유효한 XML parseXML . HTML 응답의 일반적인 기능은 <!DOCTYPE> 태그 일 수 있습니다.이 태그는이 의미에서 문서를 무효화합니다. <!DOCTYPE> 이 접근법을 사용하기 전에 태그를 제거해야 할 수도 있습니다! 또한 <!--[if IE 8]>...<![endif]--> 태그를 닫지 않고 태그, 예 :

<ul>
    <li>content...
    <li>content...
    <li>content...
</ul>

... 그리고 HTML의 어떤 다른 특징들도 브라우저에 의해 철저히 해석 될 것이지만, XML 파서는 충돌 할 것이다.

나는 내용을 가져오고 다음과 같이이 내용을 추가하라는 아약스 호출을하고있다.

$(function(){
    var site = $('input').val();
    $.get('file.php', { site:site }, function(data){
        mas = $(data).find('a');
        mas.map(function(elem, index) {
            divs = $(this).html();
            $('#result').append('' + divs + '');
        })
    }, 'html');
});

문제는 내가 body 변경할 때 아무것도 얻지 못한다는 것입니다 (오류가없고, 단지 HTML이 아닙니다). Im은 몸이 'a'와 같은 태그라고 가정합니다. 내가 뭘 잘못하고 있죠?

그래서이 작품은 나를 위해 :

 mas = $(data).find('a');

하지만 그렇지 않습니다.

 mas = $(data).find('body');

나는 약간의 실험을했고, 그 원인을 파악했다. 그래서 나는 진짜 관심을 가질만한 답변을 기다리고있다. 문제를 이해하는데 도움이되는 해킹이있다.

$.get('/',function(d){
    // replace the `HTML` tags with `NOTHTML` tags
    // and the `BODY` tags with `NOTBODY` tags
    d = d.replace(/(<\/?)html( .+?)?>/gi,'$1NOTHTML$2>',d)
    d = d.replace(/(<\/?)body( .+?)?>/gi,'$1NOTBODY$2>',d)
    // select the `notbody` tag and log for testing
    console.log($(d).find('notbody').html())
})

편집 : 추가 실험

iframe에 내용을로드하면 dom 객체 계층 구조를 통해 프레임 내용에 액세스 할 수 있습니다.

// get a page using AJAX
$.get('/',function(d){

    // create a temporary `iframe`, make it hidden, and attach to the DOM
    var frame = $('<iframe id="frame" src="/" style="display: none;"></iframe>').appendTo('body')

    // check that the frame has loaded content
    $(frame).load(function(){

        // grab the HTML from the body, using the raw DOM node (frame[0])
        // and more specifically, it's `contentDocument` property
        var html = $('body',frame[0].contentDocument).html()

        // check the HTML
        console.log(html)

        // remove the temporary iframe
        $("#frame").remove()

    })
})

편집 : 더 많은 연구

contentDocument는 iFrame의 window.document 요소를 가져 오는 표준 준수 방법 인 것처럼 보이지만 물론 IE는 표준을 신경 쓰지 않습니다. 따라서 iFrame의 window.document.body 대한 참조를 얻는 방법 window.document.body 크로스 플랫폼 방식의 객체 ...

var iframeDoc = iframe.contentDocument || iframe.contentWindow.document;
var iframeBody = iframeDoc.body;
// or for extra caution, to support even more obsolete browsers
// var iframeBody = iframeDoc.getElementsByTagName("body")[0]

참조 : iframe의 contentDocument


body 태그를 얻기 위해 반환 된 HTML을 jQuery 객체 (예 : $(data) )를 통해 파싱하면 실패 할 것입니다.

이유는 반환 된 datastring (try console.log(typeof(data)) )입니다. 이제 jQuery 문서 에 따르면 복잡한 HTML 마크 업을 포함하는 문자열에서 jQuery 객체를 만들 때 body 과 같은 태그가 제거 될 수 있습니다. 이것은 객체를 생성하기 위해 실제로 추가 태그를 허용 할 수없는 HTML 마크 업이 DOM에 삽입되기 때문에 발생합니다.

문서의 관련 인용문 :

문자열이 $ ()에 매개 변수로 전달되면 jQuery는 문자열을 검사하여 HTML과 같은지 확인합니다.

[...] HTML이 속성이없는 단일 태그보다 더 복잡한 경우 위의 예에서와 같이 요소의 실제 생성은 브라우저의 innerHTML 메커니즘에 의해 처리됩니다. 대부분의 경우 jQuery는 새로운 요소를 만들고 요소의 innerHTML 속성을 전달 된 HTML 스 니펫으로 설정합니다. 매개 변수에 하나의 태그 (선택 태그 또는 빠른 닫기 포함)가있는 경우 - $ ( "<img / > ") 또는 $ ("<img> "), $ ("<a> </ a> ") 또는 $ ("<a> ") - jQuery는 기본 JavaScript createElement () 함수를 사용하여 요소를 만듭니다.

복잡한 HTML을 전달할 때 일부 브라우저는 제공된 HTML 소스를 정확하게 복제하는 DOM을 생성하지 않을 수 있습니다. 앞서 언급했듯이 jQuery는 브라우저의 .innerHTML 속성을 사용하여 전달 된 HTML을 구문 분석하여 현재 문서에 삽입합니다.이 과정에서 일부 브라우저는 <html>, <title> 또는 <head> 요소와 같은 특정 요소를 필터링합니다 결과적으로 삽입 된 요소는 전달 된 원래 문자열을 나타내지 않을 수 있습니다.





document-body