質問編集履歴

1

コードを含めて詳細に記入しました

2019/12/18 02:29

投稿

kamontia
kamontia

スコア7

test CHANGED
File without changes
test CHANGED
@@ -3,3 +3,119 @@
3
3
  iframeで取得したコンテンツの表示範囲をずらして表示したいです。
4
4
 
5
5
  管理下にある同一ドメインのあるページをiframeで表示しているのですが、取得先のコンテンツに表示不要なメニューなどがあるため、X軸やY軸に数px分ずらして表示したいです
6
+
7
+
8
+
9
+ (2019/12/18 追記)
10
+
11
+ 丸投げの質問になっておりました。大変申し訳ありません。
12
+
13
+ いくつか試してみたのですがコードを提示するよりも、やりたいことのみに絞るほうが幅広い(想定していなかった)回答を得られるのではないかと期待していましたが単なる怠惰でした。再度詳細に質問をさせて下さい。
14
+
15
+
16
+
17
+ ### 前提・実現したいこと
18
+
19
+ メインページに、iframeやobjectタグを使って外部からコンテンツを表示しているのですが、コンテンツのデザインがメインページと異なるため必要な部分だけを取り出したいです。
20
+
21
+ 外部から取得するコンテンツは[Chronograf](https://docs.influxdata.com/chronograf/v1.7/)で時系列DBであるInfluxdbの可視化OSSです。Chronograf自体はReactで実装されています。
22
+
23
+
24
+
25
+ ### 試したこと
26
+
27
+ - 方法1. iframe や object タグが返す contentWindowで埋め込んだオブジェクト内部へのアクセス
28
+
29
+ [iframe内のDOMについて](https://teratail.com/questions/14632)を参考に実装
30
+
31
+ → メインページとChronografはポート番号が違うためクロスドメイン制約によりブラウザ側でエラーを出力。
32
+
33
+ → もしオブジェクト内部でアクセスできればCSSのtransformを適用させてX軸、Y軸をずらして不要な部分を隠すつもりでした。
34
+
35
+
36
+
37
+
38
+
39
+ - 方法2. 非同期通信で取得したHTMLの埋め込み
40
+
41
+ 方法1.の[iframe内のDOMについて](https://teratail.com/questions/14632)での回答に、クロスドメイン制約を受ける場合は非同期通信を使うことで解決することを受けて、Vue内でaxiosによる問い合わせを行って取得したHTMLを追加
42
+
43
+ → 何も表示されない(取得できたHTMLの埋め込みはできている)
44
+
45
+ → レスポンスコードは200でBodyを取得できるが、サーバーサイドでレンダリングされていないため必要な情報が全て取得できない
46
+
47
+
48
+
49
+
50
+
51
+ ### 該当のソースコード
52
+
53
+ ```html
54
+
55
+ # リクエスト前
56
+
57
+ <div id="chronograf"></div>
58
+
59
+
60
+
61
+ # リクエスト後(javascript側で取得したHTMLはappend出来ているが、SPAのためレンダリングが完了していないレスポンスが返ってくる)
62
+
63
+ <div data-v-8dc7cce2="" id="chronograf"> <div id="react-root" data-basepath=""></div> <script src="/src.d4e31fda.js"></script> </div>
64
+
65
+ ```
66
+
67
+
68
+
69
+
70
+
71
+ ```javascript
72
+
73
+ ...省略
74
+
75
+ mounted: async function() {
76
+
77
+ axios({
78
+
79
+ method: "GET",
80
+
81
+ url: "/chronograf", <- Vueの設定によりProxyさせて、クロスドメイン制約対応しています
82
+
83
+ responseType: "document"
84
+
85
+ })
86
+
87
+ .then(res => {
88
+
89
+ const body = document.querySelector("#chronograf");
90
+
91
+ Array.from(res.data.body.childNodes).forEach(node => {
92
+
93
+ body.appendChild(node);
94
+
95
+ });
96
+
97
+ })
98
+
99
+ .catch(e => {
100
+
101
+ console.log(e);
102
+
103
+ });
104
+
105
+ ```
106
+
107
+
108
+
109
+
110
+
111
+
112
+
113
+ ### 補足情報(FW/ツールのバージョンなど)
114
+
115
+ * フロントエンド:Vue.js 3
116
+
117
+
118
+
119
+ ### まだ試していないが次試そうと考えていること
120
+
121
+ iframeタグで外部ページを取得して、不要な部分を<div>要素のz-index指定で隠すというアナログな方法