My html looks like this
<input id="txt" value=""></input>
<div class="link-item">jK</div>
<div class="link-item">JFOO</div>
my js
$('#txt').keyup(function(){
var txtsearch = $('#txt').val();
var filt = $("div.link-item:contains('" + txtsearch +"')");
$("div.link-item").css("display", "none")
.filter(filt)
.css("display", "block");
});
I'm looking to filter content dynamically on the client side. When I type a capital j, it only returns the second div whereas I want to get all div that contain j whether upper or lower case.
jQuery attribute value selectors are generally case-sensitive.
jQuery :contains() SelectorThe :contains() selector selects elements containing the specified string. The string can be contained directly in the element as text, or in a child element. This is mostly used together with another selector to select the elements containing the text in a group (like in the example above).
To check if a div element contains specific text:Use the textContent property on the element to get the text content of the element and its descendants. Use the includes() method to check if the specific text is contained in the div . If it is, the includes() method returns true , otherwise false is returned.
You can change the .contains
filter to be case insensitive or create your own selector.
jQuery.expr[':'].icontains = function(a, i, m) {
return jQuery(a).text().toUpperCase()
.indexOf(m[3].toUpperCase()) >= 0;
};
This creates a new selector: icontains (or you could name it insensitive-contains, or whatever suits your fancy).
It's usage would be the same as contains: $('div:icontains("Stack")');
would match:
<div>stack</div>
<div>Stack</div>
<div>StAcKOverflow</div>
Or override the existing .contains
filter:
jQuery.expr[':'].contains = function(a, i, m) {
return jQuery(a).text().toUpperCase()
.indexOf(m[3].toUpperCase()) >= 0;
};
With this in place,
$("div:contains('John')");
would select all three of these elements:
<div>john</div>
<div>John</div>
<div>hey hey JOHN hey hey</div>
Why not use the filter
function, and pass in a function that uses a case insensitive regex?
var filteredDivs = $("div.link-item").filter(function() {
var reg = new RegExp(txtsearch, "i");
return reg.test($(this).text());
});
DEMO
Here is my contribution, hope it helps :)
$('#txt').keyup(function() {
var query = $(this).val();
$("div.link-item")
.hide()
.filter(':contains("' + query + '")')
.show();
});
The :contains() selector is case sensitive.
The matching text can appear directly within the selected element, in any of that element's descendants, or a combination thereof. As with attribute value selectors, text inside the parentheses of :contains() can be written as bare words or surrounded by quotation marks. The text must have matching case to be selected.
Also created a demo if someone would like to try it out.
UPDATE
Sorry, must have misread your question.
Found this jQuery expression at http://bugs.jquery.com/ticket/278 to create a new selector that is case insensitive and I updated my demo.
$.extend($.expr[':'], {
'containsi': function(elem, i, match, array) {
return (elem.textContent || elem.innerText || '').toLowerCase()
.indexOf((match[3] || "").toLowerCase()) >= 0;
}
});
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With