首先,如果标题的结构不好,我必须道歉。我正在努力尝试将所有有效点合并为足够简短的标题。如果您能想到更好的选择,请随时进行编辑。
我已经创建了一个JavaScript / jQuery替代品,来代替受支持不佳的{5} HTML5元素,并且在很大程度上,我对它的结果感到满意。
所有方法都有效,但是特殊的<datalist>
字符存在一个问题,就是我不太确定如何转义它们,以免控制台中出现错误。
我要转义的字符特别是RegExp
,(
和)
。我知道在JavaScript正则表达式中,您应该使用反斜杠来转义这些字符,但是到目前为止,在我尝试过的所有尝试中,代码都完全无法正常工作,以至于我没有做正确的事。
我只是想知道如何在当前代码中实现转义?您可以从注释行中看到我尝试过的其他方法。
输入有效并正确显示游戏。但是,如果您从jsFiddle中选择/
选项之一,然后转到括号中的Backspace,则控制台将引发以下错误:
未捕获到的SyntaxError:无效的正则表达式:/ Grand Theft Auto V(PC /:未终止的组
实时预览:jsFiddle
JavaScript / jQuery:
Grand Theft Auto V
HTML:
$('#game-name').keyup( function() {
var input = $('#game-search');
var offset = input.offset();
var game_name = $("#game-search").val();
// List
function show() {
$('#game-list').css({
'display': 'inline-block',
'left': offset.left,
'min-width': input.outerWidth(),
'top': offset.top + input.outerHeight()
});
}
function hide() {
$('#game-list').css({
'display': 'none',
'left': offset.left,
'min-width': input.outerWidth(),
'top': offset.top + input.outerHeight()
});
}
if (game_name.length >= 1) {
show();
}
else {
hide();
}
// Filter
var regexp = new RegExp( game_name, "i" );
//var regexp = new RegExp(/[A-Za-z0-9_()\/]/, "i");
// [A-Za-z0-9_()\/]
$("#game-list ul").children("li").each(function(index) {
if (game_name.length < 1) {
$(this).addClass('reset').removeClass('match no-match');
}
else {
//if (/[A-Za-z0-9_()\/]/i.test( $(this).html() )) {
if (regexp.test( $(this).html() )) {
$(this).addClass('match').removeClass('no-match reset');
} else {
$(this).addClass('no-match').removeClass('match reset');
}
}
});
// Apply
$('#game-list ul li').click( function() {
$('#game-search').val( $(this).attr('value') );
$('#game-list').css('display', 'none');
});
});
谢谢。
答案 0 :(得分:1)
您是正确的,您需要转义正则表达式的字符。
尝试使用两个反斜杠来使正则表达式中的game_name逸出:
var regexp = new RegExp(game_name.replace(/\(|\)/g, "\\$&"), "i");
之所以需要额外的反斜杠,是因为反斜杠在字符串文字和正则表达式中都具有特殊含义。第一个是转义字符,只有第二个被采用。