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

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

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

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

Q&A

解決済

2回答

4662閲覧

イメージマップを使ったリンクでのクリック動作について

tokotokotoko

総合スコア14

jQuery

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

0グッド

0クリップ

投稿2018/10/12 09:14

前提・実現したいこと

ご覧頂きありがとうございます。
初歩的なことかもしれませんがつまづいてしまい、お力を貸してください。

htmlの静的なページへ都道府県の画像を設置しています。
イメージマップを使用して都道府県にマウスオーバーすると色が変わるようしています。
さらに、都道府県をクリックしたら各都道府県のページへ遷移します。

スマートフォン実機で見た際、
地図をクリックした時に、ページ遷移の前に地図に色をつけたいです。

発生している問題・エラーメッセージ

Windows/MacおよびPCでのエミュレーターでは希望どおり動作しますが、
スマートフォン実機(iPhone)にて、
現状では地図をクリックすると都道府県の色は変わらないまま、ページ遷移のみします。

該当のソースコード

HTML

1<img src="japan.png" usemap="#Map"> 2<map name="Map"> 3<area shape="rect" coords="0,10,20,30" href="tokyo.html" class="map-tokyo"> 4</map>

jQuery

1$(".map-tokyo").hover(function() { 2 $(".change-map").attr("src","japan-tokyo.png"); 3 $(this).toggleClass('active'); 4},function() { 5 $(".change-map").attr("src","japan.png"); 6 $(this).toggleClass('active'); 7});

試したこと

jQuery

1$(document).on({ 2 mouseenter: function() { 3 $(".change-map").attr("src","japan-tokyo.png"); 4 $(this).toggleClass('active'); 5 }, 6 mouseleave: function() { 7 $(".change-map").attr("src","japan.png"); 8 $(this).toggleClass('active'); 9 }, 10 click: function() { 11 $.when( 12 $(".change-map").attr("src","japan-tokyo.png"), 13 $(this).toggleClass('active') 14 ).done(function(){ 15 window.location.href = 'index.html'; 16 }); 17 } 18}, '.map-tokyo');

読み込んでから実行する(when/done)を利用してみましたが、
この場合ページ遷移はしますが都道府県の色は変わりませんでした。

よろしくお願い致します。

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

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

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

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

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

yambejp

2018/10/12 09:32

ページが遷移するなら、色が変わるかどうかはわからないのでは?
tokotokotoko

2018/10/12 09:34

ありがとうございます!遷移をするタイムラグの間に色を変えたいと思っているのですが・・そもそも不可能な要望でしょうか。イメージマップの場合リンクが隣り合っているので、遷移前の一瞬で色がアクティブになったほうがわかりやすいと思いました。
guest

回答2

0

miyabi_takatsuk様よりいただいたコードではhrefがundifineになってしまいましたので、
その箇所のみ、

var nextLocation = $(el).attr('href');

となっているところを、

var target = el.target;
var nextLocation = $(target).attr('href');

こう修正をして対応完了いたしました。
ありがとうございました!

投稿2018/10/13 09:15

tokotokotoko

総合スコア14

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

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

miyabi_takatsuk

2018/10/14 23:24

動作検証をしておらず、大変に失礼しました・・・。 もしかして、area要素の場合、 .targetが必要なのか!と逆に勉強になりました。 今後、自身のコードを過信せずに、しっかり検証して参ります。
guest

0

ベストアンサー

スマホの場合、hoverアクションはありません。
タップかドラッグか、ダブルタップとか、
PCでいう、クリック以降のアクションしかないのです。

なので、タップ時に、ページ遷移を遅延させるのが一番有効かと思います。
クリックした時に、一旦リンクを無効にする処理を追加します。
(PCとはイベントの設定が変わるので、JSを分けるないし、デバイス判別して処理を変えるしかありませんが、ここでは、スマホでの処理方法にとどめます)

html

1<!-- imgとmapにIDを付与しました。 --> 2<img src="japan.png" usemap="#Map" id="mapImage"> 3<map name="Map" id="Map"> 4<area shape="rect" coords="0,10,20,30" href="tokyo.html" class="map-tokyo"> 5</map>

javascript

1$(function(){ 2 3$('#Map > area').click(function(el){ 4 // areaのhrefを取得しておく 5 var nextLocation = $(el).attr('href'); 6 7 // 画像が新しくなり、読み込みが完了した際に実行する関数を定義 8 $('#mapImage')[0].onload = function(){ 9 // 画像が適用され、読み込まれたら実行する 10 setTimeout(function(){ 11 // 少しの間だけ、画像を表示させるために、遅延 12 window.location.href = nextLocation; 13 }, 500); 14 }; 15 16 $('#mapImage')[0].src = 'japan-tokyo.png'; 17 18 // クリックイベント関数のブロックの最後にreturn falseを実行することによって、ページ遷移処理を無効にできる。 19 return false; 20}); 21 22 23});

もし上記でうまくいかない場合は、あまり推奨されないですが、下記のように、hrefに、何も実行しないという関数を実行させるのもありです。

html

1<!-- areaのhrefを変更、替わりにdata-hrefにリンク先を記述 --> 2<img src="japan.png" usemap="#Map" id="mapImage"> 3<map name="Map" id="Map"> 4<area shape="rect" coords="0,10,20,30" href="javascript: void(0);" data-href="tokyo.html" class="map-tokyo"> 5</map>

javascript

1$(function(){ 2 3$('#Map > area').click(function(el){ 4 // hrefではなく、data-hrefにリンク先を書いたので、それを取得しておく 5 var nextLocation = $(el).attr('data-href'); 6 7 // 画像が新しくなり、読み込みが完了した際に実行する関数を定義 8 $('#mapImage')[0].onload = function(){ 9 // 画像が適用され、読み込まれたら実行する 10 setTimeout(function(){ 11 // 少しの間だけ、画像を表示させるために、遅延 12 window.location.href = nextLocation; 13 }, 500); 14 }; 15 16 $('#mapImage')[0].src = 'japan-tokyo.png'; 17 18 // hrefには、無効処理をすでに入れているので、return falseは不要 19 // return false; 20}); 21 22 23});

投稿2018/10/12 18:44

miyabi_takatsuk

総合スコア9528

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

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

tokotokotoko

2018/10/13 00:10

はじめまして、丁寧なご解説、ありがとうございます。 さっそく試してみたところ、動作は希望のとおり、スマホで見ると地図に色がつきましたが、遷移先が「undefined」になってしまいました。 また、神奈川、千葉と増やしていったときに$('#mapImage')[0]の二箇所を複製してみたところ、遷移先はhrefに入れたものと同じになったのですが、今度は地図に色がつきませんでした。 しかし、いただいたコードであと少しのところまで来た気がします、ありがとうございます! 一度自分の方でも作業を進めてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問