我有这样的代码
(function($, window, document, undefined) {
$.fn.quicksearch = function (target, opt) {
var timeout, cache, rowcache, jq_results, val = '', e = this, options = $.extend({
delay: 100,
selector: null,
stripeRows: null,
loader: null,
noResults: '',
bind: 'keyup',
onBefore: function () {
return;
},
onAfter: function () {
return;
},
show: function () {
this.style.display = "";
},
hide: function () {
this.style.display = "none";
},
prepareQuery: function (val) {
return val.toLowerCase().split(' ');
},
testQuery: function (query, txt, _row) {
for (var i = 0; i < query.length; i += 1) {
if (txt.indexOf(query[i]) === -1) {
return false;
}
}
return true;
}
}, opt);
this.go = function () {
var i = 0,
noresults = true,
query = options.prepareQuery(val),
val_empty = (val.replace(' ', '').length === 0);
for (var i = 0, len = rowcache.length; i < len; i++) {
if (val_empty || options.testQuery(query, cache[i], rowcache[i])) {
options.show.apply(rowcache[i]);
noresults = false;
} else {
options.hide.apply(rowcache[i]);
}
}
if (noresults) {
this.results(false);
} else {
this.results(true);
this.stripe();
}
this.loader(false);
options.onAfter();
return this;
};
this.stripe = function () {
if (typeof options.stripeRows === "object" && options.stripeRows !== null)
{
var joined = options.stripeRows.join(' ');
var stripeRows_length = options.stripeRows.length;
jq_results.not(':hidden').each(function (i) {
$(this).removeClass(joined).addClass(options.stripeRows[i % stripeRows_length]);
});
}
return this;
};
this.strip_html = function (input) {
var output = input.replace(new RegExp('<[^<]+\>', 'g'), "");
output = $.trim(output.toLowerCase());
return output;
};
this.results = function (bool) {
if (typeof options.noResults === "string" && options.noResults !== "") {
if (bool) {
$(options.noResults).hide();
} else {
$(options.noResults).show();
}
}
return this;
};
this.loader = function (bool) {
if (typeof options.loader === "string" && options.loader !== "") {
(bool) ? $(options.loader).show() : $(options.loader).hide();
}
return this;
};
this.cache = function () {
jq_results = $(target);
if (typeof options.noResults === "string" && options.noResults !== "") {
jq_results = jq_results.not(options.noResults);
}
var t = (typeof options.selector === "string") ? jq_results.find(options.selector) : $(target).not(options.noResults);
cache = t.map(function () {
return e.strip_html(this.innerHTML);
});
rowcache = jq_results.map(function () {
return this;
});
return this.go();
};
this.trigger = function () {
this.loader(true);
options.onBefore();
window.clearTimeout(timeout);
timeout = window.setTimeout(function () {
e.go();
}, options.delay);
return this;
};
this.cache();
this.results(true);
this.stripe();
this.loader(false);
return this.each(function () {
$(this).bind(options.bind, function () {
val = $(this).val();
e.trigger();
});
});
};
}(jQuery, this, document));
我试着找出在数字和字母之间分割/添加空格的位置和方式。导致某些人输入例如“ip1500”并且脚本无法使用类似“ip 1500”的元素匹配输入。我的问题是我是初学者。
我正在努力尝试,但我无法让它发挥作用。我也试过了this
我找到了这个地方,我认为可以在这里完成所有东西被“”(空格)拆分:
prepareQuery: function (val) {
return val.toLowerCase().split(' ');
},
如果有人可以帮助我,那将是非常好的。
答案 0 :(得分:6)
如果你想要“123abc345def”到“123 abc 345 def”。替换功能可能会有所帮助。代码是这样的。
var str = "123abc345def";
str = str.replace(/(\d+)/g, function (_, num){
console.log(num);
return ' ' + num + ' ';
});
str = str.trim();
答案 1 :(得分:2)
您链接的代码不起作用主要是因为它使用不同的编程语言来实现javascript。理论上,它应该工作,但javascript不支持正则表达式lookbehinds(目前)...
相反,我重写了这段代码:
prepareQuery: function (val) {
function isNotLetter(a){
return (/[0-9-_ ]/.test(a));
}
var val=val.toLowerCase().split("");
var tempArray=val.join("").split("");
var currentIndex=1;
for (var i=0;i<val.length-1;i++){
if (isNotLetter(val[i]) !== isNotLetter(val[i+1])){
tempArray.splice(i+currentIndex, 0, " ");
currentIndex++;
}
}
return tempArray.join("");
}
由于你是javascript的新手,我将解释它的作用。
prepareQuery
中声明了一个函数,用于检查字符串是否包含字母[可以将其移动到其他地方] val
拆分为数组,并将val
的内容复制到tempArray
val
if
语句检测当前字符(由循环设置的val[i]
)是否与其旁边的字符(val[i+1]
)相同。tempArray
添加一个空格样本: http://jsbin.com/ebitus/1/edit (JSFiddle失败了......)
修改强> 对不起,但我完全误解了你的问题...你没有提到你使用的是“quicksearch”和jQuery。在这种情况下,我假设您有一个包含名称的元素列表,并且您希望使用插件搜索它们... 匹配用户查询(如果没有空间)的更简单的方法是从搜索表中删除空间以及查询本身 - 尽管原始的反向方法将起作用(只是效率不高)[又名:扩展用户的查询]
在这种情况下,从搜索表和用户输入中剥离空间将是更好的方法
prepareQuery: function (val) {
return val.toLowerCase().replace(/ /ig,'').split(" ");
},
testQuery: function (query, txt, _row) {
txt=txt.toLowerCase().replace(/ /ig,'');
for (var i = 0; i < query.length; i += 1) {
if (txt.indexOf(query[i]) === -1) {
return false;
}
}
return true;
}
样本: http://jsfiddle.net/q9k9Y/3/
编辑2:
您的真正意图似乎是在网站上创建功能齐全的搜索功能,而不仅仅是在字母和数字之间添加空格。有了这个,我建议使用Quicksilver。我想制定一个算法来扩展quickSearcher但是目前我不能(时区)。相反,我建议使用Quicksilver