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

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

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

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

jQuery

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

3615閲覧

JSまたはjQueryでモバイル判定し、デバイスによってリンク先を変更したい

unee

総合スコア17

JavaScript

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

jQuery

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2019/03/19 05:57

編集2019/03/19 08:52

実現したいこと,試したこと

javascript

1$(function () { 2 var ua = navigator.userAgent; 3 if ((ua.indexOf('iPhone') > 0 || ua.indexOf('Android') > 0) && ua.indexOf('Mobile') > 0) { 4 // スマートフォン用処理 5 var Id_01 = mobile/activity/xxxxx?event_id=01; 6   var Id_02 = mobile/activity/xxxxx?event_id=02; 7 } else if (ua.indexOf('iPad') > 0 || ua.indexOf('Android') > 0) { 8 // タブレット用の処理 9 var Id_01 = mobile/activity/xxxxx?event_id=01; 10 var Id_02 = mobile/activity/xxxxx?event_id=02; 11 } else { 12    // それ以外PC用 13 var Id_01 = schedule/xxxxx?event_id=01; 14 var Id_02 = schedule/xxxxx?event_id=02; 15 } 16 }); 17 })

html

1<a href="javascript:window.location.href='https://www.xxxxxx.com/'+Id_01;" target="_blank"></a> 2<a href="javascript:window.location.href='https://www.xxxxxx.com/'+Id_02;" target="_blank"></a>

・モバイル&タブレット
https://www.xxxxxx.com/mobile/activity/xxxxx?event_id=01
https://www.xxxxxx.com/mobile/activity/xxxxx?event_id=02

・PCの時
https://www.xxxxxx.com/schedule/xxxxx?event_id=01
https://www.xxxxxx.com/schedule/xxxxx?event_id=02

上記のように、
①ページ読み込み時にモバイルかPCを判別し、②それぞれIDの付いたリンクを指定したいです。

一番上に書いたコードで試してみましたが、動きませんでした…。
このIDは「id=03」「id=04」...と増えていく予定です。

参考

https://teratail.com/questions/73341

上記を参考にいたしました。

何かもっと効率の良い方法がありましたらご教示ください。

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

### 実現方法

JavaScript

1$(function(){ 2 var ua = navigator.userAgent; 3 if ((ua.indexOf('iPhone') > 0 || ua.indexOf('Android') > 0) && ua.indexOf('Mobile') > 0){ 4        $('.id=01').attr('href','https://www.xxxxxx.com/mobile/activity/xxxxx?event_id=01'); 5        $('.id=02').attr('href','https://www.xxxxxx.com/mobile/activity/xxxxx?event_id=02'); 6 } else if (ua.indexOf('iPad') > 0 || ua.indexOf('Android') > 0){ 7        $('.id=01').attr('href','https://www.xxxxxx.com/mobile/activity/xxxxx?event_id=01'); 8        $('.id=02').attr('href','https://www.xxxxxx.com/mobile/activity/xxxxx?event_id=02'); 9 } else { 10        $('.id=01').attr('href','https://www.xxxxxx.com/mobile/activity/xxxxx?event_id=01'); 11        $('.id=02').attr('href','https://www.xxxxxx.com/mobile/activity/xxxxx?event_id=02'); 12 } 13 });

この方法で思っていました動きは実現しました。
効率の良い方法、これから勉強したいと思います。

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

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

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

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

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

m.ts10806

2019/03/19 06:18

コードがマークダウンで提示されている割には&gt;のようにHTMLエスケープかかっています。 またどこにもHTMLに対して挿入しているような記述がありません。 本当にコードそのまま貼り付けましたか? 「動きません」とは何が起きたのでしょうか? ブラウザのデベロッパーツールのコンソールにエラーが出力されていないかご確認ください。
unee

2019/03/19 06:32

ご確認いただきありがとうございます。 コピペ時にHTMLエスケープがかかってしまったようでした。 参考に記載したURLを参考にして作成しており、何かもっと記述が必要ということでしょうか?
m.ts10806

2019/03/19 06:35

コメントの後半に書きましたコンソール確認はどうでしたか? 提示の書き方だとそもそも変数に正しく文字列をセットできてないのでそこでエラーになると思いますが。 また既に書いたようにJavaScriptコード内にどこにもhtmlに挿入している箇所がないです。 html内に変数書いてもただのそういう文字列でしかないですよ。
m.ts10806

2019/03/19 06:37

提示の質問の回答を参考にされた雰囲気が全くないコードになっています。 いずれの回答もJavaScriptのコードでhtmlを書き換える形式のはずです。
m.ts10806

2019/03/19 06:40

答えを書くのは簡単ですが、変数の使い方や定義の仕方のところすらまだきちんと理解されていない状態でコピペコードを回答としても質問者さんのためにならないと思い、回答を躊躇っています。それでは本当の解決にならないからです。
unee

2019/03/19 06:43

ありがとうございます、少し考えてみます。
m.ts10806

2019/03/19 06:44

ヒントだけの回答にしておきますので、あとはがんばってみてください。
m.ts10806

2019/03/19 08:54

解決されたようですね。よかったです。あとは変数の有効活用です。 同じような文字列は変数にするとか工夫されるとシンプルでメンテナンス性も高いコードになります。今後の参考にしてください。
kei344

2019/03/19 11:05

まだ質問が「受付中」になっていますが、「ベストアンサー」を選び「解決済」にされてはいかがでしょうか。
guest

回答2

0

ベストアンサー

ヒントのみの回答です。

まず。

コードのインデントが揃っていないと開始と終了の位置が見えなくなり、
バグの温床となります。
コードフォーマット機能のついているテキストエディタ(IDEなど)かフォーマットサービスを使いましょう。

ちなみに、基本的にコードの""や''中以外に全角スペースを含んではいけません。

※フォーマットサービスを利用した結果

js

1$(function() { 2var ua = navigator.userAgent; 3if ((ua.indexOf('iPhone') > 0 || ua.indexOf('Android') > 0) && ua.indexOf( 4 'Mobile') > 0) { 5 // スマートフォン用処理 6 var Id_01 = mobile / activity / xxxxx ? event_id = 01; 7 var Id_02 = mobile / activity / xxxxx ? event_id = 02; 8} else if (ua.indexOf('iPad') > 0 || ua.indexOf('Android') > 0) { 9 // タブレット用の処理 10 var Id_01 = mobile / activity / xxxxx ? event_id = 01; 11 var Id_02 = mobile / activity / xxxxx ? event_id = 02; 12} else { 13 // それ以外PC用 14 var Id_01 = schedule / xxxxx ? event_id = 01; 15 var Id_02 = schedule / xxxxx ? event_id = 02; 16} 17}); 18}) 19

おかしい箇所が何箇所かありますね。
変数に文字列をおさめるところもそうですが、
カッコの開始と閉じがあってません。結構ベタッと左に寄ってしまっています。

この状態でブラウザデベロッパーツールのコンソールを確認するとこうなります。
イメージ説明
※画像はGoogleChrome

ここからはデバッグです。

まずはエラーを直す必要がありますが、インデントがおかしいところはきちんとしなければなりません。

基本形から作り直すのが確実です。

まずは外枠から。

js

1$(function() { 2 3});

これは「ドキュメントを読み込み後に実行する」ですね。

uaの宣言

js

1$(function() { 2 var ua = navigator.userAgent; 3});

ifの分岐のところのみ

js

1$(function() { 2 var ua = navigator.userAgent; 3 if ((ua.indexOf('iPhone') > 0 || ua.indexOf('Android') > 0) && ua.indexOf( 4 'Mobile') > 0) { 5 // スマートフォン用処理 6 } else if (ua.indexOf('iPad') > 0 || ua.indexOf('Android') > 0) { 7 // タブレット用の処理 8 } else { 9 // それ以外PC用 10 } 11});

ここで画面を更新してデベロッパーツールのコンソールを確認すると、
エラーがなくなっているはずです。

ここから、ifの書く分岐の中身を戻していきます。

js

1$(function() { 2 var ua = navigator.userAgent; 3 if ((ua.indexOf('iPhone') > 0 || ua.indexOf('Android') > 0) && ua.indexOf('Mobile') > 0) { 4 // スマートフォン用処理 5 var Id_01 = mobile / activity / xxxxx ? event_id = 01; 6 var Id_02 = mobile / activity / xxxxx ? event_id = 02; 7 } else if (ua.indexOf('iPad') > 0 || ua.indexOf('Android') > 0) { 8 // タブレット用の処理 9 var Id_01 = mobile / activity / xxxxx ? event_id = 01; 10 var Id_02 = mobile / activity / xxxxx ? event_id = 02; 11 } else { 12 // それ以外PC用 13 var Id_01 = schedule / xxxxx ? event_id = 01; 14 var Id_02 = schedule / xxxxx ? event_id = 02; 15 } 16});

ブラウザで読み込みなおしてコンソール確認
イメージ説明

エラー出てますね。
aaa.html:20がコンソール上リンクになっているのでクリックしてみましょう。
※ちなみに20とはエラーが出ている行数なので、質問者さんとは違う数字が出ると思います。
イメージ説明

var Id_01 = mobile / activity / xxxxx ? event_id = 01;です。
エラー内容は「Uncaught SyntaxError: Unexpected token ;」
「SyntaxError」はいわゆる「構文エラー」で、JavaScriptのコードの書き方のルールに沿っていないということになります。

エラーが出た場合、調べ方などは下記の記事が参考になります。

今回は結構基本的なミスですので先にここは答えを言ってしまいますが、
変数に情報をおさめるときのやり方が間違ってます。

文字列を代入したい場合、ダブルクォーテーション、またはシングルクォーテーションで括る必要があります。


ちなみに、これだけでは動きません。
提示されたHTMLのaタグ 正しい書き方してますか?
<a href="リンク先URL">リンク文言</a>が基本の書き方です。


ちなみに、これだけでも動きません。
URLを下記のように書いてますが、
mobile / activity / xxxxx ? event_id = 01
URLで「半角空白」は実はそれはそれで1つの文字列です。
おそらくこのままだと下記のようなURLに飛ばされます。
mobile%20/%20activity%20/%20xxxxx%20?%20event_id%20=%2001

詰めましょう。


ちなみに、これだけやっても動きません。
私は上のほうでチラッと「ドキュメントを読み込み後に実行する」としました。

これは「HTML全て読み込んだ後に」となります。
aタグにJavaScriptを埋め込んで変数を埋め込もうとしていますね。

ドキュメント読み込み後にユーザーエージェントの判断が行われるので、aタグに埋め込んだJavaScriptに指定した変数には何も入ってきません。

リンククリックしても
Uncaught ReferenceError: Id_01 is not definedのようなエラーがコンソールに出力されるはずです。

では、どうするか。

aタグのhrefをそれぞれ書き換えるが正解です。

質問者さんが参考にした回答は、この回答の2番目のコードかと思いますが、変数を定義しているのは「ドキュメント読み込み後」ではなく、「その場所を読み込んだとき」に定義しているため、変数に正しく情報が入ってきます。

おそらく今回のユーザーエージェントの判定についてもどこかから持ってきたものだから整合性がとれなくなってしまっているのだと思いますが、それなら、今使いたいコードに合ったやり方をやるべきと思います。

それがaタグのhrefをそれぞれ書き換えるです。

jQueryに「HTML属性を書き換える」ための機能であるattr()というのがあります。
これの2個目のattr(name,value)を使うと良いです。
nameに属性名(今回はhrefですね)、valueにその値(今回はURL)

ちなみに、jQueryで要素を扱う際、セレクターの使い方は必須です。覚えましょう。

aタグにidをつけるのが一番分かりやすいと思います。


ちなみに、コンソールにUncaught ReferenceError: $ is not definedのようなエラーが出ていたら、そもそもjQuery本体を読み込んでいません。

自身が書いている、または読み込ませているJavaScriptの記述より前に読み込ませてください。

投稿2019/03/19 07:24

編集2019/03/19 07:27
m.ts10806

総合スコア80850

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

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

unee

2019/03/19 08:56

細かくご回答いただきありがとうございます…! ・<a>タグについて こちら、この記事を書く際に抜けておりました…。実際に書いてあるコードにはございます。 ・URLで「半角空白」 コピペした際になぜか入ってしまったようでした。記事としてあげる際、制作ツールの設定等見直したいと思います。 その他大変勉強になりました…。ありがとうございます。
guest

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問