实现百度搜索关键字在网页中匹配字符高亮显示效果

/*说明:使用如下代码复制到网页文件,并在存放如下代码文件目录添加一个JQuery库即可*/

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta content="text/html; charset=UTF-8" http-equiv="content-type" />

    <script src="jquery.min.js" type="text/javascript"></script>
    <title>关键搜索</title>
    <style type="text/css">
        .keyword
        {
            color: Red;
        }
        .content
        {
            width: 500px;
            height: 200px;
            border: 1px solid Black;
        }
    </style>
</head>
<body>
    <div stye="width:80px;height:20px">
        <label for="input">
            关键字符:</label><input type="text" id="input" /><input type="button" id="btnSearch"
                value="搜索" /></div>
    <br />
    <br />
    <div id="content" class="content">
        * 科技部否认中国部分军费隐藏在科技项目中 * [回应税负高:不能简单与国外比] [宗庆后:取消工薪阶层个税 拉动消费] * [上海市委书记:房价过高是不争事实]
        [女记者提问环境问题时哽咽] * 卫生部司长:灰霾之下无法呼吸谈何幸福中国 * 四万亿决策内幕首曝光 财政部长称我兜里没钱了 * 证监会否认郭树清调任中投:媒体不会更早得知
        * 张春贤:我也尝过切糕 一小块能买房之说不实 * 军委副主席范长龙:听党指挥是中国军队命根子 * 中国去年进口数千万吨转基因大豆用于榨油 * 住建部官员:出售5年以上唯一住房仍可免征个税
        test ,demo key search t;
    </div>
</body>

<script type="text/javascript">

    (function() {//扩展javascript按类选择匹配DOM节点方法
        window['Sy'] = {};
        //获许指定标签下Class名
        function getElementsByClassName(className, tag) {
            var allTags = document.getElementsByTagName(tag);
            var matchingElements = new Array();

            className = className.replace(/\-/g, "\\-");
            var regex = new RegExp("(^|\\s)" + className + "(\\s|$)");

            var element;
            for (var i = 0; i < allTags.length; i++) {
                element = allTags[i];
                if (regex.test(element.className)) {
                    matchingElements.push(element);
                }
            }
            return matchingElements;
        }
        window['Sy']['getElementsByClassName'] = getElementsByClassName;
    })();

    String.prototype.trim = function() {//在String的原型对象上扩展trim方法
        //1.去掉字符串中首尾空格*/
        retval = this.replace(/(^\s*)|(\s*$)/g, "");
        //2.字符串中间连续多少空格只保留一个空格
        return retval.replace(/(\s){2,}/g, " ");
    }

    function highlightWord(node, word) {
        // 判断是否有子节点
        if (node.hasChildNodes) {

            for (var index = 0; index < node.childNodes.length; index++) {
                //递归调用highlightWord方法
                highlightWord(node.childNodes[index], word);
            }
        }

        //获文本信息
        // var nitext = node.innerText;
       
       var nitext =($(node).text()).replace(/\f\r\t\n/img, "").replace(/(\s){1,}/g, "");
       
        var tempWordVal = word.toLowerCase();


        // 处理当前节点
        if (node.nodeType == 3) { //若是文本节点
            var tempNodeVal = node.nodeValue.toLowerCase();
            if (tempNodeVal.indexOf(tempWordVal) != -1) {
                var pn = node.parentNode;

                if (pn.className != "keyword" || pn.className == "none") {//若不存在样式searchword,则加上

                    var nv = node.nodeValue;
                    var ni = tempNodeVal.indexOf(tempWordVal);

                    //截取关键字以前部分的字符串,并创建文本节点
                    var before = document.createTextNode(nv.substr(0, ni));
                    //原始关键部分
                    var docWordVal = nv.substr(ni, word.length);
                    //截取关键字后剩下的字符串,并创建文本节点
                    var after = document.createTextNode(nv.substr(ni + word.length));

                    // 创建关键文本节点,并创建文本节点
                    var hiwordtext = document.createTextNode(docWordVal);
                    //创建span节点
                    var hiword = document.createElement("span");
                    //设置样式
                    hiword.className = "keyword";

                    //追加关键字节点
                    hiword.appendChild(hiwordtext);


                    pn.insertBefore(before, node);

                    pn.insertBefore(hiword, node);

                    pn.insertBefore(after, node);

                    pn.removeChild(node);
                }
            }
        } else if (node.className && (node.className === "none") && (nitext && nitext === tempWordVal)) {
            node.className = "keyword";//解决包装后的关键字符节点样式问题
        } else { //alert("");
        }
    }

    function keySearchHighlight(keywords) {
        for (var index = 0; index < keywords.length; index++) {
            highlightWord(document.getElementsByTagName("body")[0], keywords[index]);
        }
    }


    document.getElementById("btnSearch").onclick = function() {//注册搜索事件

        var inputnode = document.getElementById("input");
        var contentnode = document.getElementById("content");

        var input = inputnode.value.trim(); //获取输入的关键字符
        var keywords = keywords || []; //新建存储关键数组

        if (input && content) {
            input = input.split(' ');
            for (var index = 0; index < input.length; index++) {
                keywords.push(input[index]);
            }

            //清除之前设置的样式
            var addedClsNodes = Sy.getElementsByClassName("keyword", "span");
            for (var index in addedClsNodes) {
                addedClsNodes[index].className = "none";//设置成为存在的属性
            }

            keySearchHighlight(keywords);

        } else {
            alert("关键字符未输入");
        }
    }
</script>

</html>

 

 

 

posted @ 2013-03-08 09:33  haikuang  阅读(1585)  评论(1)    收藏  举报