จะทำเครื่องหมายหมายเลขโทรศัพท์ได้อย่างไร?


471

ฉันต้องการทำเครื่องหมายหมายเลขโทรศัพท์เป็นลิงก์ที่โทรได้ในเอกสาร HTML ฉันได้อ่านวิธีการไมโครฟอร์แมตแล้วและฉันรู้ว่าtel:โครงการจะเป็นแบบมาตรฐาน แต่ไม่มีการนำไปใช้เลยทีเดียว

Skype ให้คำจำกัดความเท่าที่ฉันรู้skype:และcallto:สิ่งหลังได้รับความนิยม ฉันคิดว่า บริษัท อื่นมีแผนการอื่นหรือกระโดดขึ้นcallto:รถไฟ

อะไรจะเป็นแนวปฏิบัติที่ดีที่สุดในการทำเครื่องหมายหมายเลขโทรศัพท์เพื่อให้คนจำนวนมากที่สุดด้วยซอฟต์แวร์ VoIP สามารถคลิกที่ลิงค์เพื่อรับสายได้

คำถามโบนัส: ไม่มีใครรู้เกี่ยวกับภาวะแทรกซ้อนกับหมายเลขฉุกเฉินเช่น 911 ในสหรัฐอเมริกาหรือ 110 ในเยอรมนี?

ไชโย

ปรับปรุง: Microsoft NetMeeting ใช้callto:รูปแบบภายใต้ WinXP คำถามนี้แสดงให้เห็นว่า Microsoft Office Communicator จะจัดการtel:รูปแบบ แต่ไม่callto:คน เยี่ยมมากเรดมันด์!

อัปเดต 2:สองปีครึ่งต่อมาในขณะนี้ ดูเหมือนว่าจะเดือดลงไปในสิ่งที่คุณต้องการจะทำกับจำนวน ในบริบทมือถือtel:เป็นวิธีที่จะไป การกำหนดเป้าหมายเดสก์ท็อปนั้นขึ้นอยู่กับคุณหากคุณคิดว่าผู้ใช้ของคุณเป็นคน Skype มากกว่า ( callto:) หรือมีแนวโน้มที่จะมีสิ่งที่tel:ติดตั้งเช่น Google Voice ( ) ความคิดเห็นส่วนตัวของฉันคือเมื่อมีข้อสงสัยในการใช้งานtel:(สอดคล้องกับ @Sidnicious 'คำตอบ)

อัปเดต 3: User @ rybo111 ตั้งข้อสังเกตว่า Skype ใน Chrome ได้เพิ่มขึ้นในขณะที่tel:bandwagon ฉันไม่สามารถตรวจสอบสิ่งนี้ได้เพราะไม่มีเครื่องที่มีทั้งสองมือ แต่ถ้าเป็นจริงก็หมายความว่าเราได้ผู้ชนะที่นี่:tel:


1
แต่น่าเสียดายที่ไม่ได้. ดูเหมือนว่าจะลงไปที่สิ่งที่ผู้ให้บริการของคุณ (VoiP, โทรศัพท์มือถือ comp หรืออะไรก็ตาม) นี่อาจรวมถึงการเรียกเก็บเงินสำหรับ 800 หมายเลข
Boldewyn

1
ฉันใช้ Google Voice ใน Chrome และไม่รู้จักtel:URIs ฉันกำลังติดกับcallto:และแสดงหมายเลขโทรศัพท์ตามทฤษฏีว่าเบราว์เซอร์โทรศัพท์มือถือควรตรวจจับหมายเลขนั้นโดยอัตโนมัติ
โปรเก่า

5
แม้จะมีชื่อเรื่องคำถามนี้ก็คือ "คุณควรใช้แบบแผน URL ใดสำหรับหมายเลขโทรศัพท์" แทนที่จะทำเครื่องหมายไว้
Raedwald

1
@Boldewyn Skype ได้รับแจ้งเมื่อใช้ Chrome ด้วยtel:ดังนั้นบางทีคุณควรลบความคิดเห็นของคุณในตอนท้ายเกี่ยวกับ Skype โดยใช้callto:?
rybo111

1
คุณกรุณาลองแก้ไขการอัพเดทคำถามของคุณให้เป็นคำตอบที่สอดคล้อง เช่นนี้มันเป็นระเบียบ
idmean

คำตอบ:


495

tel:โครงการที่ถูกนำมาใช้ในปลายปี 1990และบันทึกไว้ในช่วงต้นปี 2000 กับRFC 2806 (ซึ่งถูกจำหน่ายแล้วโดยมากขึ้นอย่างละเอียดRFC 3966ในปี 2004) และยังคงได้รับการปรับปรุง การสนับสนุนtel:บน iPhone ไม่ใช่การตัดสินใจโดยพลการ

callto:ในขณะที่ Skype สนับสนุนนั้นไม่ใช่มาตรฐานและควรหลีกเลี่ยงเว้นแต่จะกำหนดเป้าหมายไปที่ผู้ใช้ Skype โดยเฉพาะ

ผม? ฉันจะเริ่มรวมtel:URIs ที่สร้างขึ้นอย่างถูกต้องบนหน้าเว็บของคุณ (โดยไม่ต้องดมตัวแทนผู้ใช้) และรอให้โทรศัพท์ทั่วโลกที่เหลือติดตาม :)

ตัวอย่าง :

<a href="tel:+18475555555">1-847-555-5555</a>


ขอบคุณสำหรับคำตอบอย่างละเอียด! ตั้งแต่ฉันถามคำถามฉันก็ถูกล่อลวงให้ทำตามวิธีนี้เช่นกัน ใช้มาตรฐานและบอกคนที่บ่นว่าพวกเขาใช้แอพ / เครื่องมือที่ไม่ดี แม้ว่ามันจะยากขึ้น แต่ถ้านี่เป็นลูกค้าของคุณฉันคิดว่าคุณพูดถูก หากอย่างไรก็ตามฉันต้องพิจารณาผู้ใช้ Skype ฉันจะใช้โซลูชัน JavaScript ของฉันอีกทางหนึ่ง
Boldewyn

1
มันคือปี 2014 และโทรศัพท์: ตอนนี้ใช้งานได้กับ Skype แต่ถ้าคุณต้องการเริ่มต้นการโทรไปยังบริการทดสอบ Skype Echo / Sound ลิงก์นั้นจะ <a href="skype:echo123?call"> โทรหาบริการ Skype Echo / Sound Test </a> จากmsdn.microsoft com / en-us /
ไลบรารี่

4
มีใครลองhref="tel://1-555-555-5555"ฟอร์แมตไหม พวกที่มาจาก Tutsplus แนะนำมันcode.tutsplus.com/tutorials/…
เอเดรียเป็น

2
จากประสบการณ์ของฉันกับแท็ก tel: Skype ต้องใช้รหัสประเทศพร้อมเครื่องหมาย + บนหมายเลข (เช่น "+44" สำหรับหมายเลขในสหราชอาณาจักร) ในการวิเคราะห์ตัวเลขอย่างถูกต้อง ไม่เช่นนั้นจะเพิ่งเปิด Skype แต่ไม่พยายามโทรออก
ShaunUK

3
ไม่ควรเป็นตัวอย่าง: <a href="tel:+18475555555">? สังเกตเครื่องหมาย + ก่อนเริ่มต้น 1)
Stéphane

73

ผลการทดสอบของฉัน:

เรียกร้องให้:

  • Nokia Browser: ไม่มีอะไรเกิดขึ้น
  • Google Chrome: ขอให้เรียกใช้ skype เพื่อโทรไปยังหมายเลข
  • Firefox: ขอให้เลือกโปรแกรมเพื่อโทรไปยังหมายเลข
  • IE: ขอให้เรียกใช้ skype เพื่อโทรไปยังหมายเลข

โทรศัพท์:

  • Nokia Browser: กำลังทำงาน
  • Google Chrome: ไม่มีอะไรเกิดขึ้น
  • Firefox: "Firefox ไม่รู้วิธีเปิด URL นี้"
  • IE: ไม่สามารถหา URL

2
หากต้องการเพิ่มสิ่งนี้พฤติกรรมจะเหมือนกันสำหรับ Google Chrome บน Android 4.2.2 (Nexus 4) การมี Skype เวอร์ชัน Android ที่ทำงานในพื้นหลังนั้นไม่ได้ทำการเรียกไปยัง: ลิงก์ทำงาน กล่าวโดยย่อคือคุณไม่สามารถใช้ callto: ลิงก์ได้หากคุณต้องการกำหนดเป้าหมายโทรศัพท์มือถือในแต่ละนาที
aendrew

ตอนนี้ที่ chrome 35 คุณจะได้รับป๊อปอัป
pec

ใน Chrome และ Firefox (อาจ IE เช่นกัน) คุณสามารถลงทะเบียนบริการเว็บของคุณสำหรับtel:คำนำหน้าด้วยregisterProtocolHandler
Ross Rogers

คุณต้องใช้ + หมายเลขโทรศัพท์รหัสประเทศที่ใช้กับ Chrome ได้ โทร: ลิงค์ดูเหมือนจะไม่ทำงานกับ skype บนโครเมี่ยม w / o +
Stas Svishov

อัปเดตบน OSX และ Chrome: ขอให้เปิด Facetime
จูลส์

45

ทางออกที่ดีที่สุดคือการเริ่มต้นด้วยโทรศัพท์: ซึ่งทำงานบนโทรศัพท์มือถือทั้งหมด

จากนั้นใส่รหัสนี้ซึ่งจะทำงานเฉพาะเมื่อบนเดสก์ท็อปและเฉพาะเมื่อมีการคลิกลิงก์

ฉันใช้http://detectmobilebrowsers.com/เพื่อตรวจสอบเบราว์เซอร์มือถือคุณสามารถใช้วิธีการใดก็ได้ที่คุณต้องการ

if (!jQuery.browser.mobile) {
    jQuery('body').on('click', 'a[href^="tel:"]', function() {
            jQuery(this).attr('href', 
                jQuery(this).attr('href').replace(/^tel:/, 'callto:'));
    });
}

โดยพื้นฐานแล้วคุณครอบคลุมฐานทั้งหมดของคุณ

tel: ใช้งานได้กับโทรศัพท์ทุกรุ่นเพื่อเปิดตัวโทรออกด้วยหมายเลข

callto: ทำงานบนคอมพิวเตอร์ของคุณเพื่อเชื่อมต่อ skype จาก firefox, chrome


ใช่สิ่งนี้ - callto: ใช้งานไม่ได้กับ Android (ดูความคิดเห็นของฉันเกี่ยวกับคำตอบของ Murat) และโทรศัพท์: ไม่สามารถใช้งานบนเดสก์ท็อปได้ มันโชคร้ายจริงๆ
aendrew

1
อืมน่าเสียดายที่ jsfiddle ที่รวดเร็วดูเหมือนจะไม่ยอมให้งานนี้ ... jsfiddle.net/tchalvakspam/gVZYt/3
Kzqai

การทำงานกับ Seamonkey 2.20 บน Mac 10.8 ให้วาง<body <?php body_class(); ?>>โค้ดด้านล่างลงในไฟล์ header.php ของธีม wordpress
om01

callto: ไม่ทำงานสำหรับ chrome ใน mac และรุ่นล่าสุด
Ujjwal

น่าเศร้าที่สิ่งนี้ได้รับการคิดค่าเสื่อมราคาใน JQuery 1.9 jquery.com/upgrade-guide/1.9/#jquery-browser-removed
Casebash

21

อย่างที่คาดไว้การสนับสนุนของ WebKit tel:จะขยายไปยังเบราว์เซอร์มือถือ Android และ FYI


15
คงจะดีกว่าเป็นความคิดเห็น แต่ก็ดีที่จะรู้อยู่ดี
o0 '

10

ฉันเก็บคำตอบนี้เพื่อจุดประสงค์ "ประวัติศาสตร์" แต่ไม่แนะนำอีกต่อไป ดูคำตอบ @Sidnicious 'ด้านบนและอัปเดตของฉัน 2

เนื่องจากดูเหมือนว่าวาดระหว่าง callto และคนที่โทรหาฉันต้องการที่จะแก้ปัญหาที่เป็นไปได้ในความหวังว่าความคิดเห็นของคุณจะนำฉันกลับไปในทางของแสง ;-)

การใช้callto:เนื่องจากไคลเอ็นต์เดสก์ท็อปส่วนใหญ่จะจัดการกับมัน:

<a href="callto:0123456789">call me</a>

จากนั้นหากลูกค้าเป็น iPhone ให้แทนที่ลิงก์:

window.onload = function () {
  if (navigator.userAgent.match (/iPhone/i)) {
    var a = document.getElementsByTagName ("a");
    for (var i = 0; i < a.length; i++) {
      if (a[i].getAttribute ('href').search (/callto:/i) === 0) {
        a[i].setAttribute ('href', a[i].getAttribute ('href').replace (/^callto:/, "tel:"));
      }
    }
  }
};

มีข้อขัดข้องในการแก้ปัญหานี้หรือไม่? ฉันควรจะควรเริ่มต้นจากtel:?


อาจเป็นไปได้ว่า iPhone รองรับรูปแบบ callto แต่ Apple ชอบโทรศัพท์ดังนั้นจึงเป็นสิ่งที่กล่าวถึงในเอกสารประกอบ
Jan Aagaard

5
ดูคำตอบของฉัน callto:เป็นโครงการ URI ที่เป็นกรรมสิทธิ์ดังนั้นฉันจะไม่เริ่มต้นที่นั่น
s4y

callto: ไม่ได้ทำงานกับ chrome ใน mac และเวอร์ชันเป็นรุ่นล่าสุด
Ujjwal

ไม่แปลกใจเลยที่ฉัน ภูมิทัศน์แตกต่างกันโดยพื้นฐานในปี 2009 เมื่อได้รับคำตอบ นอกจากนี้คุณต้องมีโปรแกรมบุคคลที่สามที่ลงทะเบียนสำหรับcallto:โครงการเช่น Skype Chrome เองไม่รู้ว่าควรทำอย่างไร
Boldewyn

9

2
ดังนั้นหากผู้ใช้ที่กำหนดเป้าหมายหลักคือ iPhone หรือ iPod Tough (และอาจเป็นอุปกรณ์มือถืออื่น ๆ ฉันไม่รู้ ... ) คุณควรใช้โทร: หากผู้ใช้หลักคือลูกค้าเว็บปกติ (IE, Firefox ฯลฯ ) การใช้ skype หรือซอฟต์แวร์ VoIP อื่น ๆ ฉันคิดว่า callto: ดีที่สุด
กลัว

3

RFC3966กำหนด URI มาตรฐาน IETF สำหรับหมายเลขโทรศัพท์นั่นคือ 'tel:' URI นั่นคือมาตรฐาน ไม่มีมาตรฐานที่คล้ายกันที่ระบุ 'callto:' ซึ่งเป็นแบบแผนเฉพาะสำหรับ Skype บนแพลตฟอร์มที่อนุญาตให้ลงทะเบียนตัวจัดการ URI เพื่อสนับสนุน


นั่นคือสิ่งที่ Sidnicious พูดใช่
Boldewyn

3

สิ่งนี้ใช้ได้กับฉัน:

1. สร้างลิงค์ที่เป็นไปตามมาตรฐาน:

        <a href="tel:1500100900">

2. แทนที่เมื่อไม่พบเบราว์เซอร์มือถือสำหรับ skype:

$("a.phone")
    .each(function()
{ 
  this.href = this.href.replace(/^tel/, 
     "callto");
});

การเลือกลิงค์เพื่อแทนที่ผ่านคลาสนั้นมีประสิทธิภาพมากกว่า แน่นอนมันใช้ได้เฉพาะกับสมอที่มี.phoneคลาสเท่านั้น

ฉันใส่มันไว้ในฟังก์ชั่นif( !isMobile() ) { ...ดังนั้นมันจะทริกเกอร์เฉพาะเมื่อตรวจพบเบราว์เซอร์เดสก์ท็อป แต่อันนี้ล้าสมัยน่าจะเป็น ...

function isMobile() {
    return (
        ( navigator.userAgent.indexOf( "iPhone" ) > -1 ) ||
        ( navigator.userAgent.indexOf( "iPod" ) > -1 ) ||
        ( navigator.userAgent.indexOf( "iPad" ) > -1 ) ||
        ( navigator.userAgent.indexOf( "Android" ) > -1 ) ||
        ( navigator.userAgent.indexOf( "webOS" ) > -1 )
    );
}

วิธี "เหมาะสม" ในการตรวจสอบเบราว์เซอร์มือถือคือการตรวจสอบสตริงที่ไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่ "mobile"
Kevin Cox

2

ฉันใช้tel:สำหรับโครงการของฉัน

ใช้งานได้ใน Chrome, Firefox, IE9 & 8, Chrome mobile และเบราว์เซอร์มือถือในสมาร์ทโฟน Sony Ericsson ของฉัน

แต่callto:ไม่ได้ทำงานในเบราว์เซอร์มือถือ


2

ฉันจะใช้tel:(ตามที่แนะนำ) แต่เพื่อให้มีทางเลือกที่ดีกว่า / ไม่แสดงหน้าข้อผิดพลาดฉันจะใช้สิ่งนี้ (ใช้ jquery):

// enhance tel-links
$("a[href^='tel:']").each(function() {
    var target = "call-" + this.href.replace(/[^a-z0-9]*/gi, "");
    var link = this;

    // load in iframe to supress potential errors when protocol is not available
    $("body").append("<iframe name=\"" + target + "\" style=\"display: none\"></iframe>");
    link.target = target;

    // replace tel with callto on desktop browsers for skype fallback
    if (!navigator.userAgent.match(/(mobile)/gi)) {
        link.href = link.href.replace(/^tel:/, "callto:");
    }
});

สมมติฐานคือเบราว์เซอร์มือถือที่มีตราประทับมือถือใน userAgent-string มีการรองรับtel:โปรโตคอล สำหรับส่วนที่เหลือเราจะแทนที่ลิงก์ด้วยcallto:โพรโทคอลเพื่อให้ทางเลือกสำรองไปยัง Skype หากมี

ในการระงับหน้าข้อผิดพลาดสำหรับโปรโตคอลที่ไม่ได้รับการสนับสนุนลิงก์จะถูกกำหนดเป้าหมายไปยัง iframe ที่ซ่อนอยู่ใหม่

น่าเสียดายที่ไม่สามารถตรวจสอบได้หากโหลด url สำเร็จแล้วใน iframe ดูเหมือนว่าจะไม่มีเหตุการณ์ข้อผิดพลาดเกิดขึ้น


ใช้ iframes ที่ซ่อนอยู่อย่างดี!
Boldewyn

1

ตั้งแต่callto:เป็นต่อเริ่มต้นการสนับสนุนจาก Skype (ตั้งค่าในการตั้งค่า Skype) และอื่น ๆ จะยังสนับสนุนมันฉันจะแนะนำให้ใช้มากกว่าcallto:skype:


3
ที่นี่ฉันเห็นด้วย แต่ดูเหมือนว่าทั้งหมดจะรวมกันเป็น tel: vs callto: และนั่นไม่ใช่เรื่องง่าย
Boldewyn

1

แม้ว่า Apple แนะนำtel:ใน docs สำหรับ Mobile Safari แต่ปัจจุบัน (iOS 4.3) ยอมรับได้callto:เหมือนกัน ดังนั้นฉันแนะนำให้ใช้callto:บนเว็บไซต์ทั่วไปเพราะมันใช้ได้กับทั้ง Skype และ iPhone และฉันคาดว่ามันจะทำงานบนโทรศัพท์ Android ด้วย

อัปเดต (มิถุนายน 2013)

นี่เป็นเรื่องของการตัดสินใจว่าคุณต้องการให้หน้าเว็บของคุณให้อะไร ในเว็บไซต์ของฉันฉันให้ทั้งสองtel:และcallto:ลิงค์ (หลังมีข้อความว่าเป็น Skype) เนื่องจากเบราว์เซอร์เดสก์ท็อปบน Mac ไม่ได้ทำอะไรกับการtel:เชื่อมโยงในขณะที่ Android มือถือไม่ได้ทำอะไรกับการcallto:เชื่อมโยง แม้แต่ Google Chrome ที่มีปลั๊กอิน Google Talk ก็ไม่ตอบสนองต่อtel:ลิงก์ แต่ถึงกระนั้นฉันก็ชอบที่จะเสนอลิงค์ทั้งสองบนเดสก์ท็อปในกรณีที่มีใครบางคนประสบปัญหาในการรับtel:ลิงค์เพื่อทำงานบนคอมพิวเตอร์

หากการออกแบบเว็บไซต์กำหนดให้ฉันมีเพียงลิงค์เดียวฉันจะใช้tel:ลิงก์ที่ฉันจะลองเปลี่ยนเป็นcallto:บนเบราว์เซอร์เดสก์ท็อป


1
เบราว์เซอร์หุ้นในการสร้างโอเพนซอร์สล่าสุดของ Android "Ice Cream Sandwich" ยังคงปรากฏให้การสนับสนุนเท่านั้นtel:; คลิกที่callto:ลิงค์ผลลัพธ์ใน "หน้าเว็บไม่พร้อมใช้งาน"
rymo

0

ใช้ jQuery แทนที่หมายเลขโทรศัพท์สหรัฐทั้งหมดบนหน้าเว็บด้วยรูปแบบที่เหมาะสมcallto:หรือtel:แบบแผน

// create a hidden iframe to receive failed schemes
$('body').append('<iframe name="blackhole" style="display:none"></iframe>');

// decide which scheme to use
var scheme = (navigator.userAgent.match(/mobile/gi) ? 'tel:' : 'callto:');

// replace all on the page
$('article').each(function (i, article) {
    findAndReplaceDOMText(article, {
        find:/\b(\d\d\d-\d\d\d-\d\d\d\d)\b/g,
        replace:function (portion) {
            var a = document.createElement('a');
            a.className = 'telephone';
            a.href = scheme + portion.text.replace(/\D/g, '');
            a.textContent = portion.text;
            a.target = 'blackhole';
            return a;
        }
    });
});

ขอบคุณ @jonas_jonas สำหรับความคิด ต้องดีฟังก์ชั่น findAndReplaceDOMText


1
วิธีการแก้ปัญหานี้ไม่เหมาะเนื่องจากการวิเคราะห์สตริงตัวแทนผู้ใช้ถือเป็นแนวปฏิบัติที่ไม่ดี พิจารณาอุปกรณ์ที่รองรับtelURI แต่ไม่ได้รายงานตัวเองว่าเป็นมือถือ
Arturo Torres Sánchez

-1

ฉันใช้<a href="tel:+123456">12 34 56</a>มาร์กอัปปกติและทำให้ลิงก์ที่ไม่สามารถคลิกได้สำหรับผู้ใช้เดสก์ท็อปผ่านpointer-events: none;

a[href^="tel:"] {
    text-decoration: none;
}
.no-touch a[href^="tel:"] {
    pointer-events: none;
    cursor: text;
}

สำหรับเบราว์เซอร์ที่ไม่สนับสนุนตัวชี้เหตุการณ์ (IE <11) การคลิกสามารถป้องกันได้ด้วย JavaScript (ตัวอย่างอาศัย Modernizr และ jQuery):

if(!Modernizr.touch) {
    $(document).on('click', '[href^="tel:"]', function(e) {
        e.preventDefault();
        return false;
    });
}

1
การใช้งานModernizr.touchใดคือการสนับสนุน Touch Eventเพื่ออนุมานว่าการรองรับtel:นั้นไม่น่าเชื่อถือ กรณียกเว้นง่าย ๆ : iPad, แท็บเล็ต Windows, ฯลฯ
zachleat

แม้แต่ Chrome ที่ทำงานบนเดสก์ท็อป Windows ก็รายงานตัวเองว่าเป็นอุปกรณ์ระบบสัมผัส
Arturo Torres Sánchez

เครื่องเดสก์ท็อปบางเครื่องรองรับ tel: urls สำหรับตัวอย่างเฉพาะของ Mac FaceTime บน Mac นั้นเป็นมาตรฐานและใช้งานได้กับโทรศัพท์: จนถึงการใช้ iPhone ของผู้ใช้ด้วย Handoff / Continuity ดังนั้นการใช้ตัวชี้เหตุการณ์: ไม่มีเป้าหมายเดสก์ท็อปอาจไม่ควรทำอีกต่อไป .
OxC0FFEE
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.