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

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

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

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

jQuery

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

Chrome extension

Chrome拡張機能

Q&A

1回答

4182閲覧

JavaScriptのコールバック関数が呼ばれない

Zousan

総合スコア29

JavaScript

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

jQuery

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

Chrome extension

Chrome拡張機能

0グッド

1クリップ

投稿2015/11/28 02:06

Chrome extensionでpopuup.jsからbackground.jssendMessage()関数を呼び出して、更にbackground.jsにてcontent scriptからDOMの要素を取得して、その値を使ってAjaxを行ったあとに、popup.jsのコールバック関数を呼びましたが、Ajaxでデータを取ってくるところまではできますが、その後にpopup.jsのコールバック関数を呼び出しても、データが渡りません。なぜでしょうか。下記にpopup.jsと、background.jsを示します。

popup.js

$(document).ready(function(){ $('#submit').click(function(){ console.log("cliecked"); chrome.runtime.sendMessage({ command: "get_text" }, function(response){ ここで表示されるはずだが表示されない console.log(response); }); }); });

background.js

chrome.runtime.onMessage.addListener(function(message, sender, sendResponse) { chrome.tabs.query({active: true, windowId: chrome.windows.WINDOW_ID_CURRENT}, function(result){ chrome.tabs.sendMessage(result.shift().id, { command: "get_dom" }, function(msg) { console.log("result message:", msg); $.ajax({ type:"POST", url:"http://localhost:3000", data: JSON.stringify({ text: msg }), dataType: "json", contentType:"application/json; charset=UTF-8", crossDomain: true, success: function(data){ console.log(data); //コールバック関数呼び出し sendResponse(data); } }) }); }); });

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

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

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

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

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

guest

回答1

0

This function becomes invalid when the event listener returns, unless you return true from the event listener to indicate you wish to send a response asynchronously (this will keep the message channel open to the other end until sendResponse is called).

chrome.runtime - Google Chrome
ということみたいです。イベントリスナが値を返した時点で、sendResponseが無効になってしまっているのでは。

投稿2015/11/28 02:56

Lhankor_Mhy

総合スコア36115

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

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

Zousan

2015/11/28 09:04 編集

回答ありがとうございます。イベントリスナが値を返している場所がどこかわかりません。その場所を教えて頂けますか。 イベントリスナが値を返す場所が `sendResponse` ではないのでしょうか
Lhankor_Mhy

2015/11/28 09:26

> 値を返している場所がどこかわかりません returnで明示的に返してないので、undefinedが返っています。 > イベントリスナが値を返す場所が `sendResponse` ではないのでしょうか そうではないです。イベントリスナの処理が終わったあとに非同期でAjaxが処理されますので、コールバック関数が動作するのはイベントリスナが値を返し終わった後です。
Lhankor_Mhy

2015/11/28 10:59 編集

たとえば、これは↓ `function hoge(){ ` $.get('hoge.html',function(){ ` alert('callback'); ` }); `} `alert(hoge()); undefined 'callback' の順番でアラートが表示されます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問