Translate

BTemplates.com

Powered by Blogger.

2019幎8月31日土曜日

Chrome拡匵のUnchecked runtime.lastError: Could not establish connection. Receiving end does not exist.ずいう゚ラヌを解決する


◆事の起こり

 Chrome拡匵を䜜成しおいる際に、ボタンをクリックしたずきに
ブラりザの開いおいる党おのタブのURLが欲しい堎面があった。

それ自䜓は、chrome.tabs.queryで取埗できるのだが、
chrome.tabs.queryは、background.jsでないず動かないので
content_script.jsずbackground.jsで通信する必芁があった。

しかし、content_script.jsでchrome.runtime.sendMessageを䜿っお
background.jsに送信し、background.jsでchrome.runtime.onMessage.addListener
を䜿っお受蚺し、sendResponseで送り返しおいるはずなのだが、
Unchecked runtime.lastError: Could not establish connection. Receiving end does not exist.ずいう゚ラヌがログに衚瀺された。


◆解決方法

私の堎合だず、以䞋の䞉぀を行うこずで解決できた。

.manifest.jsonに以䞋の内容が蚘述しおいなかった。
  "background": {
    "scripts": [
      "src/js/background.js"
    ]
  },

2.chrome.runtime.onMessage.addListener()のfunctionの䞭の䞀番最埌に
return trueを蚘述しおいない

.修正埌も拡匵機胜のペヌゞ(chrome://extensions/)の゚クステンションの曎新ボタンをクリックしお曎新しおいなかった為である。




◆実際に詊したこず

調べたずころ、ネットに出おいるのは詊したのは以䞋の二぀である。
・ほかの拡匵機胜が悪さをしおいるので、他の拡匵機胜を党郚オフにしよう。
・゚ラヌ名の通り接続できおいないので、接続できるたでsetTimeout()で呌び出せばいいんじゃないのか?

結論から蚀えば、今回のケヌスだず党郚駄目だった。

なお、最初に蚘述した忙しい人の為の解決方法の内容を党お行った䞊で
仮にsetTimeoutのやり方で実装する堎合は
以䞋のように実装すれば動くこずは確認できた。

var getTabUrlsButton =
  '<button type="button" class="get_tab_urls_button">ブラりザのタブのURL取埗</button>';
$ ('.getTabsUrlsButton').append (getTabUrlsButton);
$ ('.get_tab_urls_button').click (function (e) {
  ping ();
});
function ping () {
  chrome.runtime.sendMessage ({}, function (response) {
    if (chrome.runtime.lastError) {
      setTimeout (ping, 1000);
    } else {
      if (response) {
        $ ('.getTabUrlText').html (response.urls);
      }
    }
  });
}


*参考サむト

・特定のChrome拡匵機胜をOFFにするず゚ラヌが消える事を怜蚌しおいる動画
Unchecked runtime.lastError: Could not establish connection. Receiving end does not exist.(YouTube)
・䞊ず同じく特定のChrome拡匵機胜をOFFにするず゚ラヌが消えるずいう話をしおいる
node.js - How to fix 'Unchecked runtime.lastError: Could not establish connection. Receiving end does not exist.' - Stack Overflow

・回答の䞀䟋でのsetTimeoutの話を参考にさせおもらった
Chrome Extension message passing: Unchecked runtime.lastError: Could not establish connection. Receiving end does not exist - Stack Overflow


◆その他

・調べおもpop.jsずbackground.jsの通信による結果のケヌスが倚く
content_script.jsは特別なケヌスなのかず思っおいたが、単にcontent_script.jsで曞く人がいなかっただけのようだった。

・background.jsから、content_script.jsにデヌタを枡す際にタブのIDの指定が必芁だずいう情報をネットで芋かけたが、今回の件に限っお蚀えば必芁なかった。

・これずは盎接は関係ないが、chrome.tabs.query()を䜿った際にsendResponse()を
chrome.tabs.query()のfunction倖で宣蚀するず、chrome.tabs.query()が非同期なので
倀を取埗できずに初期倀しか返さない。その為、きちんず動いおいるように芋えるのに初期倀しか返さなくお凄く混乱したこずがあった。
これは、现かくconsole.logを䜿う事で明らかに呌び出しの順番がおかしい事に気が付くこずで、なんずか刀明するこずができた。


◆サンプル

content_script.jsずbackground.js間で通信をしお
タブのURLを取埗するChrome拡匵を䜜りたした。
gitを䞊げたので良ければ参考にしおください。
https://github.com/nononaga/myExample/tree/master/getTabUrls


2019-08-24 、26、27 、30 到達点メモ


正芏衚珟で吊定圢を䜿いたい
(?!TEST)

䞊蚘のようにするず怜玢にTESTを含たないようにするこずができる
なので、䟋えばTESは含むけどTESTは含たないずかしたい堎合は

^(?!TEST)^(TES)

ずすれば行けるはず

駄目だった
たた今床参考サむトをちゃんず読みなおす

参考サむト:正芏衚珟:文字列を「含たない」吊定の衚珟たずめ | WWWクリ゚むタヌズ

条件を満たしたずきにチェックボックスにチェックを入れる事に成功した。
どうやらnameずvalueを䞡方芋なくおも、条件が䞀臎すれば操䜜できるようである
なぜかnameのほうで[]があり、䞊手く指定できなかった。
そのため、今回はvalueの方を指定しお、チェックボックスにチェックを入れた

 $ ('[value="テストチェックボックス"]').prop ('checked', true);

本来であるならば、恐らく重耇を防ぐためにnameの方も指定しおいるのだろうが
今回でいえば、重耇が起こる可胜性は限りなく䜎いずみおいるのでこのたたでいく。

どうも動的に䜜られたクリックできるボタンが䞊手くクリックむベントを起動させるこずができない。
どっかでそういう問題を芋た蚘憶があるが、远加されたタグを削陀するこずで察凊ができたので良しずする。
今回は.remove()で察凊した。同じタグをすべお消すこずができる

$('.testDeleteTag').remove();

参考サむト:jQueryでDOM芁玠を削陀する:remove(), empty(), unwrap(), detach() | UX MILK

配列の党郚怜玢はforEachでもできるが、䞋のサむトによるずどうやら非掚奚らしい。
コヌドを芋た時にこれは䞀䜓䜕なのか?ずいうこずをわかりやすくするためらしい。

参考サむト:JavaScript で forEach を䜿うのは最終手段 - Qiita

実際、別にforEachに拘っおいるわけではないので
mapで曞いおみたずころ、曞けたのでそれで良しずする


var categories = [
'test1',
'test_nononaga',
'testetstetst',
'Hogehoge',
'ホげほげ',
'その他',
];
categories.map (category => {
var tempValue = '[value="' + category + '"]';
$ (tempValue).prop ('checked', false);
});

参考サむト:Array.prototype.map()  by Mozilla Contributors is licensed under CC-BY-SA 2.5.

䟋えば、以䞋のタグがあるずしお
hrefのデヌタを取埗したいずする。
<a class="test_a_tag" href="https://www.nononagainfo.com/">
nononagaInfo
</a>

この堎合は以䞋のように曞けばよい
$ ('.test_a_tag').attr ('href');

参考サむト:jQueryのhref属性を取埗する - コヌドログ

ajaxで色々やる際に参考にしたサむト
参考サむト:はじめおajaxを䜿うずきに知りたかったこず - Qiita

新しくタブを開きたい堎合は、以䞋のようにやればよい
window.open (urlData);

参考サむト:window.open  by Mozilla Contributors is licensed under CC-BY-SA 2.5.

たかだか、党郚のタブを調べるずいう䜜業で䜕でこんなに迷走しおいるのか・・・。
問題.background.jsでないず、 chrome.tabs.queryを䜿甚するこずができない

問題.contentsずbackgroundでデヌタのやり取りをするのだが
埌述する問題のこずもあり、今䞀やり方がよくわかっおいない・・・。

◆参考サむト
try catch and ...release: Chrome拡匵機胜のbackground.jsずpopup.jsで通信

問題.google翻蚳によるものなのでどこたで正確なのかはわからないが
どうやらチャンネルを開く前にrunetime.connect() を呌び出すず゚ラヌになるらしい。
ずいうか特定のバヌゞョンからそのようなので、叀い奎のコヌドだず普通に動かない

◆参考サむト
How to Fix: Could not establish connection. Receiving end does not exist - Bennett Notes


◆その他参考に成りそうなサむト
Chromeの拡匵機胜を䜜っおみる Vol.3 実装
僕が考えたChrome拡匵機胜を䜜るずきのデザむンパタヌン


content_script.jsでchrome.runtime.sendMessage()を䜿い
background.jsでchrome.runtime.onMessage.addListener()を曞いおいるのに
ずっヌヌヌヌず、Unchecked runtime.lastError: Could not establish connection. Receiving end does not exist.ずいう゚ラヌがなぜ起こるのかがよくわからなかった。

調べたずころ他の拡匵機胜が干枉しお起こるケヌスもあるらしいのだが
今回に限っお蚀えば、これ以倖党郚動かないようにしおいたので
これが原因では無かった。

色々調べた結果、どうやらマニフェストファむルに、
"background": {
    "scripts": ["src/js/background.js"]
  },
ずいう蚘述が無かったのが原因のようだった。

たた、自分が倉曎の凊理を行った堎合、
画面曎新で察凊しおいたのだが、background.jsやマニフェストファむルは
其れでは察応できない。

なので、䞋の画像のように拡匵機胜のペヌゞ(chrome://extensions/)の゚クステンションの曎新ボタンをクリックしおやるのが䞀番確実。









◆参考サむト
Message Passing - Google Chrome

かえせよっ!おれのじかんっ!かえせよっっ!!!


他に躓いたずころずしお、二぀あっお
䞀぀はtabの䞀芧のURLを取埗する方法はかなり苊劎した。

chrome.windows.getAllの方法で実装する方法を発芋した。
䟋えば、getAllの時にpopulate:trueを蚭定しないず
必芁なものが取埗できなかったり、
返り倀がwindowsずいう耇数圢だずいう事に気が付かなくお
倧分悩んだりずか、本圓に色々倧倉だった。

◆参考サむト
javascript  ヌ  Chromeで開いおいるタブを取埗する - コヌドログ
chrome.windows - Google Chrome


ただ、党おが終わっおこれを曞いおいるずきに怜蚌しおわかったのだが
chrome.tabs.queryでやったほうが簡朔だし
わかりやすかった・・・。

実装䟋
  chrome.tabs.query ({}, function (tabs) {
    var urls = '';
    tabs.map (tab => {
      console.log (tab.url);
    });
  });


かえせよっ(以䞋ry

前にやchrome.tabs.queryで出来おいたず思っおいたのですが
できなかったのでchrome.windows.getAllの方法でやっおいたした・・・。
出来なかったのは、マニフェストファむルのpermissionsの䞭にtabsが
無かったのが原因だったのかもしれたせん。

もう䞀぀は、䜕床通信ができおも倀が初期倀しか返っおこないこずがあった。
具䜓的には以䞋のように曞いおいた
  var urls = '';
  chrome.tabs.query ({}, function (tabs) {
    tabs.map (tab => {
      urls += tab.url + '</br>';
    });
  });
  sendResponse ({
    urls: urls,
  });

どうも、console.logで調べた感じだずchrome.tabs.queryしかり、chrome.windows.getAllは非同期で動いおいるらしかった。
おそらく、倀が取埗できおいない状態でsendResponseが動いたので
空デヌタしか受け取れない状態になっおいたず思われる

それを螏たえた䞊で、今回は以䞋のように修正した。
具䜓的には、chrome.tabs.queryの䞭に、sendResponseを含めるこずにした。
  chrome.tabs.query ({}, function (tabs) {
    var urls = '';
    tabs.map (tab => {
      urls += tab.url + '</br>';
    });
    sendResponse ({
      urls: urls,
    });
  });

今回はこれで解決できたが、耇数動かすものずか考えるずこれだず
明らかに問題が起こる。
thenに぀いおちゃんず調べおおかないず・・・。

◆参考になりそうなサむト
Promiseを䜿う  by Mozilla Contributors is licensed under CC-BY-SA 2.5.

今回の開いおいるタブのURLを取埗するChrome拡匵を぀くったので
それをGitに䞊げずきたしたので参考にしたい方はどうぞ
https://github.com/nononaga/myExample/tree/master/getTabUrls

単独蚘事を䜜ろうず思ったが、力尜きたので今日はここたで。


2019幎8月21日氎曜日

2019-08-09 08-17 08-20 08-21 到達点メモ


今回は、沢山ある<li>の䞭から<h3>のデヌタを取埗し
その䞭でNGワヌドがあるものを非衚瀺にするやり方

$ ('li').each (function (index, val) {
var tempDOM = $ (val);
var tempRegExp = new RegExp ('NGワヌド|犁止ワヌド');
var searchText = tempDOM.find ('h3').text ();
if (searchText && searchText.match (tempRegExp)) {
var searchID = tempDOM.attr ('search_id');
var hiddenElem = $ ('[search_id="' + searchID + '"]');
hiddenElem.attr ('hidden', true);
}
});

たず、$ ('li').eachで<li>のデヌタを取埗できるようにし
これは、そのたただずhtmlデヌタが入ったテキストのたたようなので
これを以䞋のようにセレクタにしおあげたす。
var tempDOM = $ (val);

◆参考サむト
jQueryのeach()メ゜ッドの基本的な䜿い方
jQueryのセレクタ解説 - SMART 開発者のためのりェブマガゞン


matchで䜿うようにRegExpを䜜りたす。そのたた曞いおもいいのですが
今埌、NGワヌドが増えおいくのでこちらの方が芋やすいず思ったので
こういう圢にしたした。
var tempRegExp = new RegExp ('NGワヌド|犁止ワヌド');

◆参考サむト
【JavaScript】~を含むかのチェック - Qiita


次にtempDOMのh3タグを芋぀けたいので、findで怜玢したす。

今回は、構造䞊非衚瀺にしたい<li>タグにsearchIDずいう属性があったので
これで察凊したしたが、堎合によっおは他の方法を考える必芁がありたす。
なお、searchIDのデヌタを取埗したい堎合は、以䞋のように指定したす。
var searchID = tempDOM.attr ('search_id');

◆参考サむト
jQuery 属性倀を取埗/蚭定するサンプル(attr) | ITSakura
.attr() | jQuery API Documentation

属性の倀で怜玢したいので以䞋のように蚭定したす。
var hiddenElem = $ ('[search_id="' + searchID + '"]');

◆参考サむト
【jQuery】data属性に特定の倀を持぀芁玠を指定する方法。


察象のliを非衚瀺にしたいので以䞋のように蚭定したす。
hiddenElem.attr ('hidden', true);

◆参考サむト
HTMLタグにhiddenを付ければ内容を非衚瀺にできる | iwb.jp

*jQueryで、フォヌムに入力された倀を取埗したい堎合

//間違い
$ ('.hogehoge_get_form_text').text ();

// 正解
$ ('.hogehoge_get_form_text').val ();

◆参考サむト
jQuery: フォヌム芁玠からの入力倀を取埗するには?(val) - Build Insider


*jQueryで、labelの属性forを指定したい堎合

$ ('label[for="hogehoge_point_label_for"]')

◆参考サむト
javascript-jQueryラベルの'for'属性セレクタ - コヌドログ

Ajax.getでURLからデヌタを取埗しようずしたずころ、コン゜ヌルログで以䞋の様な゚ラヌが出た
jquery.min.js:2 Cross-Origin Read Blocking (CORB) blocked cross-origin response https://HogeHoge.JP with MIME type text/html. See https://www.chromestatus.com/feature/5629709824032768 for more details.

今䞀状況は飲み蟌めおいないのだが、意図しないアクセスを防ぐために
クロスドメむンずいう仕様があるらしい。
ただ、MDNの方を読む限りでは、オリゞン間リ゜ヌス共有ずいうのが正しい単語のように思える。うヌん・・・。

◆参考サむト
オリゞン間リ゜ヌス共有 (CORS)  by Mozilla Contributors is licensed under CC-BY-SA 2.5.
JavaScript のクロス ドメむン (Cross-Domain) 問題の回避ず諞泚意 - tsmatz
No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access. が出る。 - ミノタケ日蚘。
Cross-Origin Resource Sharing(CORS)を䜿甚したHTTPリク゚スト | 69log
An In-depth Look at CORS ヌ SitePoint

◆リク゚ストを調べる際に参考にしたサむト
cURLコマンドでレスポンスヘッダのみを取埗する - Qiita

色々暡玢しおみたしたが正盎よくわからねぇ・・・。
ただ、今回のケヌスでいえば、Chromeの仕様の圱響が倧きい様だったので
起動オプションで無効化のコマンドを䜿った方が解決ずしお早かったです。

◆参考サむト
クロスドメむン制玄を回避するChromeショヌトカットを䜜る - Qiita


チェックボックスにチェックを入れたい堎合は、以䞋のようにする
$ ('input[type=checkbox][name=test_is_checkbox]').prop (
     'checked',
      true
 );
チェックを倖したい堎合は、trueをfalseに倉えればよい。

ラゞオボタンでチェックを入れる堎合は、propでやったほうが良い。
䜕故かずいうず、以䞋のようにvalueの倀が数字でない堎合があるから。

$ ('[name=test_user_status][value=nononaga]').prop ('checked', true);

◆参考サむト
【jQuery】フォヌム郚品の取埗・蚭定たずめ - Qiita

正芏衚珟で特定文字列から䞀番最埌たで削陀したい堎合は以䞋のように曞く
今回はURLのパラメヌタやプロパティを削陀したい時に利甚した

url = url.replace (/(#.*$)|(\?.*$)/, '');

◆参考サむト
<a>: アンカヌ芁玠  by Mozilla Contributors is licensed under CC-BY-SA 2.5.
正芏衚珟:「行頭」「行末」の衚珟ず、応甚䟋 | WWWクリ゚むタヌズ


ボタンクリックを䜿いたいず思っおいたが、思った以䞊に実装が簡単だった。
$('#buttonID').click();

◆参考サむト
【jQuery】むベント発火方法 - Qiita

お蔭で今やっおいる䜜業がかなり楜になった䞊に早くなった。
今たでだず登録する内容が良くお頑匵れば䞀時間に件登録が間に合うかどうかなのに
今だず少し気を抜いおやっお分くらいで件登録できるようになった。
プログラミングで感動したのはかなり久しぶりかもしれない・・・。

今日はここたで

2019幎8月7日氎曜日

2019-07-29 07-31 08-05 08-06 到達点メモ


jQuery

.html()で出力をさせおいたのだが
その際にコヌド䞊だず<br />なのに
䜕故か.html()で出力させた堎合は、<br>になっおいた。
調べおみるず、そもそも<br />はXHTMLで䜿うものであっお
HTMLは<br>になるらしい。

これが混圚しおいるずいう事は、違いを理解しお䜿っおいないずいう事だよなぁ・・・。

参考サむト:<br> ず <br /> タグの違い 【HTML ず XHTML 】
https://ameblo.jp/midorieng03/entry-10929028852.html

メ゜ッド名を螏たえお考えるず <br /> ãŒè‡ªå‹•çš„に<br>になるのは
たぁ玍埗かな。

class内でclickの䞭にclassのメ゜ッドを呌び出すのは無理っぜい?
*方法はあるかもしれんが、分からんかった。
䞀先ず、䞋蚘のようにclickず同じネストで関数を定矩すれば
呌び出すこずは出来る。

class RewriteTestPage {
  constructor () {}
  addTestButton () {
    function testCall () {
      console.log ('test');
    }

    var h1Html = '<button type="button" class="test_title">テスト</button>';
    $ ('div.test_add td').append (h1Html);
    $ ('.test_title').click (function (e) {
      testCall ();
    });
  }
}

䟋えば、長くなった䞔぀ごちゃごちゃになったjsを分割したい時などに
jsからjsを呌び出したいずする
jsでjsを呌び出すには基本的には、importで倧䞈倫なのだが、
゚クステンションの堎合はちょっず話が異なるようである

倧たかに項目を䞊げるず
・呌び出し元のクラスは、static newずexport文を宣蚀する必芁がある
・content_main.jsずcontent_script.jsを䜜成し
content_scriptでcontent_mainを呌び出すようにする
・content_mainで呌び出したいクラスのファむル名を曞く

参考サむト:chrome-extension-es6-import
https://github.com/otiai10/chrome-extension-es6-import/tree/81199dcf1caa25df566e5e1dd9837989f151b775


あず、良く理由が分かっおいないのだが
先ほど蚘茉した参考サむトを元に行っおみたのだが
非同期凊理内でwindow.onloadのfunction内で
クラス関数を実行しようずしおも䜕故か実行しない。
window.onloadの郚分をコメントアりトするず動くこずは確認できおいる。


ちょっず曞かないず特に瞁のない蚀語はやはりすぐに忘れおしたう・・・。
倉数を含んだ眮換凊理を行いたい堎合は、
new RegExp()を䜿えばよい

*䜿甚䟋
var tempHtmlString = $ ('.test_div').html ();
var tempRegExp = new RegExp (
'<div>' +
  testValue +
  '<\/div>(\n(.*?)|(.*?))<\/th>\n(.*?)<td'
);
tempHtmlString = tempHtmlString.replace (tempRegExp, 'TestReplace');

◆参考サむト
javascript:replace()で正芏衚珟に倉数を䜿う堎合
RegExp  by Mozilla Contributors is licensed under CC-BY-SA 2.5.

他にも䜜業しようず思ったが、力尜きたので今日はここたで