Javascript 使用jQuery检测设备是否可以拨打电话(支持“tel://”协议)

Javascript 使用jQuery检测设备是否可以拨打电话(支持“tel://”协议),javascript,jquery,mobile,detection,browser-detection,Javascript,Jquery,Mobile,Detection,Browser Detection,在我的网站上,我有几个这样的链接: 我想使用jQuery(或其他方法)来确定设备是否支持使用tel://协议进行呼叫。世界上有这样的方法吗 我想使用一些方法来启用或禁用链接,因为当点击桌面时,我们会看到一个类似“Firefox不知道如何打开此地址,因为协议(tel)与任何程序都没有关联”的页面 目前,我正在嗅探用户代理并检测它是否是移动设备。但是,有更好/更准确的方法吗?类似jQuery的$.support.xx if ( (/iPhone|iPod|iPad|Android|BlackBer

在我的网站上,我有几个这样的链接:

我想使用jQuery(或其他方法)来确定设备是否支持使用tel://协议进行呼叫。世界上有这样的方法吗

我想使用一些方法来启用或禁用链接,因为当点击桌面时,我们会看到一个类似“Firefox不知道如何打开此地址,因为协议(tel)与任何程序都没有关联”的页面

目前,我正在嗅探用户代理并检测它是否是移动设备。但是,有更好/更准确的方法吗?类似jQuery的
$.support.xx

if ( (/iPhone|iPod|iPad|Android|BlackBerry/).test(navigator.userAgent) != true ){
    $(".call").attr("href", "#");
}

我不确定Android或BlackBerry,但iOS会自动提取电话号码并像这样包装:
…这样你就可以在某个地方有一个隐藏的
,其中包含一个电话号码,如1-800-555-5555,然后在页面加载时执行以下操作:

var isTelephone = $("a[href*='tel:']").length > 0;

这可能可以移植到其他平台,也可能无法移植到其他平台,您必须尝试一下。

您可以在其中找到带有tel://的href的第一个实例,然后发布一个ajax调用。如果成功,它的readyState应该为1,所以不要执行任何操作。失败时,使用tel://查找所有HREF并获取内部html并替换a标记

这更多的是一种假设,未经检验


另一个想法是,大多数浏览器都对电话号码格式的字符串提供自定义支持,如果您将其放入电话号码中,则不必像自动创建标签那样创建标签。

在将非链接元素增强为电话链接之前,我使用以下方法检测其可能电话:

var probablyPhone = (
    (/iphone|android|ie|blackberry|fennec/).test
     (navigator.userAgent.toLowerCase())
     && 'ontouchstart' in document.documentElement
  );
我排除了ipod | ipad,因为我知道它们不是手机

这里的关键点是可能
对于某些平板电脑设备,它当然会返回true,但对于我来说,在非手机触摸设备上的链接无论如何都会失败-我主要只想排除桌面,因此触摸事件检测。我想检查设备宽度也会缩小范围,但最终无法保证检测到能够拨打我发现的电话的移动设备。

一些有限的解决方案可以检测一些纯手机。但并非所有可能:

(功能(a){
window.isPhone=/\bi?Phone\b |(?=.*\bAndroid\b)(?=.*\bMobile\b)|(?=.*\bAndroid\b)(?=.*\bSD4930UR\b)/i.test(a);
})(navigator.userAgent | navigator.vendor | window.opera);

console.info('此设备%s拨打电话',window.isPhone?'最初用于':'可能无法')
@Zenith这个问题是相关的,但它没有讨论在包含
tel:
链接时如何检测。@Zenith谢谢,这很有帮助,但正如Pointy提到的,它实际上并没有具体检测是否支持
tel://
。这就是我想要实现的-用户代理测试,我已经处理好了。。。只是想知道/希望能够更准确地描述该设备是否能够处理
tel://
@SetSailMedia对不起,我的意思是也看看侧边栏(我没有投票关闭btw)。查看关于这个问题的评论-这个问题也是相关的:,它包含了如何检查某些浏览器是否支持协议Android似乎认为一系列的数字是一个电话号码,当我知道我迟到得厉害时,尝试拨打它,但是我发现哪种类型的手机可以识别哪种格式。你需要为你的隐藏的
号码选择一种Android和iPhone都能识别的格式,否则你的工作将是徒劳的!这似乎不起作用。任何人都可以创建一个测试页面,它可以正常工作吗?Android上的Google Chrome似乎忽略了
,即使它没有隐藏,即使标题中有
标记。聪明的黑客。但是,如果您的页面正在显式创建
tel:
链接,则应始终通过meta标记关闭电话格式检测。我发现用户代理检测在浏览器和设备中更可靠,也更适合未来。Skype或其他类似软件可能是“tel:”协议的处理程序,所以这种方式不太好。通常,Skype在安装时也会安装一些浏览器扩展,将几乎所有的数字顺序转换为“tel:”链接。好吧,有趣的是,去掉标记即可。我的印象是,尽管它是自动添加的,但它是最佳实践?我也会用ajax尝试你的建议。如果你在写一个成千上万人都会花时间阅读的答案之前至少进行最低限度的测试,那就更好了:upsidedown微笑:(是的,这条评论在你阅读后会自动销毁,所以为其他人节省时间…:wink:)因为自定义协议可以基于个人计算机注册,所以我无法测试每个场景。可能有人在他们的计算机上注册了tel://在这种情况下,ajax请求将返回readyState 1。然而,向上投票确实允许人们筛选可能的答案,以找到最佳解决方案。就测试场景而言,我已经将其与桌面/平板电脑上的其他自定义协议(不是tel://)一起使用。触摸事件可以通过软件方式模拟,Android、黑莓可以是平板电脑、电视、玩具、,是的,但我确实在大约4年前发布了一篇文章,我不建议在不寻找更新的解决方案的情况下关注3年前的事情。我的评论不是对你的回答,而是针对那些从今天起一直阅读这篇文章的人。在当时,这个解决方案已经足够完美了