JSFiddle - React, Tailwind, and code Playground
HTML
<!doctype html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
<body>
<a href="http://www.bliayad.org/articles/articles.htm">文章來源:http://www.bliayad.org/articles/articles.htm</a><br>
僅供學術使用<br>
#----div1開始
<div id="div1">
<input id="search_str" type="text">
<input type="button" value="搜尋" onclick="goSearch(document.getElementById('div1'),document.getElementById('search_str').value)">
<h1>何苦要第一名</h1>
<h2>來源:網路流傳</h2>
<p>老同學交了新女友,卻經常有空。<br>
000<br>
false<br>
null<br>
疊疊重複重複重複重複疊疊疊疊疊疊疊字疊字重複疊疊<br>
聽老同學說,他倆感情很要好,彼此心屬,極有婚嫁的契機。<br>
<object width="480" height="385"><param name="movie" value="http://www.youtube.com/v/thOdWgS2B4s&hl=zh_TW&fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/thOdWgS2B4s&hl=zh_TW&fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480"...
JavaScript
function goSearch(target,search_str)
{
reverse_str(target);
if(search_str!='')
search(target,search_str);
}
function reverse_str(target)
{
var tag, textNode, preText, nextText;
var bt=[];
if(target.getElementsByClassName)
bt=target.getElementsByClassName('boldTag4Search');
else if(target.querySelectorAll)
bt=target.querySelectorAll('b.boldTag4Search');
else
{
var allTag=target.getElementsByTagName('b');
for(var i in allTag)
if(allTag[i].className=='boldTag4Search')
bt.push(allTag[i]);
}
for(var i=bt.length-1;i>=0;i--)
{
tag=bt[i];
preText=getNeighbor(tag.previousSibling);
nextText=getNeighbor(tag.nextSibling);
//還原時必須把前後的textNode合併
textNode=document.createTextNode((preText + (tag.textContent ? tag.textContent : tag.innerText) + nextText));
tag.parentNode.replaceChild(textNode, tag);
}
}
function getNeighbor(tag)
{
if(tag==null || tag.nodeName!='#text')
return '';
var ret=tag.nodeValue;
tag.parentNode.removeChild(tag);
return ret;
}
function search(target,search_str)
{
var _tag,tag=target.firstChild;
var re= new RegExp('('+search_str+')+','g');
var matchs,splits,newNode;
do
{
if(tag.hasChildNodes())
search(tag,search_str);
if(tag.nodeName=='#text' && (matchs=tag.nodeValue.match(re))) //用regexp是為了可找出疊字或字串連續疊字
{
splits=tag.nodeValue.replace(re,search_str).split(search_str); //把疊字取代成為單個搜尋字串,這樣可以把疊字放在同一個<b></b>內
for(var i in splits)
{
if(splits[i]!='')
tag.parentNode.insertBefore(document.createTextNode(splits[i]),tag);
if(matchs[i]==null) //若一個textNode中有n個搜尋字,則regexp會match出n個結果,split會拆出n+1個,所以這邊要檢查index
continue;
newNode=document.createElement('b');
newNode.className='boldTag4Search';
...