質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

4439閲覧

document.readyState の値が常に「complete」のままとなってしまう(IE → Chrome対応)

Taichirou

総合スコア12

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2022/06/09 07:20

社内のWEBシステムについて、IE→Chromeの置き換え対応を実施しております。
その中で「ボタンの二重クリックを抑止する機能」について
IEの時にはローディング中に再度クリックすると以下の箇所で「loading」が格納されており
alertが出力されておりました。

Javascript

1return (document.readyState != null && document.readyState != "complete");

しかしChromeで実行いたしますと
ローディング中にクリックした場合でも「complete」が格納されてしまい
二重クリックが抑止できない状況( alert("処理中です…") が出力されない)となります。

Chromeで動作が想定通りとなるようにする方法についてご教授いただければ幸いです。

また、Javascript自体初学者となりますので情報に不足など御座いましたら
大変お手数ですが、ご質問いただけますと幸いです。

以上、よろしくお願いします。

Javascript

1// 画面ロード処理 2onload = function () { 3 return window_Load(); 4} 5 6function window_Load() { 7 var i; 8 9 for (i = 0; i < document.links.length; i++) { 10 var item = document.links[i] 11 Object.Aspect.around(item, "onclick", checkLoading); 12 } 13 14 var items = document.body.getElementsByTagName('input'); 15 16 for (i = 0; i < items.length; i++) { 17 var item = items[i]; 18 19 if (item.type == "button" || 20 item.type == "submit" || 21 item.type == "reset" || 22 item.type == "image" 23 ) { 24 Object.Aspect.around(item, "onclick", checkLoading); 25 } 26 } 27 28 for (i = 0; i < document.forms[0].elements.length; i++) { 29 var item = document.forms[0].elements[i]; 30 31 if (item.type == "text" || 32 item.type == "button" || 33 item.type == "submit" || 34 item.type == "reset" || 35 item.type == "checkbox" || 36 item.type == "radio" || 37 item.type == "select-one" || 38 item.type == "select-multiple" || 39 item.type == "textarea" || 40 item.type == "password" 41 ) { 42 try { 43 item.focus(); 44 break; 45 } catch (e) { 46 // 47 } 48 } 49 } 50 51 return true; 52} 53 54// 2度押し抑止アスペクト 55var checkLoading = function (invocation) { 56 if (isDocumentLoading()) { 57 alert("処理中です…"); 58 return false; 59 } 60 61 return invocation.proceed(); 62} 63 64// 画面描画が終わったかどうか 65function isDocumentLoading() { 66 return (document.readyState != null && document.readyState != "complete"); 67} 68 69// アスペクト用 70Object.Aspect = { 71 _around: function (target, methodName, aspect) { 72 var method = target[methodName]; 73 74 target[methodName] = function () { 75 var invocation = { 76 "target": this, 77 "method": method, 78 "methodName": methodName, 79 "arguments": arguments, 80 "proceed": function () { 81 if (!method) { 82 return true; 83 } 84 85 return method.apply(target, this.arguments); 86 } 87 }; 88 89 return aspect.apply(null, [invocation]); 90 }; 91 }, 92 around: function (target, methodName, aspect) { 93 this._around(target, methodName, aspect); 94 } 95}

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

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

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

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

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

guest

回答2

0

ベストアンサー

あらゆるナビゲーションで document.readyState が変化してしまうのは IE のバグだと思いますが、HTML標準の範囲内であらゆるケースでナビゲーション中かどうかを判定できる手段はない気がします。


現在のdocumentを置き換えるようなナビゲーション(ロード完了状態を検知する必要がない)だけなら、checkLoading() 中でグローバル変数をチェック・更新すればいいでしょう。

js

1var isLoading = false; 2var checkLoading = function(invocation) { 3 if (window.isLoading) { 4 alert("処理中です…"); 5 return false; 6 } 7 window.isLoading = true; 8 return invocation.proceed();

ページ内リンクなどdocumentを置き換えないケースを除外する必要があります。


target属性でiframeや別のウィンドウがナビゲーション先になっていてそのウィンドウにアクセスできるなら、その document.readyState を見ることができます。

target=_new target=_blank で新規ウィンドウを開いたり、ナビゲーション元やナビゲーション先が別オリジンのURLの場合はまったく手段がないように思えます。

投稿2022/06/10 00:02

int32_t

総合スコア20850

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

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

Taichirou

2022/06/10 04:14

回答ありがとうございます! 実装させていただきました。 書いていただいている通り、画面が完全に切り替わるような箇所では問題なく動作いたしました! しかし、画面を書き換えない処理ですと「処理中です...」がその後何を押しても出てしまいます。 (Javascriptで入力チェックし、チェックに引っかかるとアラートを出し処理を終了するような場合) 上記の様な画面が切り替わらない箇所には異なる仕組みを実装しようと考えておりますが もうしばらくお時間がかかりそうです・・・。 取り急ぎご連絡いたします。
Taichirou

2022/06/13 04:02

お世話になっております。 ご提示いただいた方法を導入させていただきました。 上記しております、「Javascriptで入力チェック」するような箇所では 入力チェック後に var isLoading = false; とフラグを戻すことで動作いたしました。 基本的な個所で時間を要してしまい、返答にお時間いただき申し訳ございません。 こちらのソースに基づいたご提案を頂けました為 ベストアンサーとさせていただきます。 ありがとうございました。
guest

0

非同期処理の読み込み中かどうかをチェックするならこんな感じではよいのでは?

javascript

1<script> 2var isLoading=false; 3function fetchItem() { 4 if(!isLoading){ 5 fetch(url).then(res =>res.text()).then(x=>{ 6 console.log(x); 7 isLoading=false; 8 }); 9 } 10 isLoading=true; 11} 12</script> 13<input type="button" id="btn" value="btn" onclick="fetchItem()">

投稿2022/06/09 11:07

yambejp

総合スコア114784

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

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

Taichirou

2022/06/09 12:53

回答ありがとうございます! 明日出社いたしましたら、試してみます。 その後結果をご報告させていただきたいと思います。
Taichirou

2022/06/10 04:10

ご提案頂いた内容について実装してみましたが 現状、上手く動作しておりません・・・。 ご提示のソースですと 「onclick="fetchItem()"」をつけたボタンのみ ロード中かどうかを判定してくれるという認識かと思います。 それを全てのボタンに反映する。と言う所でつまってしまい もうしばらくお時間を頂くことになりそうです・・・。 取り急ぎご連絡いたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問