Sunday, August 4, 2013

JQuery Find and Highlight Text

HTML, CSS & jQuery

<!DOCTYPE html>
<html dir="ltr">
<head>
<meta charset="utf-8">
<title>jQuery Find and Highlight Text</title>
<style>
body {
  background-color:white;
  padding:40px 10px 10px;
  font:normal normal 13px/1.4 Arial,Sans-Serif;
  color:black;
}
.text-finder {
  position:fixed;
  top:0;
  right:0;
  left:0;
  z-index:999;
  background-color:white;
  border-bottom:1px solid gray;
  padding:5px 6px;
  box-shadow:0 1px 2px rgba(0,0,0,.4);
}
.highlight {
  background-color:yellow; /* highlight color */
  font-weight:bold;
}
</style>
<script src="//code.jquery.com/jquery-2.0.2.js"></script>
<script>
/*!
 highlight v4
 Highlights arbitrary terms.
 <http://johannburkard.de/blog/programming/javascript/highlight-javascript-text-higlighting-jquery-plugin.html>
 MIT license.
 Johann Burkard
 <http://johannburkard.de>
 <mailto:jb@eaio.com>
*/
(function($) {
    $.fn.highlight = function(pat) {
        function innerHighlight(node, pat) {
            var skip = 0;
            if (node.nodeType == 3) {
                var pos = node.data.toUpperCase().indexOf(pat);
                if (pos >= 0) {
                    var spannode = document.createElement('span');
                    spannode.className = 'highlight';
                    var middlebit = node.splitText(pos);
                    var endbit = middlebit.splitText(pat.length);
                    var middleclone = middlebit.cloneNode(true);
                    spannode.appendChild(middleclone);
                    middlebit.parentNode.replaceChild(spannode, middlebit);
                    skip = 1;
                }
            } else if (node.nodeType == 1 && node.childNodes && !/(script|style)/i.test(node.tagName)) {
                for (var i = 0; i < node.childNodes.length; ++i) {
                    i += innerHighlight(node.childNodes[i], pat);
                }
            }
            return skip;
        }
        return this.length && pat && pat.length ? this.each(function() {
            innerHighlight(this, pat.toUpperCase());
        }) : this;
    };
    $.fn.removeHighlight = function() {
        return this.find("span.highlight").each(function() {
            this.parentNode.firstChild.nodeName;
            with (this.parentNode) {
                replaceChild(this.firstChild, this);
                normalize();
            }
        }).end();
    };
})(jQuery);

// Text finder form function
(function($) {
    $(document).ready(function() {
        var $finder = $('#text-finder'),
            $field = $finder.children().first(),
            $clear = $field.next(),
            $area = $(document.body),
            $viewport = $('html, body');
        $field.on("keyup", function() {
            $area.removeHighlight().highlight(this.value); // Highlight text inside `$area` on keyup
            $viewport.scrollTop($area.find('span.highlight').first().offset().top - 50); // Jump the viewport to the first highlighted term
        });
        $clear.on("click", function() {
            $area.removeHighlight(); // Remove all highlight inside `$area`
            $field.val('').trigger("focus"); // Clear the search field
            $viewport.scrollTop(0); // Jump the viewport to the top
            return false;
        });
    });
})(jQuery);
</script>
</head>
<body>

<form id="text-finder" class="text-finder" action="javascript:;">
    <input type="text" placeholder="Find...">
    <input type="reset" value="&times;">
</form>

Content goes here...

</body>
</html>

Lihat Demo

Labels: , , ,

21 Comments:

At Sunday, August 4, 2013 at 10:24:00 AM GMT+7, Blogger Unknown said...

ini seperti ctrl + f di blogger ya mas??
terus yang aku mau tanyain,semisal, text-finder yang berada di atas,itu dihide dulu
terus baru dimunculkan bisa mas??

 
At Sunday, August 4, 2013 at 8:26:00 PM GMT+7, Anonymous Anonymous said...

Ini fungsinya buat apa mas ? :D

 
At Monday, August 5, 2013 at 9:40:00 AM GMT+7, Blogger Ardy said...

minta penjelasan dong mas,, masih pemula nieh saya :D

Terima kasih mas,, 0:)

 
At Monday, August 5, 2013 at 9:46:00 AM GMT+7, Blogger Ardy said...

oiya mas, dipasangnya dimana yaa?? :D

 
At Monday, August 5, 2013 at 10:20:00 AM GMT+7, Blogger M. Alex Joenaedi said...

Keren sekali mas text-finder nya,...
semisal saya ingin menerapkannya diatas postingan gimana tu mas...???

 
At Monday, August 5, 2013 at 10:21:00 AM GMT+7, Blogger budkalon said...

simpan aja kode itu di atas <div class="post-body entry-content"

 
At Monday, August 5, 2013 at 3:27:00 PM GMT+7, Blogger budkalon said...

Jadinya seperti ini:

<style>
body {
background-color:white;
padding:40px 10px 10px;
font:normal normal 13px/1.4 Arial,Sans-Serif;
color:black;
}
.text-finder {
position:fixed;
top:0;
right:0;
left:0;
z-index:999;
background-color:white;
border-bottom:1px solid gray;
padding:5px 6px;
box-shadow:0 1px 2px rgba(0,0,0,.4);
}
.highlight {
background-color:yellow; /* highlight color */
font-weight:bold;
}
</style>
<script src="http://code.jquery.com/jquery-2.0.2.js"></script>
<script>
/*!
highlight v4
Highlights arbitrary terms.
<http://johannburkard.de/blog/programming/javascript/highlight-javascript-text-higlighting-jquery-plugin.html>
MIT license.
Johann Burkard
<http://johannburkard.de>
<mailto:jb@eaio.com>
*/
//<![CDATA[
(function($) {
jQuery.fn.highlight = function(pat) {
function innerHighlight(node, pat) {
var skip = 0;
if (node.nodeType == 3) {
var pos = node.data.toUpperCase().indexOf(pat);
if (pos >= 0) {
var spannode = document.createElement('span');
spannode.className = 'highlight';
var middlebit = node.splitText(pos);
var endbit = middlebit.splitText(pat.length);
var middleclone = middlebit.cloneNode(true);
spannode.appendChild(middleclone);
middlebit.parentNode.replaceChild(spannode, middlebit);
skip = 1;
}
} else if (node.nodeType == 1 && node.childNodes && !/(script|style)/i.test(node.tagName)) {
for (var i = 0; i < node.childNodes.length; ++i) {
i += innerHighlight(node.childNodes[i], pat);
}
}
return skip;
}
return this.length && pat && pat.length ? this.each(function() {
innerHighlight(this, pat.toUpperCase());
}) : this;
};
jQuery.fn.removeHighlight = function() {
return this.find("span.highlight").each(function() {
this.parentNode.firstChild.nodeName;
with (this.parentNode) {
replaceChild(this.firstChild, this);
normalize();
}
}).end();
};
})(jQuery);

// Text finder form function
$(document).ready(function() {
var $finder = $('#text-finder'),
$field = $finder.children().first(),
$clear = $field.next(),
$area = $(document.body),
$viewport = $('html, body');
$field.on("keyup", function() {
$area.removeHighlight().highlight(this.value); // Highlight text inside `$area` on key up
$viewport.scrollTop($area.find('span.highlight').first().offset().top - 50); // Jump the viewport to the first highlighted term
});
$clear.on("click", function() {
$area.removeHighlight(); // Remove all highlight inside `$area`
$field.val('').trigger("focus"); // Clear the search field
$viewport.scrollTop(0); // Jump the viewport to the top
return false;
});
});
//]]>
</script>

<form id="text-finder" class="text-finder" action="javascript:;">
<input type="text" placeholder="Find...">
<input type="reset" value="&times;">
</form>

<div class="post-body entry-content" id="xxx">

 
At Tuesday, August 6, 2013 at 11:56:00 AM GMT+7, Blogger M. Alex Joenaedi said...

Waduh Terimaksih banyak mas Dzulmar Ismail Hijra atas pencerahannya,
saya ijin praktek

 
At Wednesday, August 7, 2013 at 7:56:00 AM GMT+7, Blogger abang ichal said...

ya sama sama mas

 
At Thursday, August 8, 2013 at 1:38:00 PM GMT+7, Blogger Ivan Mantovani S said...

mas, kok sya belum dikirimi email dari mas terkait pemesanan template ? ._.

 
At Thursday, August 8, 2013 at 1:39:00 PM GMT+7, Blogger Ivan Mantovani S said...

email saya ivanmantovani7@gmail.com

 
At Friday, August 9, 2013 at 12:04:00 AM GMT+7, Blogger Taufik said...

MINAL AIDIN WALFAIDZIN MOHON MAAF LAHIR DAN BATIN
SELAMAT HARI RAYA IDUL FITRI

 
At Tuesday, August 27, 2013 at 3:57:00 PM GMT+7, Blogger Fajrin said...

duh.. ane kagak ngerti mas :D

 
At Friday, September 6, 2013 at 10:30:00 PM GMT+7, Anonymous Anonymous said...

Tampilan demo nya sangat menarik kang, tapi klw js nya sebanyak itu saya rasa hnya akan memperlambat blog....

 
At Monday, October 7, 2013 at 7:29:00 PM GMT+7, Blogger Unknown said...

srius ngga ngerti gw apa yg dimaksud dgn post diatas :v

 
At Friday, October 18, 2013 at 10:44:00 PM GMT+7, Blogger no data said...

yah saya kurang nerti mas :D
- salam damai -

 
At Friday, October 25, 2013 at 10:55:00 AM GMT+7, Blogger Imron Fhatoni said...

tak coba dulu mas

 
At Monday, December 2, 2013 at 9:21:00 PM GMT+7, Blogger you said...

saya coba integrasikan dengan pencarian

 
At Tuesday, December 3, 2013 at 7:18:00 PM GMT+7, Blogger you said...

akhirnya sudah bisa...

 
At Saturday, April 27, 2019 at 7:54:00 PM GMT+7, Anonymous Anonymous said...

Mas Taufik, kalau find next gimana caranya ya? Nggak cuma dipindah ke hasil pencarian pertama, tetapi dapat digulirkan ke teks selanjutnya yang sama dengan isian formulir? Mohon bantuanya mas saya nggak paham script.

 
At Wednesday, May 8, 2019 at 5:18:00 AM GMT+7, Blogger Kang Rian said...

Nyimak..

 

Post a Comment

<< Home