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

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

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

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Chrome extension

Chrome拡張機能

Q&A

解決済

2回答

3845閲覧

Chrome拡張機能のContentScriptからプロンプトを自作プロンプトに置き換えたい

yuta0801

総合スコア270

Chrome

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Chrome extension

Chrome拡張機能

0グッド

1クリップ

投稿2017/04/30 04:36

###前提・実現したいこと
Google Chrome拡張機能のContentScriptから該当ページのプロンプトを自作プロンプトに置き換えたい

###試したこと
promptを関数で作って置き換えれば使ってくれると聞いたのですが以下のようにしても元のプロンプトがでてしまいます

###ソースコード

js

1function prompt(msg="",val="") { 2 $("body").append( 3 "<div id='dialog'>" 4 +"<div style='position:absolute;top:0px;left:0px;width:"+$(document).width()+"px;background-color:#000;opacity:0.5;height:"+$(document).height()+"px'></div>" 5 +"<div style='position:absolute;border-radius:6px 6px 6px 6px;left:75px;top:150px;width:500px;height:100px;background-color:#FFF;box-shadow:6px 6px 6px rgba(0,0,0,0.4);padding:10px;'>" 6 +"<p>"+msg+"</p>" 7 +"<input type='text' value='"+val+"'>" 8 +"<button id='ok'>OK</button>" 9 +"</div>" 10 +"</div>" 11 ); 12 $("div#dialog button#ok").click(function() { 13 var val = $("div#dialog input").val(); 14 if (val) { 15 $("div#dialog").remove(); 16 return val 17 }else{ 18 $("div#dialog>div:eq(1)").append("<p>入力してください</p>") 19 } 20 }) 21}

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

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

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

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

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

guest

回答2

0

ベストアンサー

teratail のみ変える例です

manifest.json にこれを追加します

"content_scripts": [ { "matches": ["https://teratail.com/*"], "js": ["content_script.js"], "run_at" :"document_end" } ], "web_accessible_resources": [ "script.js" ]

[content_script.js]

javascript

1insertScript({src: "https://code.jquery.com/jquery-3.2.1.min.js"}) 2insertScript({src: chrome.runtime.getURL("script.js")}) 3 4function insertScript({src, innerHTML}){ 5 const script_elem = document.createElement("script") 6 script_elem.async = false 7 if(src){ 8 script_elem.src = src 9 }else if(innerHTML){ 10 script_elem.innerHTML = innerHTML 11 } 12 document.head.append(script_elem) 13}

[script.js]

javascript

1!function($){ 2 3 window.prompt = function(){ 4 console.log("prompt が呼ばれました", $.fn.jquery) 5 } 6 7}($.noConflict(true))

jQuery はすぐに noConflict することで元のページで使ってる jQuery があった場合にバージョンが変わっておかしなことにならないようにしています

元のプロンプトがでる理由はすでにある回答にあるように、content_script を実行する空間とページ内の JavaScript が実行する空間が違うからページ内の prompt は置き換えられてないからです

投稿2017/04/30 12:22

編集2017/04/30 12:26
ryls-nmm

総合スコア633

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

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

0

確かに window.prompt を自作の関数で置き換えればよいので、該当ページ上で直接ご呈示のコードを実行すれば、目的は達成できるかと思います。

ただし、 Google Chrome 拡張機能の Content Script から実行する場合、同じ方法で直接 window.prompt を置き換えることはできません。なぜなら、名前空間の汚染やセキュリティ上の欠陥となることを避けるため、全ての Content Script は "isolated world" と呼ばれる 該当ページから隔離された JavaScript コンテキスト上 で動作しており、該当ページの JavaScript 変数などに直接アクセスすることが不可能になっているからです。

参考: Content Scripts - Execution environment

ではどうするかというと、 Content Script から該当ページへのアクセスが許されているのは DOM 操作だけなので、ご呈示のコードに次のような行を追加し、 <script>要素として DOM 的に該当ページへと差し込んでやれば良いのではないでしょうか。

javascript

1var s = document.createElement('script') 2s.textContent = prompt.toString(); 3document.body.appendChild(s);

尚、代替 prompt() 実装の中で jQuery が使用されているようですが、もしも該当ページ自体に jQuery が読み込まれていない場合、 (仮に Content Script の 1 つとして拡張機能自身に持たせたとしても) 上記と同様の理由で jQuery が使用できず動作しないと思います。同じようにして <script> 要素を別途追加してあげてください。

投稿2017/04/30 06:59

argparse

総合スコア1017

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問