1$(window).on('load', function() { 2 3 // ã¹ããã»ã¿ãã¬ããã®ã¿å¦ç 4 const userAgent = window.navigator.userAgent.toLowerCase(); 5 6 if ((userAgent.indexOf('iphone') > -1 || 7 userAgent.indexOf('android') > -1 || 8 userAgent.indexOf('ipad') > -1 || userAgent.indexOf('macintosh') > -1 || 9 userAgent.indexOf('windows phone') > -1) 10 && 'ontouchend' in document) { 11 12 // é»è©±çªå·ã«telãªã³ã¯ãä»ããå¦ç 13 14 // JavaScriptã®closestã¡ã½ãããIE対å¿ãããããã®ããªãã£ã« 15 //ï¼ã¹ããã»ã¿ãã¬ããã®ã¿ã®å¦çã§ã¯ããããPC対å¿ãã§ããããã«ï¼ 16 // https://developer.mozilla.org/ja/docs/Web/API/Element/closest#Polyfill 17 if (!Element.prototype.matches) { 18 Element.prototype.matches = Element.prototype.msMatchesSelector || 19 Element.prototype.webkitMatchesSelector; 20 } 21 22 if (!Element.prototype.closest) { 23 Element.prototype.closest = function(s) { 24 var el = this; 25 26 do { 27 if (Element.prototype.matches.call(el, s)) return el; 28 el = el.parentElement || el.parentNode; 29 } while (el !== null && el.nodeType === 1); 30 return null; 31 }; 32 } 33 34 /** 35 * 以ä¸ã®å¤æ°ï¼no_number_beforeã¨no_number_afterï¼ããé»è©±çªå·ãã¿ã¼ã³ã®åå¾ã«ä»ãããã¨ãæ¨å¥¨ã 36 * é»è©±çªå·ãã¿ã¼ã³ã®åå¾ã«æ°åãããæã¯ãé»è©±çªå·ã¨è¦ãªããªãããã«ããããã 37 * ï¼ä¾ï¼00XX-0000-0000âãã®æ°åã®ä¸¦ã³ã¯é»è©±çªå·ã ã¨ããããªãããXX-0000-0000é¨åãé»è©±çªå·ãã¿ã¼ã³ã¨ãã¦å¼ã£ããã£ã¦ãã¾ãã 38 * 39 * ããããIEã»Safariã§ã¯æ£è¦è¡¨ç¾ã®å¾èªã¿ã使ããªããããªã®ã§no_number_beforeã«(?<![0-9])ãä»£å ¥ããã»ãã¯ã³ã¡ã³ãã¢ã¦ããã¦ããã¾ãã 40 * ãã£ã¦ãç´åã«æ°åãããæã¯é»è©±çªå·ã§ã¯ãªããã®ã«å¼ã£ããããã¨ãããç¶æ ã§ãã 41 * IEã»Safariã§å¾èªã¿ã使ããããã«ãªã£ãå ´åã¯'(?<![0-9])'ãä»£å ¥ãã¦ããè¡ãæå¹ã«ããä¸ã®ç©ºæåä»£å ¥ãã¦ãè¡ãç¡å¹ã«ãããã¨ã§ãç´åã«æ°åãããé»è©±çªå·ãã¿ã¼ã³ã«å¼ã£ããããã¨ãé²ãã¾ãã 42 */ 43 // const no_number_before = '(?<![0-9])'; 44 const no_number_before = ''; 45 const no_number_after = '(?![0-9])'; 46 47 /** 48 * 以ä¸ã®åºå®é»è©±çªå·ã«ãããããæ£è¦è¡¨ç¾ 49 * å¸å¤å±çªã®1æ¡ç®ã¯1ï½9ãå¸å å±çªã®1æ¡ç®ã¯2ï½9 50 * 0X-XXXX-XXXX,0XX-XXX-XXXX,0XXX-XX-XXXX,0XXXX-X-XXXX 51 * (0X)XXXX-XXXX,(0XX)XXX-XXXX,(0XXX)XX-XXXX,(0XXXX)X-XXXX 52 * 0X(XXXX)XXXX,0XX(XXX)XXXX,0XXX(XX)XXXX,0XXXX(X)XXXX 53 */ 54 const landline_number = no_number_before + '0([1-9]-[2-9][0-9]{3}|[1-9][0-9]-[2-9][0-9]{2}|[1-9][0-9]{2}-[2-9][0-9]|[1-9][0-9]{3}-[2-9])-[0-9]{4}' + no_number_after; 55 const landline_number_brackets_front = no_number_before + '\\(0([1-9]\\)[2-9][0-9]{3}|[1-9][0-9]\\)[2-9][0-9]{2}|[1-9][0-9]{2}\\)[2-9][0-9]|[1-9][0-9]{3}\\)[2-9])-[0-9]{4}' + no_number_after; 56 const landline_number_brackets_center = no_number_before + '0([1-9]\\([2-9][0-9]{3}|[1-9][0-9]\\([2-9][0-9]{2}|[1-9][0-9]{2}\\([2-9][0-9]|[1-9][0-9]{3}\\([2-9])\\)[0-9]{4}' + no_number_after; 57 58 /** 59 * 以ä¸ã®æºå¸¯é»è©±çªå·ã«ãããããæ£è¦è¡¨ç¾ 60 * 070-XXXX-XXXX,080-XXXX-XXXX,090-XXXX-XXXX 61 * (070)XXXX-XXXX,(080)XXXX-XXXX,(090)XXXX-XXXX 62 * 070(XXXX)XXXX,080(XXXX)XXXX,090(XXXX)XXXX 63 */ 64 const mobile_number = no_number_before + '0[789]0-[0-9]{4}-[0-9]{4}' + no_number_after; 65 const mobile_number_brackets_front = no_number_before + '\\(0[789]0\\)[0-9]{4}-[0-9]{4}' + no_number_after; 66 const mobile_number_brackets_center = no_number_before + '0[789]0\\([0-9]{4}\\)[0-9]{4}' + no_number_after; 67 68 /** 69 * 以ä¸ã®IPé»è©±çªå·ã«ãããããæ£è¦è¡¨ç¾ 70 * 050-XXXX-XXXX 71 * (050)XXXX-XXXX 72 * 050(XXXX)XXXX 73 */ 74 const ip_number = no_number_before + '050-[0-9]{4}-[0-9]{4}' + no_number_after; 75 const ip_number_brackets_front = no_number_before + '\\(050\\)[0-9]{4}-[0-9]{4}' + no_number_after; 76 const ip_number_brackets_center = no_number_before + '050\\([0-9]{4}\\)[0-9]{4}' + no_number_after; 77 78 /** 79 * 以ä¸ã®ããªã¼ãã¤ã¤ã«ã«ãããããæ£è¦è¡¨ç¾ 80 * 0120-XXX-XXX 81 * (0120)XXX-XXX 82 * 0120(XXX)XXX 83 */ 84 const free_number = no_number_before + '0120-[0-9]{3}-[0-9]{3}' + no_number_after; 85 const free_number_brackets_front = no_number_before + '\\(0120\\)[0-9]{3}-[0-9]{3}' + no_number_after; 86 const free_number_brackets_center = no_number_before + '0120\\([0-9]{3}\\)[0-9]{3}' + no_number_after; 87 88 // ä¸è¨å ¨ã¦ã®é»è©±çªå·ãã¿ã¼ã³ 89 const tel_pattern = new RegExp(landline_number+"|"+landline_number_brackets_front+"|"+landline_number_brackets_center+"|"+mobile_number+"|"+mobile_number_brackets_front+"|"+mobile_number_brackets_center+"|"+ip_number+"|"+ip_number_brackets_front+"|"+ip_number_brackets_center+"|"+free_number+"|"+free_number_brackets_front+"|"+free_number_brackets_center,"g"); 90 91 // æååãNodeListã«å¤æãã颿° 92 function convertHtml(text){ 93 const div = document.createElement("div"); 94 div.innerHTML = '<div>
94' + text + '</div>'; 95 return div.firstChild.childNodes; 96 } 97 98 // é»è©±çªå·ã®ãã¿ã¼ã³ãå«ã¾ããããã¹ããã¼ããåå¾ 99 const nodeIterator = document.createNodeIterator( 100 document.body, 101 NodeFilter.SHOW_TEXT, 102 function (node) { 103 let is_match = tel_pattern.test(node.nodeValue); 104 if(is_match) { 105 let hoge = tel_pattern.test(node.nodeValue); //ãããæãã¨ä½æ ãåãï¼ãããæ¸ããªãã¨iPhoneã®Safariã¨IEã§ä¸é¨ãªã³ã¯ãä»ããªããªãï¼ 106 return NodeFilter.FILTER_ACCEPT; 107 } else { 108 return NodeFilter.FILTER_REJECT; 109 } 110 }, 111 null 112 ); 113 114 let node; 115 while (node = nodeIterator.nextNode()) { 116 117 // HTMLæ§é ããããããªãç®æã¯ç½®ãæããªã 118 if (!node.parentNode.closest('a') && 119 !node.parentNode.closest('button') && 120 node.parentNode.tagName !== 'A' && 121 node.parentNode.tagName !== 'BUTTON' && 122 node.parentNode.tagName !== 'OPTION') { 123 124 // æ¬æä¸ã®<>ãã¿ã°ã¨ãã¦èªèãããªãããã«å®ä½åç §ã«ç½®ãæãã 125 node.textContent = node.textContent.replace(/</g, '<'); 126 node.textContent = node.textContent.replace(/>/g, '>'); 127 128 // ç½®ãæããã¹ãHTMLããã¹ã 129 const replaceHTML= node.textContent.replace(tel_pattern, function (match) { 130 return '<a href="tel:' + match.replace(/[\(\)-]/g, "") + '">' + match + '</a>'; 131 }); 132 133 // ç½®ãæããã¹ãDOMãªãã¸ã§ã¯ã 134 const replaceNodeLists = convertHtml(replaceHTML); 135 136 // DOMãç½®æãã 137 138 // IEã§ã¯foræã§letã®æåãããããå¯è½æ§ãããã®ã§varã§å¯¾å¿ã 139 // iã¨ããã¨ãããã夿°åããã¶ãã¥ããããã«replaceNodeListsIndexã¨é·ãã«ãã¾ããã 140 for (var replaceNodeListsIndex = 0; replaceNodeListsIndex < replaceNodeLists.length; replaceNodeListsIndex++) { 141 const newNode = replaceNodeLists[replaceNodeListsIndex].cloneNode(true); 142 node.parentNode.insertBefore(newNode, node); 143 } 144 node.parentNode.removeChild(node); 145 } 146 } 147 } 148});
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.