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

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

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

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

解決済

javascriptのスコープについて

Sonono
Sonono

総合スコア78

JavaScript

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

1回答

0評価

0クリップ

169閲覧

投稿2022/06/18 13:48

編集2022/06/18 23:32

javascript初心者です。
以下のようなコードで、Uncaught ReferenceError: sendRequest is not definedのエラーが出てしまいます。
スコープの問題だとは思うのですが...。
2つ目のコードはchrome拡張の公式のサンプルなのですが、こちらの例えばdumpBookmarksは同じ構成に見えるので、よくわかりません。
エラーの原因と正しい書き方を教えていただけたら幸いです。

javascript

function onRun() { chrome.scripting.executeScript({ target: { tabId: tab.id }, func: getContents, }, (injectionResults) => { ... }); } function sendRequest(html_element) { ... } function getContents() { ... for (const content of Contents) { sendRequest(content) } }

javascript

// Copyright 2021 Google LLC // // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file or at // https://developers.google.com/open-source/licenses/bsd // Search the bookmarks when entering the search keyword. $('#search').change(function () { $('#bookmarks').empty(); dumpBookmarks($('#search').val()); }); // Traverse the bookmark tree, and print the folder and nodes. function dumpBookmarks(query) { var bookmarkTreeNodes = chrome.bookmarks.getTree(function (bookmarkTreeNodes) { $('#bookmarks').append(dumpTreeNodes(bookmarkTreeNodes, query)); }); } function dumpTreeNodes(bookmarkNodes, query) { var list = $('<ul>'); for (var i = 0; i < bookmarkNodes.length; i++) { list.append(dumpNode(bookmarkNodes[i], query)); } return list; } function dumpNode(bookmarkNode, query) { if (bookmarkNode.title) { if (query && !bookmarkNode.children) { if (String(bookmarkNode.title.toLowerCase()).indexOf(query.toLowerCase()) == -1) { return $('<span></span>'); } } var anchor = $('<a>'); anchor.attr('href', bookmarkNode.url); anchor.text(bookmarkNode.title); /* * When clicking on a bookmark in the extension, a new tab is fired with * the bookmark url. */ anchor.click(function () { chrome.tabs.create({ url: bookmarkNode.url }); }); var span = $('<span>'); var options = bookmarkNode.children ? $('<span>[<a href="#" id="addlink">Add</a>]</span>') : $('<span>[<a id="editlink" href="#">Edit</a> <a id="deletelink" ' + 'href="#">Delete</a>]</span>'); var edit = bookmarkNode.children ? $('<table><tr><td>Name</td><td>' + '<input id="title"></td></tr><tr><td>URL</td><td><input id="url">' + '</td></tr></table>') : $('<input>'); // Show add and edit links when hover over. span.hover(function () { span.append(options); $('#deletelink').click(function (event) { console.log(event) $('#deletedialog').empty().dialog({ autoOpen: false, closeOnEscape: true, title: 'Confirm Deletion', modal: true, show: 'slide', position: { my: "left", at: "center", of: event.target.parentElement.parentElement }, buttons: { 'Yes, Delete It!': function () { chrome.bookmarks.remove(String(bookmarkNode.id)); span.parent().remove(); $(this).dialog('destroy'); }, Cancel: function () { $(this).dialog('destroy'); } } }).dialog('open'); }); $('#addlink').click(function (event) { edit.show(); $('#adddialog').empty().append(edit).dialog({ autoOpen: false, closeOnEscape: true, title: 'Add New Bookmark', modal: true, show: 'slide', position: { my: "left", at: "center", of: event.target.parentElement.parentElement }, buttons: { 'Add': function () { edit.hide(); chrome.bookmarks.create({ parentId: bookmarkNode.id, title: $('#title').val(), url: $('#url').val() }); $('#bookmarks').empty(); $(this).dialog('destroy'); window.dumpBookmarks(); }, 'Cancel': function () { edit.hide(); $(this).dialog('destroy'); } } }).dialog('open'); }); $('#editlink').click(function (event) { edit.show(); edit.val(anchor.text()); $('#editdialog').empty().append(edit).dialog({ autoOpen: false, closeOnEscape: true, title: 'Edit Title', modal: true, show: 'fade', position: { my: "left", at: "center", of: event.target.parentElement.parentElement }, buttons: { 'Save': function () { edit.hide(); chrome.bookmarks.update(String(bookmarkNode.id), { title: edit.val() }); anchor.text(edit.val()); options.show(); $(this).dialog('destroy'); }, 'Cancel': function () { edit.hide(); $(this).dialog('destroy'); } } }).dialog('open'); }); options.fadeIn(); }, // unhover function () { options.remove(); }).append(anchor); } var li = $(bookmarkNode.title ? '<li>' : '<div>').append(span); if (bookmarkNode.children && bookmarkNode.children.length > 0) { li.append(dumpTreeNodes(bookmarkNode.children, query)); } return li; } document.addEventListener('DOMContentLoaded', function () { dumpBookmarks(); });

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

maisumakun

2022/06/18 13:57

> 以下のようなコードで sendRequestとgetContentsの両者は同じファイルに書かれたものですか?
Sonono

2022/06/18 14:04

はい、そうです! 関係ないかと思って書いていなかったので、chrome拡張のためのコードでgetContents自体はchromeのapiに渡すことで実行しています。(コード追記しました。) もし一見して問題なさそうということであれば、chrome拡張のapiの仕様?かもしれないのでもう少し調べてみようと思います(・・;)
Sonono

2022/06/18 14:18

すみません、chrome apiの書き方が足りませんでした。ありがとうございました。
ku__ra__ge

2022/06/18 14:32 編集

https://developer.chrome.com/docs/extensions/reference/scripting/#type-ScriptInjection リファレンスによるとfuncで指定した関数からは、実行コンテキストが失われるようです。 とりあえず以下のようにすればsendRequestは呼べるようになると思いますが、もっと適切な方法がある気がします……。 function getContents() { function sendRequest(html_element) {...} ... sendRequest(); ... }

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

JavaScript

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