(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(' ');
},
將是非常好的,如果有人能幫助我。
非常感謝你,這工作得很好,但現在這拆分每一個字母和數字。例如:我輸入「pixma ip1500」並且腳本甚至匹配一個像這樣的元素:「pixam pim 015」會導致每個單獨的數字,並且來自輸入的字母位於li元素「pixam pim 015」中。換句話說,li元素包含來自輸入的每一個數字和字母。對不起,我的英語不好! – Kuba
@xtramaster任何想法:)? – Kuba
Finaly我修復了每個單一數字或字母的分割問題。我改變了你最後一行「return tempArray.join(」「);」到「return tempArray.join(」「)。split('');」。所以我只是添加這個「.split('');」 – Kuba