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

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

新規登録して質問してみよう
ただいま回答率
85.36%
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回答

8159閲覧

chrome拡張機能のpopupでリンクをクリックできない!

SoraSue

総合スコア30

Chrome

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

JavaScript

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

jQuery

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

Chrome extension

Chrome拡張機能

0グッド

0クリップ

投稿2017/09/21 22:04

###前提・実現したいこと
現在、chrome拡張機能のpopupでユーザーにオススメのサイトのリンクを表示しています。しかし、リンクをクリックしてもそのリンク先に飛べません。

###発生している問題・エラーメッセージ
次のようにリンクが表示されています。

popupにリンクを表示
しかし、このリンクをクリックしても、リンク先に飛べません。

###該当のソースコード
以下がpopup.jsです。

javascript

1(function () { 2function check_sites() { 3 chrome.storage.sync.get("good_urls", function(items) { 4 urls = items.good_urls; 5 urls = urls.split(/\r\n|\r|\n/); 6 for(i=0; i<urls.length; i++){ 7 if(urls[i] != ""){ 8 var onclickValues; 9 $('.close').each(function(i, e){ 10 onclickValues += $(e).attr('onclick'); 11 }); 12 $("#best_url_up").append("<li>" + "<a class='mono_url' href=\"" + urls[i] + "\">"+ "<div class='mono_url_div'>" + urls[i] + "</div>" + "</a>" + "</li>"); 13 var linkTag = $('a.mono_url').attr('onclick', onclickValues); 14 $('div.mono_url_div').click(); 15 } 16 } 17 }); 18 19} 20check_sites(); 21}());

popup.htmlです。

html

1<script src="./background/jquery-3.2.1.min.js"></script> 2<script src="./background/popup.js"></script> 3<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 4<p>このサイトはどうですか?</p> 5<ul id="best_url_up"></ul>

###試したこと
Chrome 拡張機能開発 Jquery で挿入したタグが click() できないを参考にしてみましたが、相変わらずクリックできません。

###補足情報(言語/FW/ツール等のバージョンなど)
開発環境

  • macOS Sierra
  • python3
  • MAMP バージョン4.2

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

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

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

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

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

guest

回答2

0

コレはpopup.htmlのDOMが独立しているため動かないわけです。
contentscript側で動かす必要があります。

パーミッションにtabsを設定して下さい。

"permissions": [ "tabs", ]

popup.html側は以下のようなanchorが定義されていると仮定します。

<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>Popup</title> <link rel="stylesheet" type="text/css" href="../styles/popup.css"> </head> <body> <h1>Popup</h1> <a href="https://www.google.com">link</a> <a href="https://qiita.com">qiita</a> <script src="../scripts/popup.js"></script> </body> </html>

popup.js に以下のコードを入れます

let anchors = document.body.querySelectorAll('a'); for (let i = 0; i < anchors.length; i++) { anchors[i].onclick = () => { openAnchor(anchors[i]); }; } function openAnchor(anchor) { chrome.tabs.query({ active: true, currentWindow: true }, (tabs) => { const tabID = tabs[0].id; if (tabID === undefined) { return; } chrome.tabs.executeScript(tabID, { code: `window.location.href="${anchor.href}";` }, console.log); }); }

やっていることはlocation.hrefを設定するタブを探すのが chrome.tabs.query です。
現在開いていてかつアクティブなタブを探します。

chrome.tabs.executeScript で該当のtabに実行コードを流し込んでいます。

投稿2017/09/21 23:43

m0a

総合スコア708

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

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

SoraSue

2017/09/22 10:44

こちらの方法で解決できました!教えていただきありがとうございます!
guest

0

ベストアンサー

GoogleChrome拡張で表示するpopup.html内のAリンクは、通常のWebサイトのような感覚では使用できないはずです。新しいタブやウィンドウを開きたい場合などは、GoogleChrome拡張専用のAPIを使用するのが一般的かと思います。APIを使う以外の方法を試したことがないので、他にも方法はあるかもしれませんが、とりあえず知っている範囲で回答いたします。

popup.htmlのURLリンクをクリックしたら別のタブを開く場合は、manifest.jsonに下記のように権限設定が必要です。
https://developer.chrome.com/apps/permissions

json

1{ 2 "name": "....", 3 ... 4 "optional_permissions": ["tabs"] 5}

そしてcheck_sites()のJavaScriptを下記のようにします。

js

1chrome.storage.sync.get("good_urls", function(items) { 2 var urls = items.good_urls.split(/\r\n|\r|\n/); 3 var $bestUrlUp = $('#best_url_up'); 4 5 for(i=0; i<urls.length; i++){ 6 if(urls[i] != ""){ 7 $bestUrlUp.append('<li><a class="mono_url" href="' + urls[i] + '">'+ urls[i] + '</a></li>'); 8 } 9 } 10 11 //リンククリックで常に新しいタブを開く 12 $('#best_url_up').on('click', '.mono_url', function(e) { 13 chrome.tabs.create({url: $(e.target).attr('href')}); 14 }); 15});

ポイントとしては、クリックした時のイベントリスナーを追加して新規タブを開くchrome.tabs.create()を実行する部分です。
https://developer.chrome.com/extensions/tabs#method-create

また、イベントリスナーの追加は<a>.append()される前に実行されるので<ul>にイベント設定しておくことも重要です。イベント設定する前にappend()していても必ず<a>タグがあるとは限りませんので、イベントバブリング(イベント伝播)という仕組みを使ってイベントを設定する必要があります。
http://taneppa.net/jquery-bubbling/

GoogleChrome拡張の公式ドキュメントのサンプルは非常に参考になるのでやりたいことと似ているサンプルのコードを探してみるとよいかもしれません。
https://developer.chrome.com/extensions/samples
https://developer.chrome.com/extensions/examples/api/browserAction/set_page_color/popup.js

投稿2017/09/22 01:04

編集2017/09/22 01:08
Tomak

総合スコア1652

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

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

SoraSue

2017/09/22 10:45

回答していただきありがとうございます!新しく勉強になったことがいっぱいありました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問