あるクラスを持っている要素のなかにaタグの付いていない電話番号があれば、
その電話番号部分にだけaタグをつけたいです。
今のところ、電話番号を囲むクラスに「telNumberParent」というクラスをつけて
そのクラスを持つ要素のテキストをinnerHTMLで取得し、
電話番号のパターンの正規表現で検索し、
aタグ付きに置換する処理をしています。(下記コード参照)
しかし、子要素にaタグを持っている要素にこの処理を行うと、
子要素のaタグにもaタグをつける処理になってしまい、HTML構造がおかしくなります。
なので、telNumberParentクラスを持っている直下のテキストノードだけを対象に
aタグをつける処理を行えないか考えているのですが、思いつきません。
わかる方、もしくは代替案などある方いたら教えていただきたいです。
よろしくお願いいたします。
※HTMLは一例です。どんな構造のHTMLにも対応させたいです。
【追記】
添付画像1枚目が、aタグに対しても処理してしまった結果、
aタグが重複した状態です。これを回避したいです。
添付画像2枚目が、処理したい範囲を表したものです。
今は、赤枠全体を対象に処理していますが、
黄枠だけ(直下のテキストノードだけ)で処理したいです。
html
1<body> 2 <div class="wrapper"> 3 <p>000-5623-0000</p> 4 <div> 5 <p>電話番号は000-1166-0000</p> 6 <p class="test"><p>000-0000-0000</p></p> 7 <p>000-0000-0000</p> 8 </div> 9 <form action=""> 10 <input type="text" value="000-5555-5555"> 11 <select name="" id=""> 12 <option value="">000-9999-9999</option> 13 </select> 14 </form> 15 <p> 16 あいうえお000-0000-6980 17 000-0000-6980 18 000-0000-6980かきくけこ 19 <span> 20 000-0000-0000 21 <a href="#">000-0000-0000</a> 22 <span> 23 000-0000-0000 24 </span> 25 </span> 26 </p> 27 <a href="">test000-0000-0000</a> 28 <p>000-0000-0000</p> 29 </div> 30 <script src="https://code.jquery.com/jquery-2.2.4.min.js" 31 integrity="sha256-BbhdlvQf/xTY9gja0Dq3HiwQF8LaCRTXxZKRutelT44=" crossorigin="anonymous"></script> 32 <script src="test.js"></script> 33</body>
javascript
1const tel_pattern = /\d{3}-\d{4}-\d{4}/; 2 3const nodeIterator = document.createNodeIterator( 4 document.body, 5 NodeFilter.SHOW_TEXT, 6 function (node) { 7 return /\d{3}-\d{4}-\d{4}/g.test(node.nodeValue) ? 8 NodeFilter.FILTER_ACCEPT : 9 NodeFilter.FILTER_REJECT; 10 } 11); 12 13let node; 14while (node = nodeIterator.nextNode()) { 15 node.parentNode.classList.add('telNumberParent'); 16} 17 18const hoge = document.querySelectorAll('.telNumberParent'); 19 20for (let i = 0; i < hoge.length; i++) { 21 if (!hoge[i].closest('a') && 22 !hoge[i].closest('button') && 23 hoge[i].tagName !== 'OPTION') { 24 hoge[i].innerHTML = 25 hoge[i].innerHTML.replace(/\d{3}-\d{4}-\d{4}/g, function (match) { 26 return '<a href="tel:' + match.replace(/-/g, "") + '">' + match + '</a>'; 27 }); 28 } 29}
回答2件
あなたの回答
tips
プレビュー