У меня есть текстовый поиск на странице с использованием JS, который находится здесь:
$.fn.eoTextSearch = function(pat) {
var out = []
var textNodes = function(n) {
if (!window['Node']) {
window.Node = new Object();
Node.ELEMENT_NODE = 1;
Node.ATTRIBUTE_NODE = 2;
Node.TEXT_NODE = 3;
Node.CDATA_SECTION_NODE = 4;
Node.ENTITY_REFERENCE_NODE = 5;
Node.ENTITY_NODE = 6;
Node.PROCESSING_INSTRUCTION_NODE = 7;
Node.COMMENT_NODE = 8;
Node.DOCUMENT_NODE = 9;
Node.DOCUMENT_TYPE_NODE = 10;
Node.DOCUMENT_FRAGMENT_NODE = 11;
Node.NOTATION_NODE = 12;
}
if (n.nodeType == Node.TEXT_NODE) {
var t = typeof pat == 'string' ?
n.nodeValue.indexOf(pat) != -1 :
pat.test(n.nodeValue);
if (t) {
out.push(n.parentNode)
}
}
else {
$.each(n.childNodes, function(a, b) {
textNodes(b)
})
}
}
this.each(function() {
textNodes(this)
})
return out
};
И у меня есть возможность скрывать столбцы и строки в таблице. Когда я отправляю поиск и получаю подсвеченные результаты, в этом случае длина массива найденных текстовых узлов будет равна 6, но на странице будет выделено только 3. Когда вы выводите массив на консоль, вы получаете это:
Итак, вы получите 3 тега, которые я ожидал, но вы видите, что массив на самом деле состоит из [span,undefined,span,undefined,undefined,span]
. Таким образом, давая мне длину 6.
<span>
<span>
<span>
[span, undefined, span, undefined, undefined, span]
Я не знаю, почему он не удаляет все неопределенные текстовые узлы, когда я проверяю их. Вот что у меня есть для функции.
performTextSearch = function(currentObj){
if($.trim(currentObj.val()).length > 0){
var n = $("body").eoTextSearch($.trim(currentObj.val())),
recordTitle = "matches",
arrayRecheck = new Array(),
genericElemArray = new Array()
if(n.length == 1){
recordTitle = "match"
}
//check to see if we need to do a recount on the array length.
//if it's more than 0, then they're doing a compare and we need to strip out all of the text nodes that don't have a visible parent.
if($(".rows:checked").length > 0){
$.each(n,function(i,currElem){
if($(currElem).length != 0 && typeof currElem != 'undefined'){
if($(currElem).closest("tr").is(":visible") || $(currElem).is(":visible")){
//remove the element from the array
console.log(currElem)
arrayRecheck[i] = currElem
}
}
})
}
if(arrayRecheck.length > 0){
genericElemArray.push(arrayRecheck)
console.log(arrayRecheck)
}
else{
genericElemArray.push(n)
}
genericElemArray = genericElemArray[0]
$("#recordCount").text(genericElemArray.length + " " +recordTitle)
$(".searchResults").show()
for(var i = 0; i < genericElemArray.length; ++i){
void($(genericElemArray[i]).addClass("yellowBkgd").addClass("highLighted"))
}
}
else{
$(".highLighted").css("background","none")
}
}
Если вы посмотрите на приведенный ниже код "// проверьте, нужно ли нам пересчитывать длину массива.", Вы увидите, где я удаляю текстовые узлы на основе дисплея и или не объект определен. Я проверяю длину вместо undefined, потому что typeof == undefined по какой-то причине вообще не работал. Видимо, все еще ускользает, хотя.
Есть идеи, почему я все еще получаю неопределенные объекты в массиве?
Мои извинения за такой большой пост!
Заранее спасибо