a要素のhref属性にtel:~
と設定すると、電話発信することができます。
この機能はスマートフォンでは便利ですが、電話発信ができないパソコンなどの環境ではリンクされていない方がよい場合があります。
ここではJavaScriptを使って、スマートフォンのときには電話発信するリンクにして、それ以外ではテキスト表示のままにする機能を実装してみましょう。
処理の流れ
他のスクリプトの変数に影響しないようにするため、このスクリプトを即時関数で定義します。
ブラウザのユーザーエージェントを取得して、スマートフォン(iPhone, Android)かどうかを判定する関数式を定義します。
querySelectorAll()
メソッドを使って、電話番号を内包している要素を取得して、その要素のテキストをa要素で囲んで、innerHTMLプロパティに設定します。
addEventListener()
メソッドで、DOMContentLoaded
イベントが通知されたときに処理が実行されるようにします。
HTMLについて
今回、電話発信したい電話番号はspan要素でマークアップして、JavaScriptで取得しやすくするため、class属性に.telLink
を設定します。
以下のようなHTMLで動作確認します。
<ul>
<li><span class="telLink">086-255-1101</span></li>
<li><span class="telLink">086-255-1101</span></li>
<li><span class="telLink">086-255-1101</span></li>
</ul>
<p>お問い合わせは<span class="telLink">086-255-1101</span>までお電話ください。</p>
処理の説明
それでは、ステップごとに説明していきます。
STEP1 即時関数を定義
まず、他のスクリプトの変数に影響しないようにするため、このスクリプトを即時関数で定義します。
(function () {
})();
即時関数については、MDNの解説を参照してください。
STEP2 スマートフォンかどうかを判定する無名関数式を定義
今回はスマートフォンであるかどうかを判定するために、無名関数式で判定する処理を書きます。
※無名関数式については、MDNの解説を参照してください。
無名関数式を宣言
まず、無名関数式isSmartPhone
を宣言します。
var isSmartPhone = function() {
};
ユーザーエージェントを取得先について
ユーザーエージェントは、navigator
オブジェクトのuserAgent
プロパティから取得できます。
window.navigator.userAgent
toLowerCaseメソッドで小文字に変換
userAgent
プロパティのテキストをそのまま使用しても良いのですが、ここでは取得したテキストをtoLowerCase
メソッドですべて英字を小文字にします。
変換したユーザーエージェントのテキストを変数ua
に格納します。
var isSmartPhone = function() {
var ua = window.navigator.userAgent.toLowerCase();
}
※toLowerCase
メソッドについては、MDNの解説を参照してください。
matchメソッドでスマートフォンかどうか判定する
次にmatch()
メソッドを使って、ユーザーエージェントの中に、iPhoneやAndroidを表すテキストが含まれているか判定します。
変数ua
に格納したテキストの中にiPhoneを表すiphone
、または、Androidスマートフォンを表すandroid
とmobile
が含まれていれば、match
メソッドはtrue
を返します。
if
でmatch
メソッドの返り値を判定して、true
ならreturn
でtrue
を返し、false
ならreturn
でfalse
を返して、isSmartPhone
を判定用のメソッドにします。
var isSmartPhone = function() {
var ua = window.navigator.userAgent.toLowerCase();
if (ua.match(/iphone|Android.+Mobile/)) {
return true;
} else {
return false;
}
};
※match
メソッドについては、MDNの解説を参照してください。
STEP3 対象となる要素を取得して、a要素を入れる関数を定義
関数を定義
まず、関数を定義します。
ここでは、関数名をsetTelLink
とします。
function setTelLink() {
}
querySelectorAll()メソッドで要素を取得
querySelectorAll()
メソッドを使って、リンクを設定したい要素を取得します。
要素はclass
属性でtelLink
を設定していますので、これを目印に取得します。
querySelectorAll()
メソッドで取得した場合、NodeList
オブジェクトとして受け取れるので、items
に格納します。
function setTelLink() {
var items = document.querySelectorAll('.telLink');
}
取得した要素をループ処理
NodeList
オブジェクトは、配列のようにfor
を使って順次処理ができます。items
の各要素を順番に処理していきます。
コードが書きやすいように、ループ処理の中でitem
を宣言して、items
の要素を格納します。
function setTelLink() {
var items = document.querySelectorAll('.telLink');
for (var i = 0; i < items.length; i += 1) {
var item = items[i];
}
}
要素のテキストをa要素で囲む
textContent
プロパティで要素のテキスト取得して、a要素となる文字列を組み立てます。
'<a href="tel:' + item.textContent + '">' + item.textContent + '</a>';
組み立てた文字列をinnerHTML
プロパティに設定して、文字列をa要素にします。
item.innerHTML = '<a href="tel:' + item.textContent + '">' + item.textContent + '</a>';
ループ処理に追加すると以下のようになります。
function setTelLink() {
var items = document.querySelectorAll('.telLink');
for (var i = 0; i < items.length; i += 1) {
var item = items[i];
item.innerHTML = '<a href="tel:' + item.textContent + '">' + item.textContent + '</a>';
}
}
スマートフォンのときだけ処理を実行するようにする
前述のループ処理だと、スマートフォン以外のときも処理が実行されて、電話番号にリンクが設定されてしまいます。
そこでif
文を追加して、作成したisSmartPhone
でスマートフォンのときだけループ処理が実行されるようにします。
function setTelLink() {
var items = document.querySelectorAll('.telLink');
if (isSmartPhone()) {
for (var i = 0; i < items.length; i += 1) {
var item = items[i];
item.innerHTML = '<a href="tel:' + item.textContent + '">' + item.textContent + '</a>';
}
}
}
STEP4 HTMLの読み込みが完了してから処理を開始
addEventListener()
メソッドで、HTMLが読み込み完了したときに処理が実行されるようにします。
document.addEventListener('DOMContentLoaded', setTelLink, false);
実行結果
完成したJavaScriptのコードは以下のようになります。
(function () {
var isSmartPhone = function() {
var ua = window.navigator.userAgent.toLowerCase();
if (ua.match(/iphone|Android.+Mobile/)) {
return true;
} else {
return false;
}
};
function setTelLink() {
var items = document.querySelectorAll('.telLink');
if (isSmartPhone()) {
for (var i = 0; i < items.length; i += 1) {
var item = items[i];
item.innerHTML = '<a href="tel:' + item.textContent + '">' + item.textContent + '</a>';
}
}
}
document.addEventListener('DOMContentLoaded', setTelLink, false);
})();
このコードを実行すると、スマートフォンのときにはリンクが設定されるようになります。
以下はFirefoxの開発ツールで動作確認をしている様子です。
シミュレーターで「iPhone」に切り替えると、電話番号にリンクが設定されます。
まとめ
今回の実装方法では、電話番号にclass属性の付いたspan要素が必要になりますので、どうしても指定する手間がかかります。
その代わり、必要なところだけを切り替えることができるので、制作者がコントロールしやすいメリットもあります。
要件によっては効率良く機能実装できると思いますので、使ってみてください。
コメント