我正在使用DataTables 1.9.6并尝试对我的项目进行列多重过滤,使用DataTables的fnFilter函数没有运气。我已经在论坛中尝试了所有建议的方法来使其工作,但仍然无法使其正常工作。
我的问题是,OR运算符'|'甚至'||'使用字符串值来过滤列不起作用。
以下是我在DataTables论坛发布的问题:
http://datatables.net/forums/discussion/19737/regex-with-or-condition-doenst-work-in-fnfilter
我的问题是,OR运算符'|'甚至'||'使用字符串值过滤列在我的Web应用程序中不起作用。
例如,如果我有以下代码
$('.search_init').keyup(function()
{
var asEscapedFilters = [];
asEscapedFilters[0] = $(this).val();
asEscapedFilters[1] = 'Y';
oTable.fnFilter(asEscapedFilters[0] | asEscapedFilters[1], $('#example tr.inputs input').index(this), true, false);
});
在“Order Active”列的搜索区域输入字符串“I”,它应该返回“Order Active”列中包含“I”或“Y”的所有行。相反,它返回零行。
如果我使用'||'而不是'|'如下所示,
$('.search_init').keyup(function()
{
var asEscapedFilters = [];
asEscapedFilters[0] = $(this).val();
asEscapedFilters[1] = 'Y';
oTable.fnFilter(asEscapedFilters[0] || asEscapedFilters[1], $('#example tr.inputs input').index(this), true, false);
});
它返回'Order Active'列的'Y'行,但不返回带'I'的行。
我已经花了很多时间,看看这个问题,非常感谢任何有用的建议来获得这项工作。
处理是服务器端,它是否需要它来处理任何其他语法或设置?
DataTables BookMarklet结果。
http://debug.datatables.net/olohos
任何有助于此工作的帮助表示赞赏。
非常感谢提前。
答案 0 :(得分:1)
我不明白你的意思是'处理是服务器端'。您显示的代码是所有JavaScript代码,并在浏览器中运行。
所以,你有JavaScript代码,但这里没有正则表达式:
oTable.fnFilter(asEscapedFilters[0] | asEscapedFilters[1], $('#example tr.inputs input').index(this), true, false);
因此,代码中的|
是JavaScript运算符bitwise OR。
在您的其他尝试中,||
是JavaScript运算符logical OR
DataTables文档说明fnFilter()
的第一个参数是'{string}:String来过滤表',第三个参数是一个标志,指示是按字符串还是按常规处理字符串表达。因此,您需要创建一个字符串,该字符串将是RegExp()
任何时候文本(字符串)都是从用户输入或源代码外部的任何源获得的,需要正确处理它以避免意外错误和安全漏洞,例如在应用进一步处理时的代码注入,如正则表达式。这同样适用于SQL,shell命令,HTML以及计算机将解析和处理的任何其他内容。不幸的是,当我搜索时,我发现JavaScript标准库没有提供任何内置函数来为您执行此操作。 MDN文档提供了一个功能,您可以将其包含在代码中,以便在使用它生成正则表达式之前正确地转义用户的输入。请参阅下面的参考资料。
对代码的更正如下:
$('.search_init').keyup(function()
{
var asEscapedFilters = [];
asEscapedFilters[0] = $(this).val();
asEscapedFilters[1] = 'Y';
var filterPattern = escapeRegExp(asEscapedFilters[0])
+ "|" + escapeRegExp(asEscapedFilters[1]);
oTable.fnFilter(filterPattern, $('#example tr.inputs input').index(this), true, false);
});
请注意,此代码中的|
不是JavaScript运算符,而是字符串中的字符。该字符串将由datatables库传递给RegExp()
的构造函数。我创建了另一个局部变量,通过保持参数更简单,从而更加紧凑和具有描述性名称来增加函数调用的可读性。如果模式的第二部分始终是常量,则不需要对其进行转义,您可以这样写:var filterPattern = escapeRegExp($(this).val()) + "|Y";
。
参考文献: