2017-05-10 3 views
3

私はHTMLファイルをGETし、それを変数にjQueryオブジェクトとして割り当てようとしています。無駄に。スタックスニペットでGETリクエストが許可されているかどうかは分かりません。ここでもJSFiddle linkがあります。jQueryが解析しないHTMLで何が問題になっていますか?

var html = '<!DOCTYPE html><html lang="en"><head><title>Template</title></head><body itemscope itemtype="http://schema.org/WebPage"><main><header itemscope itemtype="http://schema.org/Country" itemprop="about"><h1 itemprop="name">Dummy heading</h1><p><span class="capital" title="Capital" itemprop="containsPlace"></span><span title="Dummy title" itemprop="additionalProperty" itemscope itemtype="http://schema.org/PropertyValue"><meta itemprop="name" content="Member of the EU since"><span itemprop="value" class="member-since">Dummy year</span></span></p></header><div itemprop="mainEntity" itemscope itemtype="http://schema.org/ItemList"><meta itemprop="description" content=""><article class="recipe loading" itemprop="itemListElement" itemscope itemtype="http://schema.org/Recipe"><meta itemprop="position" content=""><aside class="media"><div class="img-gallery" itemscope itemtype="http://schema.org/ImageGallery"></div><div itemscope itemtype="http://schema.org/VideoObject" class="youtube"><a itemprop="contentUrl" href="#" title=""><meta itemprop="name" content=""><meta itemprop="uploadDate" content=""><meta itemprop="description" content=""><img itemprop="thumbnailUrl" src="#" alt=""></a><div class="youtube-player"></div></div></aside><div class="text"><div class="wiki-text"><h1 itemprop="name">Dummy heading</h1><p itemprop="description"></p><p class="read-more">For more information about <span class="recipe-name"></span>, read the <a href="#" title="" itemprop="sameAs">Wiki</a>.</p></div><div class="rating" itemprop="aggregateRating" itemscope itemtype="http://schema.org/AggregateRating">Rated <span itemprop="ratingValue">3.5</span>/5 based on <span itemprop="reviewCount">11</span> customer reviews</div><div class="cooking"><h2>Bake it yourself!</h2><div><meta itemprop="cookTime" content=""><span>Bake time: <span class="bake-time"></span></span></div><div class="ingredients-wrapper"><h3>Ingredients <small>for <span itemprop="recipeYield"></span></small></h3><div class="ingredients"><h4>Dummy heading</h4><ul></ul></div></div><div class="how-to"><h3>Steps</h3><ol></ol></div></div></div></article></div></main></body></html>'; 
 
    
 
    $.ajax({ 
 
     type: 'post', 
 
     url: "/echo/html/", 
 
     dataType: "html", 
 
     data: { 
 
     html: html, 
 
     delay: 1 
 
     } 
 
    }).done(function(data) { 
 
     // string 
 
    \t console.log(data); 
 
     // array 
 
     console.log($(data)); 
 
     // array 
 
     console.log($.parseHTML(data)); 
 
     // array 
 
     console.log($($.parseHTML(data))); 
 
    });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

HTMLが有効です。しかし、私はオブジェクトでそれを得ることはできません。返されるデータは、期待どおりの文字列です。しかし、私が$.parseHTML()を使ってその文字列をHTMLとして解析しようとすると、またはに入れたり、両方とも試してみても、常に同じ結果が得られます。タイトルとメイン要素を含む配列です。

どのようにしてjQueryがそれを解析し、頭部の要素と体の1つの要素の配列を作成するのか、何らかの方法があります。しかしなぜ?そして、これをどのように修正してjQueryオブジェクトに変換できますか?私は体の中身だけに興味があります。

a similar questionがありますが、受け入れられた解決策はJSFiddleに入るときに役立ちませんし、この問題はXAMPPでもローカルで発生しています。

答えて

2
document.querySelector("body").innerHTML = + 
    '<object type="text/html" data="'+html+'" ></object>'; 

...が動作します。だから私は期待していると思います:

let parsedHtml = $('<object />', { 
    type:'text/html', 
    data:html 
}).html() 

もうまく動作するために、しかし、私は1つが実際にDOMに追加したときに、いくつかのマジックが起こる推測しています。それはそれを解析し、CSSOMとDOMを構築し、すべての依存関係を読み込みます。基本的にはブラウザが.htmlリソースを使って何をすると思いますか?だからここ

がそれを行うための方法です:それはonloadだ上

  1. ダミープレースホルダを作成し、
  2. 場所内部<object>、DOMへ
  3. アペンドダミー、
  4. は(<object>.contents()を取得しますイベント)、
  5. とダミーを削除します。
let html = '// your valid html...', 
    dummyDiv = $('<div />',{ 
     html: '<object type="text/html" data="'+html+'" ></object>', 
     style:"height:0;overflow:hidden;" 
    }); 

$('html').append(dummyDiv); 
console.log(dummyDiv.find('object').contents()); 

注Chromeが<object>ロードできない親にdisplay:noneを検出するのに十分既にスマートです。だから私はheight:0;overflow:hidden;を使ったのです。この要素の内容には、ドキュメントなので、jQueryオブジェクトの典型的な構造がないことに気づくでしょう。 HTML文字列を変数に既に存在する場合は、あなたはそれが即座にロード、

dummyDiv.find('object').contents()[1].innerHTML 

でジュースを見つけることができますが、実際には、あなたは<object>onloadリスナーを配置してのみ実行する必要があります4.5.リスナーがトリガーするときの

+0

ええと、最初にDOMに要素を追加しないとこれを行う方法はありますか?問題は、メモリに内容をロードし、その上でいくつかの変更(クローニング、切り離し、すべての処理)を行い、それをDOMに追加することです。メモリ内では、これはDOMの変更を行うよりも速くなければならないためです。 –

+0

私が知っているわけではありません。これは適切に解析されるこの方法です。さもなければ、あなたの文字列にいくつかの 'jQuery'トリックを実行できますが、それは' DOM'要素ではないので、すべてが利用可能とは限りません。たとえば、 '$(data)'で '.find()'を実行してクラスで選択すると、タグでは選択できませんが、それはDOMではないからです。それは文字列です。上記の方法では、ajaxがロードされるのを待つだけでなく、結果として生じるDOMが適切にロードされるようにします(DOM操作スクリプトがある場合に備えて)。 –

+0

私は参照してください。スマート。ですから、html/bodyに追加し、 '.detach()'をVARに入れて、解析された内容を効果的にメモリに戻し、ダミーを削除するのが最善の考えです。 VARを操作し、VARをDOMに追加し直しますか? –

1

jQuery.ajax() オプションをfalseに設定します。文字列をhtmldocumentに解析するには、DOMParser()を使用します。 XMLSerizlizer()を取得してDOCTYPE宣言を得る。 document.write()を書き込んでDOCTYPEとし、現在または他の文字にdocument.documentElement.outerHTMLと入力してください。htmldocument

PROCESSDATA(デフォルト:true

型:Boolean

デフォルトでは、オブジェクト (技術的には、文字列以外)としてdataオプションに渡されたデータは次のようになります処理され、 がデフォルトのコンテンツタイプ「 "application/x-www-form-urlencoded」に適合するクエリ文字列に変換されます。 DOMDocumentまたはその他の未処理データを送信する場合は、このオプションをfalseに設定します。


私はスタックスニペットは、GETリクエスト

はいを​​許可している場合はわかりません。 $.ajax()XMLHttpRequest()又はfetch()でリソースのdata URIurl又はBlob URL表現を設定することにより、GET要求をエコーすることが可能であり、現在にhtmldocumentをインポートすることも可能であるDoes Stack Overflow have an “echo page” to test AJAX requests, inside a code snippet?

var html = `<!DOCTYPE html> 
 
<html lang="en"> 
 

 
<head> 
 
    <title>Template</title> 
 
</head> 
 

 
<body itemscope itemtype="http://schema.org/WebPage"> 
 
    <main> 
 
    <header itemscope itemtype="http://schema.org/Country" itemprop="about"> 
 
     <h1 itemprop="name">Dummy heading</h1> 
 
     <p><span class="capital" title="Capital" itemprop="containsPlace"></span><span title="Dummy title" itemprop="additionalProperty" itemscope itemtype="http://schema.org/PropertyValue"><meta itemprop="name" content="Member of the EU since"><span itemprop="value" class="member-since">Dummy year</span></span> 
 
     </p> 
 
    </header> 
 
    <div itemprop="mainEntity" itemscope itemtype="http://schema.org/ItemList"> 
 
     <meta itemprop="description" content=""> 
 
     <article class="recipe loading" itemprop="itemListElement" itemscope itemtype="http://schema.org/Recipe"> 
 
     <meta itemprop="position" content=""> 
 
     <aside class="media"> 
 
      <div class="img-gallery" itemscope itemtype="http://schema.org/ImageGallery"></div> 
 
      <div itemscope itemtype="http://schema.org/VideoObject" class="youtube"> 
 
      <a itemprop="contentUrl" href="#" title=""> 
 
       <meta itemprop="name" content=""> 
 
       <meta itemprop="uploadDate" content=""> 
 
       <meta itemprop="description" content=""><img itemprop="thumbnailUrl" src="#" alt=""></a> 
 
      <div class="youtube-player"></div> 
 
      </div> 
 
     </aside> 
 
     <div class="text"> 
 
      <div class="wiki-text"> 
 
      <h1 itemprop="name">Dummy heading</h1> 
 
      <p itemprop="description"></p> 
 
      <p class="read-more">For more information about <span class="recipe-name"></span>, read the <a href="#" title="" itemprop="sameAs">Wiki</a>.</p> 
 
      </div> 
 
      <div class="rating" itemprop="aggregateRating" itemscope itemtype="http://schema.org/AggregateRating">Rated <span itemprop="ratingValue">3.5</span>/5 based on <span itemprop="reviewCount">11</span> customer reviews</div> 
 
      <div class="cooking"> 
 
      <h2>Bake it yourself!</h2> 
 
      <div> 
 
       <meta itemprop="cookTime" content=""><span>Bake time: <span class="bake-time"></span></span> 
 
      </div> 
 
      <div class="ingredients-wrapper"> 
 
       <h3>Ingredients <small>for <span itemprop="recipeYield"></span></small></h3> 
 
       <div class="ingredients"> 
 
       <h4>Dummy heading</h4> 
 
       <ul></ul> 
 
       </div> 
 
      </div> 
 
      <div class="how-to"> 
 
       <h3>Steps</h3> 
 
       <ol></ol> 
 
      </div> 
 
      </div> 
 
     </div> 
 
     </article> 
 
    </div> 
 
    </main> 
 
</body> 
 
</html>`; 
 

 

 
$.ajax({ 
 
    type: "GET", 
 
    url: "data:text/html," + html, 
 
    processData: false 
 
    }) 
 
    .then(function(data) { 
 
    // string 
 
    console.log(data); 
 
    var parser = new DOMParser(); 
 
    // document 
 
    var d = parser.parseFromString(data, "text/html"); 
 
    // `document`, `document` as jQuery object 
 
    console.log(d, $(d)); 
 
    // get elements having `itemscope` attribute 
 
    console.log($(d).find("[itemscope]")); 
 
    // do stuff 
 
    var dt = new XMLSerializer().serializeToString(d.doctype); 
 
    document.write(dt, d.documentElement.outerHTML); 
 
    }) 
 
    .fail(function(jqxhr, textStatus, errorThrown) { 
 
    console.log(errorThrown); 
 
    }); 
 
    
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

参照document 要素を使用してrel属性を"import"に設定すると、How to append a whole html file with jquery

+0

代わりに '.responseType'を' 'document''に' 'XMLHttpRequest()'を '' document''を 'load'または' readystatechange'イベントで 'XMLHttpRequest.response'として取得するために' ' 'fetch()'、 'Response.blob()'を使って 'Blob'として' html'を取得します。 – guest271314

+0

dataTypeを使用した場合の違いは何ですか:html?それはそれがやるべきことではありませんか?取得したコンテンツをHTMLとして処理しますか? –

+0

'dataType:" html "を使用すると同じ結果が返されます。 – guest271314

0

問題点あなたは直接HTMLにアクセスしようとしていますが、実際にはその文字列です。

したがって、データにアクセスするにはhtmlをレンダリングする必要があります。

このレスポンスデータを任意のhtml要素に格納し、それを介してアクセスします。

あなたのjsfiddleを変更しました。

0

私は常に同じ結果を得ます:タイトルとメイン要素を含む配列です。

正確にはどのような問題がありますか?

jQueryはそれを解析して、ヘッドの要素とボディの要素の配列を作成します。しかし、なぜ?

あなたは何を期待していますか?

これは、parseHtmlの動作のようです。ここで

は別の例です:

$.parseHTML("<div>Hello<span>World</span></div>") 

それは一つの要素を持つ配列を返します。div

あなたはdocs for parseHTMLを見れば、それは言う:

はの配列に文字列を解析しDOMノード。

だから、それはまさにそれが想定していることをしているようです。

私は体の内容にのみ興味があります。

本文の内容は、あなたが指摘したように2番目の要素ですmainです。

あなたは何をしたいですか?

jQueryコンストラクタに渡すことで、jQueryオブジェクトにラップすることができます。

var html = '<!DOCTYPE html><html lang="en"><head><title>Template</title></head><body itemscope itemtype="http://schema.org/WebPage"><main><header itemscope itemtype="http://schema.org/Country" itemprop="about"><h1 itemprop="name">Dummy heading</h1><p><span class="capital" title="Capital" itemprop="containsPlace"></span><span title="Dummy title" itemprop="additionalProperty" itemscope itemtype="http://schema.org/PropertyValue"><meta itemprop="name" content="Member of the EU since"><span itemprop="value" class="member-since">Dummy year</span></span></p></header><div itemprop="mainEntity" itemscope itemtype="http://schema.org/ItemList"><meta itemprop="description" content=""><article class="recipe loading" itemprop="itemListElement" itemscope itemtype="http://schema.org/Recipe"><meta itemprop="position" content=""><aside class="media"><div class="img-gallery" itemscope itemtype="http://schema.org/ImageGallery"></div><div itemscope itemtype="http://schema.org/VideoObject" class="youtube"><a itemprop="contentUrl" href="#" title=""><meta itemprop="name" content=""><meta itemprop="uploadDate" content=""><meta itemprop="description" content=""><img itemprop="thumbnailUrl" src="#" alt=""></a><div class="youtube-player"></div></div></aside><div class="text"><div class="wiki-text"><h1 itemprop="name">Dummy heading</h1><p itemprop="description"></p><p class="read-more">For more information about <span class="recipe-name"></span>, read the <a href="#" title="" itemprop="sameAs">Wiki</a>.</p></div><div class="rating" itemprop="aggregateRating" itemscope itemtype="http://schema.org/AggregateRating">Rated <span itemprop="ratingValue">3.5</span>/5 based on <span itemprop="reviewCount">11</span> customer reviews</div><div class="cooking"><h2>Bake it yourself!</h2><div><meta itemprop="cookTime" content=""><span>Bake time: <span class="bake-time"></span></span></div><div class="ingredients-wrapper"><h3>Ingredients <small>for <span itemprop="recipeYield"></span></small></h3><div class="ingredients"><h4>Dummy heading</h4><ul></ul></div></div><div class="how-to"><h3>Steps</h3><ol></ol></div></div></div></article></div></main></body></html>'; 

var parsed = $.parseHTML(html) 
var main = parsed[1] 
var $main = $(main) 
// $main is a jQuery object 
console.log("h4 content:", $main.find('h4').text()) 
関連する問題