4

我正在为我的网站做一个实时搜索结果功能。我有一个 JSON 对象,其中包含我想匹配输入值的关键术语。

我能想到的最佳解决方案是在循环中遍历每个术语,并使用 jQuery 选择器查找部分匹配项。我怎样才能做出这样的if语句?例如:

$.getJSON('jsonfile.json', function(data) {
    key = Object.keys(data);
    for(i=0;i<key.length;i++)
    {
        if($(input[value]:contains == key[i].term)
        {
            //do something
        }
    }
} 

编辑:我很抱歉不清楚。我正在使用 :contains 选择器对一个输入的值进行部分匹配。

4

2 回答 2

3

您需要将:contains选择器构建为字符串:

if($('input[value]:contains("' + key[i].term + '")').length) {
    //do something
}

选择器将返回输入中包含该术语的所有元素;添加.length为要评估的 if 语句提供了一个简单的“真实”值(返回的 0 个项目 ==“false”,返回的 >0 个项目 ==“true”)。

编辑:我不确定是否input[value]:contains()是有效的 jQuery 选择器,因为我不知道:contains()输入元素上的文本是什么样的。您可能需要自己检查每个输入的值来帮助它。您可以将找到的输入过滤到值包含您正在搜索的术语的输入:

if ($('input[value]').filter(function() {
        return $(this).val().indexOf(key[i].term) != -1;
    }).length) {
    //do something
}
于 2012-09-15T22:28:05.373 回答
2

如果您的项目很少(例如几十个),您可以做的一件事是创建一个匹配其中任何一个的正则表达式:

var match = keys.join("|")
var regexp = RegExp.new(match, 'i') // Case insensitive
if($(input).val().match(regexp)) {
    // do stuff
}

是的,我知道这不会搜索与术语匹配的任何输入,您必须预先知道输入元素,但从您的问题来看,我假设您要检查单个输入元素。

不知道它是否比遍历所有术语并一一检查更快,但我认为它是并且它肯定更具可读性。

这可以与 jQuery 的grepeach方法一起使用:

var match = keys.join("|")
var regexp = RegExp.new(match, 'i')

// With grep
var matches = $('input').grep(function(elem, idx) {
    return $(input).val().match(regexp) != null;
})

// Or with each
$('input')..each(function(idx, elem) {
    if ($(input).val().match(regexp) != null) {
        // Do stuff
    }
});

grep选择与任何搜索词匹配的所有输入字段以供以后使用,并迭代each所有元素以立即对它们进行操作。

于 2012-09-15T22:38:16.973 回答