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

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

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

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

Q&A

1回答

434閲覧

JavaScript(ブックマークレット)

aoiname

総合スコア0

JavaScript

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

1グッド

1クリップ

投稿2024/12/13 04:49

実現したいこと

ブックマークレット実行中はedge(IEモード)のアラートを表示しないようにしたい。

発生している問題・分からないこと

edge(IEモード)を利用しています。※このモードでしか表示できないブラウザです。

作業効率の確認のために、ブックマークレットを使った方法でテーブルデータを取得してcsvファイルへ出力しているのですが、元々の仕様(JavaScript)でテーブルデータが0件の時にfunctionで関数が呼び出されwebからのメッセージとしてこの担当者はデータがありません。アラートがでるようになっています。

アラートがでてしまうと、ブックマークレットの動作が止まってしまい次の担当者の検索に移りません。

どうにかアラートを無効にする関数などを入れてみたのですが、無効にならずアラートがでてきます。。。

ご教示いただける方がいましたら幸いです。

該当のソースコード

JavaScript(ブックマークレット)

1javascript:(function() { 2 // ファイル入力要素を作成 3 var input = document.createElement('input'); 4 input.type = 'file'; 5 input.accept = '.js'; 6 7 // ファイルが選択されたときの処理 8 input.onchange = function(e) { 9 var file = e.target.files[0]; 10 var reader = new FileReader(); 11 12 // ファイルの読み込みが完了したときの処理 13 reader.onload = function(event) { 14 try { 15 // ファイルの内容を取得 16 var content = event.target.result; 17 // 配列データを抽出 18 var idData = eval(content.substring(content.indexOf('['), content.lastIndexOf(']') + 1)); 19 var allData = ""; 20 21 // データを検索する関数 22 (function search(index) { 23 // インデックスが配列の長さを超えた場合はCSVをダウンロード 24 if (index >= idData.length) { 25 downloadCSV(allData); 26 return; 27 } 28 29 // メッセージフレームのドキュメントを取得 30 var frameDoc = window.frames["custom_frame_1"].document; // IDを変更 31 var customCode = frameDoc.getElementsByName("customCode")[0]; // IDを変更 32 var customName = frameDoc.getElementsByName("customName")[0]; // IDを変更 33 var customButton = frameDoc.getElementsByName("customButton")[0]; // IDを変更 34 35 // フォームが存在する場合 36 if (customCode && customName && customButton) { 37 // 値を設定 38 customCode.value = idData[index][0]; 39 customName.value = idData[index][1]; 40 frameDoc.getElementsByName("customFlag")[0].checked = true; // IDを変更 41 customButton.click(); 42 43 // 結果が返ってくるまでの処理 44 setTimeout(function() { 45 executeBookmarklet2(); 46 var checkResults = setInterval(function() { 47 var frame2Doc = window.frames["custom_frame_2"].document; // IDを変更 48 var rows = frame2Doc.querySelectorAll("[id^='custom_row_']"); // IDを変更 49 50 // 行が存在する場合 51 if (rows.length > 0) { 52 clearInterval(checkResults); 53 Array.prototype.forEach.call(rows, function(row) { 54 // 行データを取得 55 var rowData = Array.prototype.slice.call(row.cells).map(function(cell) { 56 return cell.innerText; 57 }); 58 // CSVデータに追加 59 allData += customName.value.trim() + "," + rowData.slice(2).join(",") + "\n"; 60 }); 61 // 次のインデックスで検索を続ける 62 search(index + 1); 63 } else { 64 clearInterval(checkResults); 65 // 次のインデックスで検索を続ける 66 search(index + 1); 67 } 68 }, 1000); 69 }, 1000); 70 } 71 })(0); 72 } catch (e) { 73 console.error('Error parsing file: ' + e.message); 74 } 75 }; 76 77 // ファイルをテキストとして読み込む 78 reader.readAsText(file); 79 }; 80 81 // ファイル選択ダイアログを開く 82 input.click(); 83 84 // メッセージフレーム2の選択を処理する関数 85 function executeBookmarklet2() { 86 var select = document.getElementsByName('custom_frame_2')[0].contentWindow.document.getElementsByTagName('select')[0]; // IDを変更 87 if (select) { 88 select.selectedIndex = 1; 89 if (typeof select.onchange === 'function') select.onchange(); 90 } 91 } 92 93 // CSVをダウンロードする関数 94 function downloadCSV(csv) { 95 var bom = "\uFEFF"; // UTF-8 BOM 96 var blob = new Blob([bom + csv], { type: 'text/csv;charset=utf-8;' }); 97 98 // IE用の処理 99 if (window.navigator.msSaveBlob) { 100 window.navigator.msSaveBlob(blob, 'data.csv'); 101 } else { 102 var link = document.createElement('a'); 103 link.href = URL.createObjectURL(blob); 104 link.setAttribute('download', 'data.csv'); 105 document.body.appendChild(link); 106 link.click(); 107 document.body.removeChild(link); 108 } 109 } 110})();

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

window.alert = function()

補足

特になし

attercop👍を押しています

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

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

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

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

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

juner

2024/12/13 05:19

`window.alert = function()` これは `window.alert = function(){}` の意味でしょうか? それともそのまま書いてエラーになったとかでしょうか?
aoiname

2024/12/13 07:28

試したコードは下記になります。 window.alert = function() {}; window.customMessages = function(messages) {}; 上記を試してもエラーなどはでないのですが、アラートが無効化されません。 customMessagesは元々の仕様で呼び出されている関数名になります。 アラートがでるブラウザの仕様としては フレーム1にある検索ボタンをクリック→フレーム2にテーブルデータを表示→0件だったらアラートがでる。仕組みになっています。
juner

2024/12/13 07:32

対象となるページの alert はブラウザ標準のものでしょうか? また、変数として宣言されたりしておりませんでしょうか? (例えば function スコープ内で var alert = window.alert; と宣言されていたりすると変更できませんので。
aoiname

2024/12/13 07:39

私が無知すぎて申し訳ないです。。 対象ページを調べたところ、window.alert となる文字は存在しませんでした。
juner

2024/12/13 08:09

例えば var alert や var hoge = alert の様な alert を取り扱う変数はありますでしょうか?(トップレベルでなければ宣言は window.alert とは別になりますので。 ※ javascript を 圧縮したりすると var a = alert の様に関数自体を短縮の為に代入したりする場合もあります。
aoiname

2024/12/13 08:22

偽名にはなりますが、下記のような作りで作成されています。 * エラーメッセージのダイアログ function customMessages(messages, customdialog, customAction, customFlag, customTarget) { ・ ・ ・ ・ ・ if (messages[i][1] != "") { if (message == "") { message = messages[i][1]; } else { message = message + "\n" + messages[i][1]; } } } if (customdialog == 0) { alert(message);
attercop

2024/12/13 09:13

フレーム内のスクリプトがalert出してる場合は、フレーム内のalertを無効化する必要があると思います。 フレーム内のドキュメント読み完了時にalertが表示されるのでしたら難易度は高そうですが。。。
otn

2024/12/16 11:10

> テーブルデータが0件の時にfunctionで関数が呼び出され ですが、これは掲載コードのどの部分のことでしょうか?
juner

2024/12/19 02:10

で、 iframe は含まれているのでしょうか?
aoiname

2024/12/20 01:30

回答が遅くなり申し訳ございません。 フレームは下記のように1.2とあり、iframeは含まれる形となっております。 フレーム1で検索ボタンを押下 フレーム2に検索結果のテーブルデータが表示されます。 <frame name="custom_frame_1" id="custom_frame_1" src="URL" marginwidth="" marginheight="" scrolling=""> <frame name="custom_frame_2" id="custom_frame_2" src="URL" marginwidth="" marginheight="" scrolling=""> また、HTML側で下記の文があり、こちらで呼び出される状況となっております。 <script language="JavaScript"> customMessage( new Array( new Array("", "アラート文言") ) ,0, '', '', '', '' ) </script>
juner

2024/12/20 03:05 編集

frame ごとにコンテキストは違うので 全ての alert を変更する必要があると思われますね。 ```js [].concat([].map.call(document.querySelectorAll('frame, iframe'), function(e) { return [e.src, e.contentWindow]} ), [[location.href, window]]) .forEach(function(e) { var window = e[1]; var url = e[0]; try { window.alert = function alert() {} console.log('success: ', url, window); } catch(e) { console.error('error: ', url, e); } }); ```
guest

回答1

0

IEでも動作する それぞれの コンテキストの window.alert を変更するコードであるなら次の様な感じでしょうか?
実際の オリジンがどういう状態かまでは知らない為、 エラー対策をしてそんな感じです。

js

1[].concat([].map.call(document.querySelectorAll('frame, iframe'), function(e) { return [e.src, e.contentWindow]} ), [[location.href, window]]) 2.forEach(function(e) { 3 var window = e[1]; 4 var url = e[0]; 5 try { 6 window.alert = function alert() {} 7 console.log('success: ', url, window); 8 } catch(e) { 9 console.error('error: ', url, e); 10 } 11});

以上。

参考資料

https://developer.mozilla.org/ja/docs/Web/API/HTMLIFrameElement/contentWindow

投稿2024/12/20 03:12

juner

総合スコア754

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問