質問編集履歴

6

書式の改善

2019/11/16 14:59

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -10,7 +10,7 @@
10
10
 
11
11
  # 期待する処理
12
12
 
13
- iframe内で画面遷移させ、現在のページが入力ページである場合(確認から戻ってき場合など)のみchangeSelectColor関数とswitchModalStatus関数一回ずつ走らせたいです。
13
+ iframe内で画面遷移際にrepeater関数の5行目を走らせたいです。
14
14
 
15
15
 
16
16
 
@@ -44,7 +44,7 @@
44
44
 
45
45
 
46
46
 
47
- # 当該コード(再現用簡易版)
47
+ # 当該コード(再現用簡易版です
48
48
 
49
49
 
50
50
 
@@ -245,181 +245,3 @@
245
245
 
246
246
 
247
247
  ```
248
-
249
-
250
-
251
- # 当該コード(オリジナル)
252
-
253
-
254
-
255
- このコードは静的ページで読み込んでいるスクリプトです。
256
-
257
- 埋め込んでいる子ページではスクリプトファイルを一切読み込んでいません。
258
-
259
-
260
-
261
- ```javascript
262
-
263
-
264
-
265
- const ua = window.navigator.userAgent.toLowerCase(),
266
-
267
- iframe = document.getElementsByClassName('contact__iframe')[0],
268
-
269
- modal = document.getElementsByClassName('contact__modal')[0],
270
-
271
- modalClose = document.getElementsByClassName('contact__modal-close')[0];
272
-
273
- let currentIframeHeight;
274
-
275
- let currentIframeTitle;
276
-
277
-
278
-
279
- // --------------------------------------
280
-
281
- // フォームの高さに応じてiframeを伸縮させる関数
282
-
283
- // --------------------------------------
284
-
285
- const adjustIframeHeight = () => {
286
-
287
- console.log("adjustIframeHeight");
288
-
289
- currentIframeHeight = iframe.contentWindow.document.body.scrollHeight;
290
-
291
- iframe.style.height = currentIframeHeight + 'px';
292
-
293
- }
294
-
295
-
296
-
297
- // -----------------------------------------
298
-
299
- // お問い合わせ種別セレクタのカラーを変更する関数
300
-
301
- // -----------------------------------------
302
-
303
- const changeSelectColor = () => {
304
-
305
- console.log("changeSelectColor");
306
-
307
- const inquirytype = iframe.contentWindow.document.getElementById('contact-inquirytype');
308
-
309
- // 現在のページにinquirytypeが存在する場合...
310
-
311
- if (inquirytype) {
312
-
313
- inquirytype.addEventListener('change', () => {inquirytype.style.color = 'inherit';}, false);
314
-
315
- // セレクタが既に変更されている場合...
316
-
317
- if (inquirytype.value)
318
-
319
- inquirytype.style.color = 'inherit';
320
-
321
- }
322
-
323
- }
324
-
325
-
326
-
327
- // -----------------------------------------------
328
-
329
- // 要素のクリックに応じてプライバシーポリシーを開閉する関数
330
-
331
- // -----------------------------------------------
332
-
333
- const switchModalStatus = () => {
334
-
335
- console.log("switchModalStatus");
336
-
337
- const modalOpen = iframe.contentWindow.document.getElementsByClassName('contact__form-privacypolicy-link')[0];
338
-
339
- // 現在のページにモーダルのリンクが存在する場合...
340
-
341
- if (modalOpen)
342
-
343
- modalOpen.addEventListener('click', () => {modal.classList.toggle('is-active');}, false);
344
-
345
- }
346
-
347
-
348
-
349
- // -----------------------------------------------
350
-
351
- // iframe内で画面遷移した際に各関数を一回ずつ実行する関数
352
-
353
- // -----------------------------------------------
354
-
355
- const repeater = () => {
356
-
357
- // iframe内の要素が読み込まれてから実行する
358
-
359
- if (iframe.contentWindow.document.body) {
360
-
361
- if (currentIframeHeight != iframe.contentWindow.document.body.scrollHeight)
362
-
363
- adjustIframeHeight();
364
-
365
- // -----------------------------下記の範囲内がエラー箇所です。---------------------------------------------------------
366
-
367
- if (currentIframeTitle != iframe.contentWindow.document.getElementById('page__title')) {
368
-
369
- console.log("repeater iframe changed");
370
-
371
- changeSelectColor();
372
-
373
- switchModalStatus();
374
-
375
- currentIframeTitle = iframe.contentWindow.document.getElementById('page__title');
376
-
377
- }
378
-
379
- // ------------------------------------------------------------------------------------------------------------------
380
-
381
- }
382
-
383
- window.requestAnimationFrame(repeater);
384
-
385
- }
386
-
387
-
388
-
389
- // ---------------------------
390
-
391
- // ページの読み込み時に実行する処理
392
-
393
- // ---------------------------
394
-
395
- modalClose.addEventListener('click', () => {modal.classList.toggle('is-active');}, false);
396
-
397
-
398
-
399
- // iOS端末はブラウザバックでJavaScriptが再実行されないので、pageshowで対処する
400
-
401
- if (ua.indexOf('iphone') > -1 || ua.indexOf('ipad') > -1) {
402
-
403
- window.addEventListener('pageshow', () => {
404
-
405
- adjustIframeHeight();
406
-
407
- repeater();
408
-
409
- }, false);
410
-
411
- } else {
412
-
413
- window.addEventListener('load', () => {
414
-
415
- adjustIframeHeight();
416
-
417
- repeater();
418
-
419
- }, false);
420
-
421
- }
422
-
423
-
424
-
425
- ```

5

情報の追加

2019/11/16 14:59

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -16,9 +16,21 @@
16
16
 
17
17
  # エラー内容
18
18
 
19
+ **※修正**
20
+
21
+ IEのコンソールに出力されるエラー分は下記の通りです。
22
+
23
+
24
+
25
+ > SCRIPT70: 書き込みできません。
26
+
27
+ > working (624,9)
28
+
29
+
30
+
19
- IEのコンソールでは、repeater関数内の`if (currentIframeTitle != iframe.contentWindow.document.getElementById('page__title'))`
31
+ working (624,9)は、repeater関数内の`if (currentIframeTitle != iframe.contentWindow.document.getElementById('page__title'))`
20
-
32
+
21
- でエラーとなっいるようで、このif文を排除すると問題なく処理されます。(if分を排除しているので1フレームに1回実行されますが…)
33
+ を指しおり、このif文を排除すると問題なく処理されます。(if分を排除しているので1フレームに1回実行されますが…)
22
34
 
23
35
  自分がデバッグした範囲ではcurrentIframeTitleが怪しいのですが…。
24
36
 
@@ -32,7 +44,211 @@
32
44
 
33
45
 
34
46
 
47
+ # 当該コード(再現用簡易版)
48
+
49
+
50
+
51
+ iframeを埋め込んでいる親ページです。(index.html)
52
+
53
+ ```HTML
54
+
55
+
56
+
57
+ <!DOCTYPE html>
58
+
59
+ <html lang="ja" prefix="og: http://ogp.me/ns#">
60
+
61
+ <head>
62
+
63
+ <meta charset="utf-8">
64
+
65
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
66
+
67
+ <meta name="viewport" content="width=device-width,initial-scale=1">
68
+
69
+ </head>
70
+
71
+ <body>
72
+
73
+ <iframe class="contact__iframe" src="./iframe.php" style="width: 50%; height: 500px"></iframe>
74
+
75
+ <script src="index.js"></script>
76
+
77
+ </body>
78
+
79
+ </html>
80
+
81
+
82
+
83
+ ```
84
+
85
+
86
+
87
+ iframeに埋め込まれている子ページです。(iframe.php)
88
+
89
+ コードは(https://www.web-officer.com/php/how-to-play-multiple-pages-role-in-one-php-file.php)
90
+
91
+ 上記の記事から拝借してきました。このコードでもエラーが発現しました。
92
+
93
+ ```php
94
+
95
+
96
+
97
+ <?php
98
+
99
+ if($_SERVER['REQUEST_METHOD']=="POST") {
100
+
101
+ $transition = $_POST['transition'];
102
+
103
+ $name = $_POST['name'];
104
+
105
+ if($transition == "first") {
106
+
107
+ $transition = "second";
108
+
109
+ }else if($transition == "second") {
110
+
111
+ $transition = "finish";
112
+
113
+ }
114
+
115
+ }else {
116
+
117
+ $transition = "first";
118
+
119
+ }
120
+
121
+ ?>
122
+
123
+
124
+
125
+ <?php if($transition == "first") { ?>
126
+
127
+ <title>page1</title>
128
+
129
+ <p>お名前を入力して下さい。</p>
130
+
131
+ <?php }else if($transition == "second") { ?>
132
+
133
+ <title>page2</title>
134
+
135
+ <p>下記の内容で送信します。宜しければ「送信」ボタンをクリックして下さい。</p>
136
+
137
+ <input name="name" type="hidden" value="<?=$name?>">
138
+
139
+ <?php }elseif($transition == "finish") { ?>
140
+
141
+ <title>page3</title>
142
+
143
+ <p>送信が完了しました。ありがとうございました。</p>
144
+
145
+ <?php } ?>
146
+
147
+
148
+
149
+ <?php if($transition != "finish") { ?>
150
+
151
+ <form method="post" action="">
152
+
153
+ <table>
154
+
155
+ <tr>
156
+
157
+ <td>お名前</td>
158
+
159
+ <td><input name="name" type="text" value="test"></td>
160
+
161
+ </tr>
162
+
163
+ </table>
164
+
165
+ <input name="transition" type="hidden" value="<?php echo $transition ?>">
166
+
167
+ <input type="submit" />
168
+
169
+ </form>
170
+
171
+ <?php } ?>
172
+
173
+ ```
174
+
175
+ 親ページで読み込んでいるスクリプトです。(index.js)
176
+
177
+ オリジナルのコードを簡略化しております。
178
+
179
+ ```javascript
180
+
181
+ (function () {
182
+
183
+ 'use strict';
184
+
185
+
186
+
187
+ {
188
+
189
+ var iframe = document.getElementsByClassName('contact__iframe')[0];
190
+
191
+ var currentIframeTitle = 0; // -----------------------------------------------
192
+
193
+ // iframe内で画面遷移した際に各関数を一回ずつ実行する関数
194
+
195
+ // -----------------------------------------------
196
+
197
+
198
+
199
+ var repeater = function repeater() {
200
+
201
+ if (iframe.contentWindow.document.body) {
202
+
203
+ // currentIframeTitle変数と表示しているページのタイトルタグを比べて、ページが遷移したかどうかを判定する
204
+
205
+ if (currentIframeTitle != iframe.contentWindow.document.getElementsByTagName('title')) {
206
+
207
+ // この中に一回ずつ実行したい関数を記述して、最後にcurrentIframeTitleに現在ページのタイトルタグを代入する。
208
+
209
+ currentIframeTitle = iframe.contentWindow.document.getElementsByTagName('title');
210
+
211
+ console.log("page transition");
212
+
213
+ }
214
+
215
+ } // requestAnimationFrameで、1フレームに1回実行する
216
+
217
+
218
+
219
+
220
+
221
+ window.requestAnimationFrame(repeater);
222
+
223
+ }; // ---------------------------
224
+
225
+ // ページの読み込み時に実行する処理
226
+
227
+ // ---------------------------
228
+
229
+
230
+
231
+
232
+
233
+ window.addEventListener('load', function () {
234
+
235
+ repeater();
236
+
237
+ }, false);
238
+
239
+ }
240
+
241
+
242
+
243
+ }());
244
+
245
+
246
+
247
+ ```
248
+
249
+
250
+
35
- # 当該コード
251
+ # 当該コード(オリジナル)
36
252
 
37
253
 
38
254
 

4

コードの修正

2019/11/16 10:51

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -26,6 +26,8 @@
26
26
 
27
27
 
28
28
 
29
+ なお、静的ページと埋め込んでいる子ページは同一ドメイン内に設置しております。
30
+
29
31
  よろしくお願いいたします。
30
32
 
31
33
 

3

コードの修正

2019/11/15 16:22

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -32,6 +32,14 @@
32
32
 
33
33
  # 当該コード
34
34
 
35
+
36
+
37
+ このコードは静的ページで読み込んでいるスクリプトです。
38
+
39
+ 埋め込んでいる子ページではスクリプトファイルを一切読み込んでいません。
40
+
41
+
42
+
35
43
  ```javascript
36
44
 
37
45
 

2

誤字の修正

2019/11/15 16:19

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -10,7 +10,7 @@
10
10
 
11
11
  # 期待する処理
12
12
 
13
- iframe内で画面遷移際にchangeSelectColor関数とswitchModalStatus関数を一回ずつ走らせたいです。
13
+ iframe内で画面遷移させ、現在のページが入力ページである場合(確認から戻ってき場合など)のみ、changeSelectColor関数とswitchModalStatus関数を一回ずつ走らせたいです。
14
14
 
15
15
 
16
16
 

1

エラー内容の追加

2019/11/15 16:15

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -16,7 +16,11 @@
16
16
 
17
17
  # エラー内容
18
18
 
19
- IEのコンソールでは、repeater関数内の`if (currentIframeTitle != iframe.contentWindow.document.getElementById('page__title'))`でエラーとなっているようで、このif文を排除すると問題なく処理されます。(if分を排除しているので1フレームに1回実行されますが…)
19
+ IEのコンソールでは、repeater関数内の`if (currentIframeTitle != iframe.contentWindow.document.getElementById('page__title'))`
20
+
21
+ でエラーとなっているようで、このif文を排除すると問題なく処理されます。(if分を排除しているので1フレームに1回実行されますが…)
22
+
23
+ 自分がデバッグした範囲ではcurrentIframeTitleが怪しいのですが…。
20
24
 
21
25
  静的ページをロードした後の初回実行では、上記のif文もエラー出力されず正しく処理されます。
22
26