トップページ > ブログ > Javascriptでレスポンシブな電話番号リンク【Jqueryを使わない】

BLOG

ブログ

UPDATE:2022.3.18

CATEGORY

Javascriptでレスポンシブな電話番号リンク【Jqueryを使わない】

さやさんです。

電話番号が掲載されたホームページ等をスマートフォンから閲覧した場合には、
リンクタグでそのまま電話をかけられるようにするのがより親切ですよね。
一方でPCから閲覧した場合、通常は電話をかけられないので電話番号のリンクは不要です。

電話番号のリンクをスマートフォンの時だけ有効にしたい場合、
その実装方法を検索してみるとjQueryを使ってスマホ時だけaタグを付与してリンクさせる方法が多く出てきます。

しかしjQueryを使わず、純粋なJavascript(Vanilla JS)のみを使ってコーディングしたい場合もありますよね。
そんな方のためにjQueryを利用しないで動く、Javascriptのみの記述方法をご紹介します。


ちなみに「Vanilla JS」とはただのネイティブなJavascriptのことを指します。
「Vanilla JS」というフレームワークの紹介記事もありますが、
最軽量のフレームワーク(中身は何もない)というジョークのようです。


記述方法

HTML

<span data-action="call" data-tel="0000-000-0000">電話する</span>

Javascript(Vanilla)

window.addEventListener('DOMContentLoaded', function(){
if (!isPhone())
return;
const actionTarget = document.querySelectorAll('span[data-action=call]');
for (let i = 0; i < actionTarget .length; i++){
actionTarget [i].outerHTML = '<a href="tel:' + actionTarget [i].dataset.tel + '">' + actionTarget [i].outerHTML + '</a>';
}
});
function isPhone() {
return (navigator.userAgent.indexOf('iPhone') > 0 || navigator.userAgent.indexOf('Android') > 0);
}
※インデントは省略しています



ポイント $.wrap()→outerHTMLで書き換える

jQueryでは指定した要素を別のHTMLタグで囲うことができる便利な$.wrap()が使えます。
これを使えばレスポンシブ時にタグで囲うことが容易になります。
しかしJavascript(Vanilla JS)では使えないので、outerHTMLを使って自力で書き換える必要があります。
そのため6行目の記述は、Javascript(Vanilla JS)とjQueryではこんなにも差が…

Javascript(Vanilla JS)
actionTarget[i].outerHTML = '<a href="tel:' + actionTarget[i].dataset.tel + '">' + actionTarget[i].outerHTML + '</a>';

jQuery
$.wrap('<a href="tel:' + $.data('tel') + '"></a>');

この記述量の差が、「jQueryが便利」である証拠ですね。



もっと知りたいjQueryの便利な所!
DOM要素取得の$(‘.hoge’)


jQueryからJavascript(Vanilla JS)への書き換え時、
私がハマった(とても初歩的な)点で
「document.querySelectorAll(selector).addEventListener()」が実行できないという問題がありました。

【イベント処理を記述するために使われるjQueryのメソッド「$.on」】
$.on(‘イベント名’)(jQuery)は.addEventListener(‘イベント名’)(Javascript(Vanilla JS))に書き換えが可能
しかし
$(‘.hoge’).on()は問題なくて
document.querySelectorAll(selector).addEventListener()はエラーになってしまう
この問題に直面して、改めてjQueryの便利さに気付いてしまったのです…。


HTMLのオブジェクト(DOM要素)を取得する時、jQueryでは$(‘.hoge’)という形で取得しますよね。
この$(‘.hoge’)、知らずに使っているうちはわからないのですが、
Vanilla JSを意識すると驚くほど便利なものだということに気付かされます。

どう便利かというと、$(‘.hoge’)で取得したDOM要素には「暗黙的にforEachのようなループ処理が実行される」のです。
このためjQueryではループ処理を記述しなくても$(‘.hoge’)に対して何かしら処理を行うこともできます。
(実際にはjQueryも内部的には要素1つ1つに処理を実行しているのですが…)

しかしJavascript(Vanilla JS)で$(‘.hoge’)の代わりに.querySelectorAllで要素を取得した場合は、
ループ処理等を行って要素一つ一つに対して処理を行う必要があります。

つまりdocument.querySelectorAll(selector).addEventListener()が実行できない問題を解決するには
取得した要素一つずつに.addEventListener()を実行すれば良いのです

↓上記に関して詳細を知りたい方は以下が参考になります



最後に

jQueryはとても便利ですが、使わないでコーディング出来ればそれに越したことはないと最近感じています。
jQueryを使わなければJSの読み込みが軽くなることがありますし、
あるいはjQueryを利用できない環境でのコーディングもあるので、
その場合にJavascript(Vanilla JS)のみで対応できるだけの知識があると安心ですね。

参考リンク
【脱jQuery!】ネイティブなJavaScript(Vanilla JS)への書き換え方まとめ

Happiness in Design

シアワセをデザインする会社

営業ゼロで年間600件以上
お問い合わせをいただいている
ノウハウを惜しみなく。

アプリコットデザインには創業当初から営業マンはいません。
創業当初からWEBを活用することに重点を置いて、これまで試行錯誤してきました。その結果、年間600件以上の問い合わせををこのホームページから得ています。ホームページという集客ツールを提供している私たち自身が、自社のホームページで集客できないのでは、お客様に自信を持ってオススメすることはできません。自社の実験から「WEBを活用して集客するためのノウハウを蓄積」した上で、誰よりもホームページの素晴らしさを知り、自信をもってお客様にご提供していきたいと考えます。

VIEW MORE

CONTACT

お問い合わせ・ご相談は
お気軽にどうぞ。

tel.0120-622835

営業時間/10:00〜18:00 
定休日/土日祝日

プロジェクト

それぞれの
らしさ溢れる日常を。

カフェ、トリミングサロン、ネイルサロン、スクール「tone village(トーンビレッジ)」

カフェ、トリミングサロン、ネイルサロン、スクール「tone village(トーンビレッジ)」

カフェ/ドッグサロン/
ネイルサロン/スクール

tone village

We're open.

採用情報

recruit info

豊かで彩りのある社会をつくる!

私たちは仕事を通して、一人でも多くの人が未来に対する希望を描けるような、そんなワクワクする社会をつくっていきたいと思っています。

VIEW MORE