🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

3744閲覧

HTMLを読み込み、DOMに設定する方法

mayfil521

総合スコア5

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

1グッド

1クリップ

投稿2019/10/10 14:03

編集2019/10/11 05:53

はじめまして。
何日もかかって調べましたが、どうしてもわかりませんでしたので、
どなたかご教授お願い致します。

ローカルにあるHTMLファイルをDOMとして取得し、ソースを書き換える方法を探しています。
まず、HTMLファイルのソースを文字列として取得する方法として、下記サイトを参考にさせて頂きました。
https://www.excellence-blog.com/2018/02/02/html%E3%81%A7%E5%A4%96%E9%83%A8%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%82%80/
オブジェクトタグのdata属性にhtmlファイル名を設定しています。

javascript

1#<object id="aaatext" data="aaa.html" type="text/plain" style="display:none"></object> 2 <script> 3 var obj = document.getElementById("aaatext"); 4 obj.onload = function() { 5 var loadtext = obj.contentDocument.documentElement.textContent; 6 alert(loadtext); 7 } 8 </script> 9

次に、文字列をDOMとして取得する方法は下記のサイトを参考にさせて頂きました。
http://donsuka-kk.hatenablog.com/entry/20140228/1393596415

javascript

1( function() {"use strict"; 2 3 var text = "<!DOCTYPE html>"; 4 text += "<head>"; 5 text += "<title>test</title>"; 6 text += "<meta charset='UTF-8'/>"; 7 text += "<meta name='viewport' content='width=device-width,user-scalable=no'/>"; 8 text += "</head>"; 9 text += "<body>"; 10 text += "<h1>test</h1>"; 11 text += "<div id='section1'>section1</div>"; 12 text += "<p>これはテストです。</p>"; 13 text += "</body>"; 14 15 16function getDom(txt) { 17 var htmlDoc; 18 htmlDoc = document.implementation.createHTMLDocument('dom'); 19 htmlDoc.documentElement.innerHTML = txt; 20 return htmlDoc; 21} 22 23 function init() { 24 var target = document.getElementById('target'); 25 target.innerHTML = '初期値'; 26 var DOM = getDom(text); 27 console.log(DOM); 28 target.innerHTML += DOM.getElementById('section1').textContent; 29 } 30 31 if (document.body) { 32 init(); 33 } else { 34 document.addEventListener('DOMContentLoaded', init, false); 35 } 36 }()); 37

上記の text +=の部分を最初のソースにあるloadtextに置き換えてみたのですが、上手く行きません。
IEではalert(loadtext)できちんとソースコードが表示されています。
どのようにcreateHTMLDocumentの引数に設定したらよいでしょうか?

10/11追加
以下が実際に書いたコードです。

javascript

1<html> 2<head> 3<title>test</title> 4</head> 5<body> 6 7<object id="ob1" type="text/html" data="sample.html"> 8</object> 9 10<script type="text/javascript"> 11 12var obj = document.getElementById("ob1"); 13 obj.onload = function() { 14 var loadtext = obj.contentDocument.documentElement.textContent; 15 //var loadtext = obj.contentDocument.documentElement.outerHTML 16 console.log(loadtext); 17 } 18 19function getDom(txt) { 20 var htmlDoc; 21 htmlDoc = document.implementation.createHTMLDocument('dom'); 22 htmlDoc.documentElement.innerHTML = txt; 23 return htmlDoc; 24} 25 26var DOM = getDom(loadtext); 27console.log(DOM.getElementById('ichiran').textContent); 28 29</script> 30 31</body> 32</html>

miyabi_takatsuk 様
dodox86 様
m.ts10806 様(タグ追加の手続きは自分ではできないようですので、後程行います)

ご指摘ありがとうございます。投稿内容修正いたしましたのでご確認のほどよろしくお願いいたします。

Chromeで開いた状態で以下のエラーです。

getDom(text)のところで loadtext is not defined というエラーがでます。

documentElement.textContent;のところで documentElement' of null というエラーがでます。

IEではalertはでますが、console.logが表示されません。

ご教示のほどよろしくお願いいたします。

s8_chu👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

miyabi_takatsuk

2019/10/10 15:46 編集

コードはコードブロックにて記載してください。 <code>ボタンで挿入される ``` ここにソースコード ``` とします。 さて、うまくいかないだけでは何もわかりません。 何がどううまくいかないのかを記載ください。 そして、コンソールに何かエラーがでていませんか? (状況から察するに、100%何かしらのエラーがでてるはず) Google Chromeで開いている状態で、F12を押すと出てくる、デベロッパーツールの中に、コンソールログを見ることができる画面がありますので、 そこを見てまずはエラーがでていないか確認し、 質問本文に記載しましょう。 質問は編集できます。
m.ts10806

2019/10/10 23:22

タグはHTMLだけでは不足しているように見受けられます。過不足なく適切に設定してください
guest

回答1

0

ベストアンサー

Chrome の場合、ローカルファイルで .contentDocument プロパティを読むには --allow-file-access-from-files オプションを使う必要があります。
http://bukiyouengineermemo.blog.jp/archives/2423546.html

sample.html が通常の HTML であれば、
obj.contentDocument.getElementById('ichiran').textContent
でいいはずで、いちいちほかの document に入れなおしているのはよくわかりません。

JavaScript

1obj.onload = function(event) { 2 console.log(obj.contentDocument.getElementById('ichiran').textContent); 3};

投稿2019/10/11 06:55

編集2019/10/15 00:45
x_x

総合スコア13749

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mayfil521

2019/10/11 12:51

ご回答ありがとうございます。 教えて頂いたサイトで以下の設定を行い、 --allow-file-access-from-files 再起動後に以下のページで設定済であることを確認しました。 chrome://version/ そしてchromeで obj.contentDocument.getElementById('ichiran').textContent と入れても反応がありません。 ですが、IEですとalertで表示されました。 ありがとうございました。 他のdocumentに入れ直すわけは、ID以外にもtagnameやclassなどでDOMノードの取得が必要なためです。 ちなみに教えて頂いたコードをgetElementsByTagName(tagName)に置き換えて行ってみるとIEでも反応しませんでした。 クロスオリジンの設定をしたので、chromeでもう一度createHTMLDocumentを使ってみましたら、 blocked a frame with origin "null" from accessing a cross-origin frame や cannot read property" documentElement" of null などのエラーがでました。 職場のPCですので、クロスオリジンの設定には限界があるのかも知れません。
x_x

2019/10/15 00:40

こちらでは動いているので、タスクマネージャーを見ていったんちゃんと Chrome を終了できているか確認してもらえますか?
x_x

2019/10/15 00:46

念のために確認コードを追記しておきました。
mayfil521

2019/10/15 07:06

x_x 様 ご回答ありがとうございます。 教えて頂いた確認コードを入力して実行しました。 タスクマネージャーでChromeの表示がないことの確認もしてあります。 getElementById('ichiran') のところで Cannot read property 'getElementById' of null というエラーがでます。 ちなみにalertに変えてIEで表示するとちゃんと取得できます。 やはりPC側の問題でしょうか。
x_x

2019/10/15 07:12

そもそもとしてローカルファイルを開いているのでしょうか? 回答の最初に書いてある通り、ローカルファイルを開いている前提です
x_x

2019/10/15 07:18

クロスオリジンの設定というのが気になるのですが、オプションのことを指しているのであればこれは名前の通りファイルからファイルを見るということができるだけで、オリジンを超えたりするものではありません。
mayfil521

2019/10/15 07:25

ご回答ありがとうございます。 最初の質問に書いた通りローカルファイルのソースを読み込む方法を探しております。 オリジンを超えられるというイメージで行っておりましたが、そうではないのですね。 ご教示ありがとうございます。 ローカルファイルでも読めないとなると、あきらめるしかないのでしょうか?
x_x

2019/10/15 07:31

「ローカルファイルを開いているのでしょうか?」に答えてもらえますか?
mayfil521

2019/10/15 07:33

はい。ローカルファイルを開いております。 フォルダも現段階では同じところにしております。
x_x

2019/10/15 07:37

ローカルファイルであれば、--allow-file-access-from-files オプションでいけるはずです。 ハイフンが不足していたり、スペリングミスはないでしょうか?
mayfil521

2019/10/15 07:51

コピペしたので、スペリングミスはないと思います。 デスクトップ上に2つと下に1つの計3つのアイコンがあるので、すべてのアイコンからchrome://version/にアクセスした結果が下記です。 ・・・chrome.exe" --allow-file-access-from-files --flag-switches-begin --flag-switches-end ・・・chrome.exe" --profile-directory=Default --allow-file-access-from-files --flag-switches-begin --flag-switches-end ・・・chrome.exe" --allow-file-access-from-files --flag-switches-begin --flag-switches-end
x_x

2019/10/15 07:55

うーん、謎ですね。 ロード後にデベロッパーツールの Console で下記を入力すると null が返ってきますか? $('#ob1').contentDocument
mayfil521

2019/10/15 08:00

はい。nullが返ってきました。
x_x

2019/10/15 08:06

返ってきてほしくないのですが…… そのときのアドレス欄をコピーすると file:/// から始まるものになっていますか?
mayfil521

2019/10/15 08:14

アドレスバーの文字をコピーしてメモ帳に貼り付けましたら、file:///で始まっています。
mayfil521

2019/10/15 08:15

そのアドレスは参照元のアドレスになっているのですが、それは問題ではないでしょうか?
mayfil521

2019/10/15 08:29

ありがとうございます。 やっとできました! 大変助かりました。 丁寧に教えて頂き、本当にありがとうございました。
x_x

2019/10/15 08:31

長くなってしまって申し訳ないです。 お疲れさまでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問