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

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

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

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

JavaScript

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

Chrome extension

Chrome拡張機能

Q&A

解決済

2回答

5382閲覧

JavaScriptでページ遷移の無いサイトのURLの変更を検知したい

HiroshiSato

総合スコア12

Chrome

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

JavaScript

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

Chrome extension

Chrome拡張機能

0グッド

0クリップ

投稿2018/04/15 12:50

Chromeで拡張機能を作成しています。

とあるサイトでページを移動したかどうかを検知して
拡張機能側からDOMを操作したりしたいのですが、

対象のサイトはpushState、replaceStateを使ってURLを変更し、
ページ遷移をしているように見せかけているサイトなので、
ページロード時やDOM構築時のイベントハンドラを使用しても通常のページ遷移とは異なるため、イベントが発生しないタイミングがしばしばあります。

そのため、URLの変更を検知したらページ遷移とみなしてDOM操作を行おうと思いつきまして、
URLの変更を検知するイベントなどを探したのですが、自分の力では見当たりませんでした。

hashchangeが用途に似ているのですが、ハッシュを付加させたりしないと検知できないのでダメでした。
ハッシュ値以外のURL部分が変化したらイベントを発生させるようなことは実現できるのでしょうか。

毎秒location.urlを監視するというような無理やりなやり方以外でお願いしたいです。
よろしくお願いいたします。

JavaScript

1window.addEventListener("hashchange", funcRef, false);

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

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

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

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

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

HiroshiSato

2018/04/16 12:43

ありがとうございます。提示していただいたURLを確認しました。いろいろな方法があるものですね。ただDOMをいじるような方法でしたので、もう少しシンプルな方法で実現できるかと思ってました。実現できそうな感じもしますが、検知したいだけなのにDOM操作したくないので、却下です。
guest

回答2

0

ベストアンサー

Firefoxの場合はこのようなonLocationChangeを実装すれば良いようですが、
http://please-sleep.cou929.nu/20100301.html

chromeの場合はchrome.tabs.onUpdatedでイベントを拾って、
URLの差分をとって変更を検知するような仕組みはどうでしょうか。
https://developer.chrome.com/extensions/tabs#event-onUpdated

またはpushState/replaceStateでURLが変わるということは、
DOMにも何かしらの変更が発生しているということで、
DOMの変更を検知して、URLの差分→変更検知でもいいかもしれません。
https://developer.mozilla.org/ja/docs/Web/API/MutationObserver

投稿2018/04/16 02:16

編集2018/04/16 02:17
so87

総合スコア764

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

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

HiroshiSato

2018/04/16 14:19

ありがとうございます! chrome.tabs.onUpdatedは昨日、夜な夜なずっと調べていたらたまたま記事を見つけて 研究していたのですが、chrome.tabs.onUpdatedはbackground pageじゃないと使えないAPIなので メッセージ経由でcontent scriptとやり取りをしないといけないので、 複数のタブで同一ページを開く可能性のあるので、URL変更のイベントをそれぞれのタブ毎に行う複雑な処理が自分には組めそうにないので諦めました。 MutationObserverを使った方法はページ毎に変わるDOMを指定してみて試したところ、 確かにURLの変更を検知したのと同じタイミングで取れました。 本当ならURLの変更を検知できればと思っていたのですが、それに拘らずとも似たタイミングでイベントを取れる方法が見つかって良かったです。これなら簡単に実装できそうです。 他にもjavascript内のオブジェクトの変化や一見URLの変更と関係なさそうなイベントを調べていったら実質的にURLが変わったタイミングとほぼ同じというものはいくつも見つかりそうですね。さらに調べてみようと思います。 皆様ありがとうございました。
guest

0

onpopstate じゃあかんの?

投稿2018/04/15 12:58

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

HiroshiSato

2018/04/15 13:12

onpopstateはすでに検証済みで、ブラウザの戻るボタンや進むボタンなどのブラウザアクション使用時のURL変更しか検知できません。 提示していただいたドキュメントにもそのように書いてあります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問