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

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

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

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

jQuery

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

Q&A

2回答

3845閲覧

JavaScriptでプロパティ変更をインターセプトする方法

Clor

総合スコア883

JavaScript

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

jQuery

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

1グッド

1クリップ

投稿2015/12/09 08:34

JavaScriptにてプロパティ変更をインターセプトし、独自メソッドで処理する方法を探しています。

具体的には location.href で画面遷移する処理を無効化したり、独自の処理を差し込みたいと考えています。

<div onclick="buttonClicked();">ボタン</div> <script> function buttonClicked() { // ↓でhttp://abc.com/に遷移させず、URLに関わらず全てhttp://xyz.com/に遷移させたり、キャンセルさせたりしたい。 location.href = "http://abc.com/"; } </script>

上記だけであればbuttonClicked()の中のURLを修正すれば済む話なのですが、location.hrefで遷移する箇所が非常に多いプロジェクトのため、location.hrefの変更をインターセプトしてURL変更処理を挟んだり、キャンセルさせたりできないかなぁと試行錯誤している次第です。

ちなみに<a>タグによるリンクは以下のような感じでclickイベントをインターセプトしています。

$("a").on("click", function() { // 無効化 });
tozjp👍を押しています

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

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

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

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

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

guest

回答2

0

ヒントになればと書きますが、お望みの挙動を完璧に実現できていません。

ちなみに比較的新しいブラウザ向けなのでご注意ください。Object.create のサポートが必要なので、 IE8 以下などが対象外となります。

javascript

1var alt_location = (function(nativeLocation){ 2 return Object.create(nativeLocation, { 3 href: { 4 set: function(href) { 5 console.log("alt_location.href is changed to " + href); 6 }, 7 get: function() { 8 return nativeLocation.href; 9 } 10 } 11 }); 12})(location); 13 14console.log(alt_location.href);// 参照の挙動は変更なし 15 16alt_location.href = "the_url";// setter に処理が移譲され、遷移はせず console.log("alt_location.href is changed to the url") を実行

ちょっと挑戦しましたが、window.location という名前のままの置き換えは実現できませんでした。

例えば、上記の alt_location オブジェクトをあるスコープでのみ location として扱う工夫はありかもしれません。

javascript

1location.href = "the_url";// この挙動は頑張ったけど変更する方法は思いつきませんでした。 2 3alt_location.href = "the_url";// 別名でなら実現できます。 4 5!function(location){ 6 location.href = "the_url";// この関数内なら location.href で大丈夫です。 7}(alt_location); 8 9with({location: alt_location}){ 10 location.href = "the_url";// この with ブロック内も location.href で大丈夫です。 11} 12// (まぁ with はあまり褒められた方法ではないですが)

ということで僕から提案できるのは、名前を変えるか、囲むかです。

投稿2015/12/12 13:03

tozjp

総合スコア790

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

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

0

ES6が使える環境ならばProxyがまさにその動作をできます。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Proxy
ただ、習得は難しいです

投稿2015/12/09 08:54

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問