How to disable link to phone number when on Desktop?
Asked Answered
D

21

27

How can I add a phone number to a website that is clickable but hides the link when I'm browsing on a website that doesn't support touch.

I could use Modernizr to set it up although. I don't know how.

<a href="tel:1300723579"><p><img src="assets/images/bt_calltoaction.gif" alt="View Projects" width="306" height="60"></p></a>
Daimon answered 15/3, 2013 at 5:25 Comment(5)
Interestingly, with the upcoming feature on Mac OS X Yosemite where a user can click to dial a number right from within desktop Safari (their iPhone patches through the call), these sort of solutions would hurt those users. Would be nice if there were an HTML5 API that would signal whether a device had dialing capabilities or not.Kirst
As well, if someone has Skype (or some other VoiP client) installed it very well may pick up on it and allow them to dial through that. I would even more strongly, then, recommend to not disable the link, and, if you must, just make it not look like a link.Kirst
I don't even need a VoiP client. Clicking a tel: link on my desktop causes it to connect to my phone with bluetooth and dial out.Oneeyed
What do you mean by "a website that doesn't support touch"?Austral
As others are noting, the whole concept of this is wrong and looking at this the wrong way. Support of tel: is not dictated by screen size, touch support, mobile vs. desktop, etc. You should be doing the simplest thing and always showing the tel: link. The title solution (top answer) to give some context and/or showing the actual number are the clearest solutions without detection.Aggression
I
9

I was just dealing with this issue, looking up solutions, and I found this thread (and a few others). I have to confess that I couldn't get any of them to work properly. I'm sure I was doing something wrong, BUT I did figure out a cheat.

As others have pointed out, changing the CSS to hide the visible link indication (color, text-decoration, cursor) is the first and easiest step. The cheat is to define a title for the tel link.

<p>Just call us at <a class="cssclassname" href="tel:18005555555" 
title="CLICK TO DIAL - Mobile Only">(800) 555-5555</a>.</p>

By doing this, not only is the visible indicator of a link disguised (via CSS - see examples from others), but if someone does hover over the link, the title will pop up and say "CLICK TO DIAL - Mobile Only". That way, not only is there a better user experience, but your client doesn't accuse you of having a broken link!

Impiety answered 1/1, 2014 at 8:39 Comment(6)
I don't see why this is the accepted answer as it does not answer the question. At all.Milquetoast
Feel free to post a better solution. As I admitted in my answer, this is a cheat, and it seems to be an acceptable solution for a few people.Impiety
Doing this with CSS relies on browser size. This is not a reliable way of determining support for tel: links.Saenz
It's a cheat, admittedly so, but in all of my testing on various devices, it appears to work as expected across the board.Impiety
The iPhone 6 Plus is 414x736px (or 736x414px). This is approaching the size of a small desktop browser window. Also, tablet browsers already do and desktop browsers are starting to support tel:.Saenz
If the desktop browser window is shrunk to a quarter screen or less, the tel: links will suddenly be clickable and in some browsers will lead to an error page; avoiding that is the purpose of this exercise. For Chrome and Edge on the desktop, and all tablet browsers, we actually do want tel: links to be clickable.Saenz
L
34

Could you just have the code in twice? i.e...

<div class="desktoptel">0800 000 000</div>
<div class="mobiletel"><a href="tel:0800-000-000">0800-000-000</div>

Then just 'display:none;' on the relevant class depending on your browser sizes?

Lindyline answered 11/2, 2014 at 11:35 Comment(1)
this is not an answer, because it does not explains how to detect tel: link support. if you refer to screen size, it is useless since they're now the same as on desktopDripping
I
9

I was just dealing with this issue, looking up solutions, and I found this thread (and a few others). I have to confess that I couldn't get any of them to work properly. I'm sure I was doing something wrong, BUT I did figure out a cheat.

As others have pointed out, changing the CSS to hide the visible link indication (color, text-decoration, cursor) is the first and easiest step. The cheat is to define a title for the tel link.

<p>Just call us at <a class="cssclassname" href="tel:18005555555" 
title="CLICK TO DIAL - Mobile Only">(800) 555-5555</a>.</p>

By doing this, not only is the visible indicator of a link disguised (via CSS - see examples from others), but if someone does hover over the link, the title will pop up and say "CLICK TO DIAL - Mobile Only". That way, not only is there a better user experience, but your client doesn't accuse you of having a broken link!

Impiety answered 1/1, 2014 at 8:39 Comment(6)
I don't see why this is the accepted answer as it does not answer the question. At all.Milquetoast
Feel free to post a better solution. As I admitted in my answer, this is a cheat, and it seems to be an acceptable solution for a few people.Impiety
Doing this with CSS relies on browser size. This is not a reliable way of determining support for tel: links.Saenz
It's a cheat, admittedly so, but in all of my testing on various devices, it appears to work as expected across the board.Impiety
The iPhone 6 Plus is 414x736px (or 736x414px). This is approaching the size of a small desktop browser window. Also, tablet browsers already do and desktop browsers are starting to support tel:.Saenz
If the desktop browser window is shrunk to a quarter screen or less, the tel: links will suddenly be clickable and in some browsers will lead to an error page; avoiding that is the purpose of this exercise. For Chrome and Edge on the desktop, and all tablet browsers, we actually do want tel: links to be clickable.Saenz
S
8

For me the easiest, yet simplest method without any new classes / setup is via css:

a{
    color: #3399ff;
}

a[href^="tel"]:link,
a[href^="tel"]:visited, 
a[href^="tel"]:hover {
    text-decoration: none;
    color: #000;

    pointer-events: none;
    cursor: default;
}

/* Adjust px here (1024px for tablets maybe) */
@media only screen and (max-device-width: 480px) { 
    a[href^="tel"]:link,
    a[href^="tel"]:visited,
    a[href^="tel"]:hover {
        text-decoration: underline;
        color: #3399ff;

        pointer-events: auto;
        cursor: pointer;
    }
}

Html just goes like this:

<a href="tel:+123-456-7">(+12)3 456 7</a>

This works for modern browsers & IE 11+. If you need to include 8 < IE < 11 add the following to your javascript, since pointer-events dont work in IE:

var msie = window.navigator.userAgent.indexOf("MSIE ");

if (msie > 0){
    var Elems = [], Tags = document.querySelectorAll("a[href^='tel']");

    //Nodelist to array, so we're able to manipulate the elements
    for (var i = 0; i < Tags.length; i++ ) {
        Elems[ i ] = Tags[ i ];
    }

    for(var i = 0; i < Elems.length; i++){
        Elems[ i ].removeAttribute('href');
    }
}

EDIT: i found another answer on another thread, that may be useful for you - SO - Answer

Sputum answered 6/9, 2014 at 10:48 Comment(0)
B
6

I recently had this same problem. This problem is all over stackoverflow and everywhere else. How do you hide 'tel:' prefix and keep it from blowing up in regular browsers. There's no good single answer.

I ended up doing it this way:

first I use metalanguage to filter browser vs mobile (like php/coldfusion/perl) based on useragent string:

regular exp match for "/Android|webOS|iPhone|iPad|BlackBerry/i",CGI.HTTP_USER_AGENT

that gives me an if/else condition for desktop browser vs phone.

Next, my href tag looks like this: <a class="tel" id='tel:8005551212' href=''>800-555-1212</a>

Use CSS to style the .tel class in desktop stylesheet so it doesn't look like a link to desktop browsers. the phone number can still be clicked but its not obvious, and it wont do anything:

/* this is in default stylesheet, styles.css: */
.tel{
    text-decoration:none;
    color: #000;
    cursor:default;
}
/* it should be re-styled in mobile css: */
.tel{
    text-decoration: underline;
    color: #0000CC;
    cursor:auto;
}

Finally, I do a little jquery on the mobile links. The jQuery gets the id from the a.tel class, and inserts it into the href property, which makes it clickable for phone users.

The whole thing looks like this:

<!-- get regular CSS -->
<link rel="stylesheet" href="styles/styles.css" type="text/css" media="Screen" />

<!-- get user agent in meta language. and do if/else on result. 
 i'm not going to write that part here, other than pseudocode: -->

if( device is mobile ) {

    <!-- load mobile CSS -->
    <link rel="stylesheet" href="styles/mobile.css" type="text/css" media="handheld" />

    <!-- run jQuery manipulation -->
    <script>
        $(function(){$('a.tel').prop('href',$('a.tel').prop('id'));});
    </script>
}

<p> Call us today at <a class="tel" id='tel:8005551212' href=''>800-555-1212</a>!</p>

One caveat to this approach: id's should be unique. If you have duplicate phone numbers on a page that you want to link, change the id to name, then you use jQuery to loop through them.

Broadloom answered 15/3, 2013 at 16:47 Comment(2)
I agree that UserAgent parsing is the best of a few bad options to do this, but why do it server side? Also, many of us do not use separate .css files for mobile devices.Saenz
data-* attributes are better than ID in this case -- in fact, kind of made for this purpose.Godfry
D
6

You could use css media queries to control when its viewed as link and when not.

@media(min-width:768px){
 a[href^="tel:"] {
  pointer-events: none;
 }
}

anything below 768px will work as link, above that, just as text.

Dolley answered 27/11, 2017 at 7:8 Comment(0)
E
3

if you just wanted to disable the click on the mobile screens:

if(typeof window.orientation !== 'undefined'){
    $('a[href^="tel:"]').on('click', function(e){
        e.preventDefaults();
    });
}

Hope this helps :)

Excrescent answered 19/2, 2015 at 6:57 Comment(1)
This will work if placed in a <script> tag at the bottom of the page; don't put it in the document ready event. There is some incongruity between support for window.orientation and support for tel: links (Chrome on desktop, IE on mobile).Saenz
C
2

I've had success with this using Modernizr, specifically the touch test. It's not a perfect solution in that it doesn't do anything to help tablets or touch-enabled laptops, but it works in most desktop browsing situations.

HTML:

Call us at: <a href="tel:1-800-BOLOGNA" class="call-us">1-800-BOLOGNA</a>

CSS:

.no-touch a.call-us {
  color: black;            /* use default text color */
  pointer-events: none;    /* prevents click event */
  cursor: text;            /* use text highlight cursor*/
}

The above CSS targets links with class="call-us" on non-touch devices which covers the majority of desktops.

Note that pointer-events is supported in all modern browsers but IE only supports it in versions 11+. See the compatibility chart.

Another solution, still imperfect, would be to use Modernizr.mq along with Modernizr.touch to detect screen width and touch capability and then inject the phone link with jQuery. This solution keeps the phone link out of the source code and then only appears on touch devices smaller than a certain width (say 720px which will probably cover most phones but exclude most tablets).

Ultimately, it's up to the browser vendors to come up with a bulletproof solution here.

Curarize answered 27/5, 2014 at 15:52 Comment(1)
This works except if the user clicks on it randomly, will result in an error.Kezer
C
2

I found the best way. I get that this is old, but I found a very easy way of doing this.

Using this code below

<a href=“tel:888-555-5555” class="not-active">888-555-5555</a>

//This is the logic you will add to the media query
.not-active {
   pointer-events: none;
   cursor: default;
}

In your CSS make use of media queries. So make a media query for all desktops

@media only screen and (min-width: 64em) {
    /* add the code */
    .not-active {
       pointer-events: none;
       cursor: default;
    }
}

Now all desktop sized pages wont be able to click on it.

Collage answered 16/11, 2015 at 1:9 Comment(1)
Relying on screen size to determine support for tel: links is unreliable and getting more unreliable. This is a case where it is really better to resort to JavaScript. Additionally, IE 10 and earlier do not support CSS pointer-events.Saenz
S
2

it seems this could be done with a simple media query for most browsers. Something like this is working like a charm for me:

<style type="text/css">
    #mobil-tel {
        display:none;
    }

    @media (max-width: 700px) {
        #mobil-tel {
            display:block;
        }

        #desktop-tel{
            display:none;
        }
    }
</style>

and on the desktop link, leave out the 'href', on the mobile link, put in the 'href'.

Seeger answered 4/5, 2016 at 1:58 Comment(0)
I
1

Just thought I would add my two-cents worth to (what is turning out to be a rather lengthy) discussion.

I basically use the onClick event (on the link) to execute Javascript to return a boolean true or false. If the return value is true, i.e. some variable or function that tests if the device is a phone returns a value true, then the href URL is followed by the browser. If the the return value is false, then the href URL becomes, in effect, inactive. (Standard HTML behavior, way before HTML5.)

Here is what I mean:-

<html>
<head>
<title>tel markup example</title>
<script src="http://code.jquery.com/jquery-2.1.0.min.js"></script> <!-- Does not really matter what version of jQuery you use --> 
<script>
var probablyPhone = ((/iphone|android|ie|blackberry|fennec/).test(navigator.userAgent.toLowerCase()) && 'ontouchstart' in document.documentElement);
function initialize() {
	if ( !probablyPhone ) {
		alert ("Your device is probably not a phone");
		( function( $ ) { 
			$( '.call' ).css ( "text-decoration", "none" );
			$( '.call' ).css ( "color", "black" );
			$( '.call' ).css ( "cursor", "default" );			
		} )( jQuery );
	}
}
</script>
</head>
<body onLoad="initialize();">
Please ring (some fictitious number in Australia): <a href="tel://+61391112222" class="call" onClick="return probablyPhone;">+61 3 9111 2222</a>
</body>
</html>

Note that I also added some re-formatting of the link to make it appear to the user as if it's just ordinary text.

Here is a gist I created.

Just to finish this post/ answer, credit for writing succinct JavaScipt code for detecting a phone (based on the user agent and the ontouchstart event) goes to a fellow Melbournian rgb in this stackoverflow post

Illegible answered 15/12, 2014 at 13:16 Comment(0)
H
1

Here is a simple jquery-based solution which I developed to solve this problem. See code comments for explanation. https://jsfiddle.net/az96o8Ly/

// Use event delegation, to catch clicks on links that may be added by javascript at any time.
jQuery(document.documentElement).on('click', '[href^="tel:"]', function(e){
  try{
    // These user-agents probably support making calls natively.
    if( /Android|webOS|iPhone|iPad|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ) {
      // Do nothing; This device probably supports making phone calls natively...
    } else {
      // Extract the phone number.
      var phoneNumber = jQuery(this).attr('href').replace('tel:', '').trim();

      // Tell the user to call it.
      alert("Please call "+phoneNumber);

      // Prevent the browser popup about unknown protocol tel:
      e.preventDefault();
      e.stopPropagation();
    }
  } catch(e){
    console.log("Exception when catching telephone call click!", e);
  }
});
Heterogamy answered 8/10, 2015 at 15:6 Comment(0)
S
1

My approach is similar to another approach above; there are a few considerations I take into account:

  • As we know, there is no good programmatic way to detect support. This is a rare case where we are forced to parse the UserAgent string.
  • This should be client side; there is no need for server side detection.
  • There are now desktop browsers that can handle tel: links; Chrome's behavior on the desktop is, at worst, to do nothing when clicked. At best, you can make a call with Google Voice.
  • Because doing nothing when clicked is Chrome's fallback behavior, we should use that behavior as a fallback on all browsers.
  • If your page takes responsibility for creating tel: links, it should take responsibility for all tel: links and disable autodetection in the browser.

With all of this in mind, I suggest first adding a meta tag to your <head>:

<meta name="format-detection" content="telephone=no"/>

Then, define a JavaScript function that parses the UserAgent and returns true if and only if we think the browser will not bring us to an error page when the link is clicked:

function hasTelSupport()
{
    return /Chrome\/|Mobile( Safari)?\/|Opera M(in|ob)i\/|w(eb)?OSBrowser\/|Mobile\;|Tablet\;/.test(navigator.userAgent);
}

Then, call that function from the onclick attribute in your link:

<a href="tel:+18005551212" onclick="return hasTelSupport();">Call Me</a>

This will allow tel: links to be clicked on Chrome, Edge, iOS Safari, Android Browser, Blackberry, Dorothy, Firefox Mobile, IE Mobile, Opera Mini, Opera Mobile, and webOS. The links will do nothing when clicked on other devices or browsers.

Please use international format for your tel: links. In other words, the first characters should be a + and a country code.

Saenz answered 1/2, 2016 at 18:14 Comment(0)
M
1

Thanks to TattyFromMelbourne's post I am now using a pretty simple bit:

My button id="call" will make the phone call based on his "probablyphone" test function but also will scroll down to the contact info section either way giving the button a working use no matter what.

I aslo replaced the alert with an empty function, to remove the pop-up.

<a id="call" href="#contact">PHONE US</a>


$("#call").on('click', function() {
    var probablyPhone = ((/iphone|android|ie|blackberry|fennec/).test(navigator.userAgent.toLowerCase()) && 'ontouchstart' in document.documentElement);
    var link = "callto:15555555555";
        if ( !probablyPhone ) {
            window.alert = function() {};}              
    else{window.location.href = link;}
});
    </script>
Macron answered 21/4, 2016 at 13:52 Comment(0)
D
1

You can use css3 media queries to detect a mobile window and hide the link accordingly.

@media(max-width:640px){
 .your-calling-link{
display:none;
}
}

Alternately, if you want to show the link and just disable click functionality, use jquery function:

screen.width 

or

screen.innerWidth

and disable the click functionality on the link using

 $('.your-link').off(click);
Dominus answered 8/10, 2016 at 10:19 Comment(0)
M
1

One way of handling this is to create two separate divs and use display:hidden.

Example:

<div class="mobile-desktop"><p>123-456-7890</p></div>
<div class="mobile-mobile"><a href="tel:123-456-7890">123-456-7890</a></div>

In your css set your mobile break points. This part is really up to you. Let's say

@media only screen (min-width: 768px){

.mobile-mobile {
display:none;
}

}

@media only screen (max-width: 767px){

.mobile-desktop{
display:none;
}

}

This should let you hide one div based on screen size. Granted 789 is just a number I picked, so pick a size you believe is mobile. You can find them online at like this site I found on Google or others like it. Lastly, this is just a quick css markup, you might have to tinker but the idea is there.

Maharani answered 3/3, 2020 at 2:6 Comment(2)
Sweet thanks... I asked this question in 2013 people still answering it :)Daimon
Ha. I was looking for the answer myself and read your thread. I was hoping there was an easier way.Maharani
J
0

This way works without adding any more CSS.

Try replacing the a tag with something else like a span tag, but only for mobile browsers of course. Benefits are that you are not cloaking this a with CSS preventing default action while keeping it still as a link. It won't be a anymore, so you won't have to worry.

I've created an example to here. Bold phone there works this way, see code below.

I took piece of code from one of the respondent to define if browser is mobile. And you have to mark these links with class="tel" or find a way to determine if the href has "tel:" in it. JQuery is also required.

// define if browser is mobile, usually I use Anthony's Hand mobile detection library, but here is simple detection for clarity
var probablyPhone = ((/iphone|android|ie|blackberry|fennec/).test(navigator.userAgent.toLowerCase()) && 'ontouchstart' in document.documentElement);
if ( !probablyPhone ) {
    // find all the A with "tel:" in it, by class name
    $('a.tel').each(function(){
        var span = document.createElement('span');

        // SPAN inherits properties of A, you can also add STYLE or TITLE or whatever
        span.innerHTML = this.innerHTML;
        span.className = this.className;

        // replace A with SPAN
        this.parentNode.insertBefore(span, this);
        this.parentNode.removeChild(this);
    });
}
Jolty answered 15/9, 2015 at 9:24 Comment(1)
You should use backticks ` to highlight language specific words such as href and span instead of using all capital letters.Smyrna
G
0

Input this into custom css and call it a day:

a.tel { color: #FFFFFF; cursor: default; /* no hand pointer */ }

Change your color as needed.

Cheers!

Goulder answered 26/2, 2016 at 9:24 Comment(0)
H
0

I am adding the following css through javascript when mobile device is detected.

pointer-events:none

The js code is:

var a = document.getElementById("phone-number");
if (Platform.isMobile())   // my own mobile detection function
    a.href = "tel:+1.212.555.1212";
else
    $(a).css( "pointer-events", "none" );
Harms answered 21/4, 2016 at 16:4 Comment(0)
K
0

In my target site, all phone link markups are in this pattern: <a href="tel:111-222-3333"">111-222-3333</a>. My solution is such simple:

function setPhoneLink() {
    if (screen.width > 640) {
        $("a[href^='tel:']").each(function(){
            $(this).replaceWith($(this).text());
        });
    }
} 

Device-width: mobile<640; tablet >=768 and <1024; desk >=1024. Source: http://javascriptkit.com/dhtmltutors/cssmediaqueries2.shtml

Kimsey answered 14/2, 2019 at 19:34 Comment(0)
H
0

Don't use the screen size as a requirement for that.

You can use CSS media query like this:

@media (pointer: fine) { /* this is for devices using a mouse, maybe a pen */
    a[href^="tel:"] { /* select only "tel:" links */
        pointer-events: none; /* avoid clicks on this element */
    }
}

@media (pointer: coarse) { /* this works for mobile phones */
}

More info: https://developer.mozilla.org/en-US/docs/Web/CSS/@media/pointer

Heterogenetic answered 2/9, 2021 at 21:40 Comment(0)
C
-3
@media screen {.telephone {pointer-events: none;}}
Canonist answered 8/8, 2014 at 11:12 Comment(1)
Please be more verbose with your answers where you can! A small explanation would help here to accompany the code.Pharr

© 2022 - 2024 — McMap. All rights reserved.