JQuery自动完成调用中的撇号

4

以下代码可以在搜索不包含撇号的任何名称时正常运行。当您尝试查找姓名中包含撇号的人时,它会失败(返回错误)。如何允许找到带有撇号的人?

function autoComplete() {
$(document).ready(function () {
    $(".AutoCompleteClass").autocomplete({
        source: function (request, response) {
            $.ajax({
                url: "/Service/NomineeWebService.asmx/GetMatchingActiveDirectoryUsers",
                data: "{ 'SearchCharacters': '" + request.term + "' }",
                dataType: "json",
                type: "POST",
                contentType: "application/json; charset=utf-8",
                dataFilter: function (data) { return data; },
                success: function (data) {
                    response($.map(data.d, function (item) {
                        return {
                            id: item.NomineeUserName,
                            value: item.NomineeLastNameFirstName + " - " + item.NomineeDomainAndUserName,
                            data: item
                        }
                    }))
                },
                error: function (XMLHttpRequest, textStatus, errorThrown) {
                    alert(textStatus);
                }
            });
        },            
        delay: 150,
        minLength: 3,            
        select: function (event, ui) {
            $('.SelectedUserNameWrapper input[type=hidden]').val(ui.item.id);
        }       
    });
});
$('#AutoCompleteTextBox').keypress(function (event) {
    if (event.which == '13') {
        alert('test');
        $('#AutoCompleteButton').click();
    }

2
错误是什么,ajax调用的输出是什么,错误是在JavaScript中还是在服务器端? - yunzen
弹出了警告框,但只显示“错误”。它没有返回任何消息。查询的数据库中有带撇号的名称,因此我不认为服务器端发生了任何事情。 - obautista
听起来你输入的单引号在查询数据库之前需要进行转义。 - Josh Darnell
这个不行:data: "{ 'SearchCharacters': '" + request.term.replace("'", "'") + "' }", - obautista
什么数据库系统?通常(我认为)要转义单引号,您需要使用另一个单引号('')。如果这样做不起作用,我会删除我的答案-我只知道我以前遇到过这种情况。 - Josh Darnell
3个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
7
我找到了解决这个问题的方法,我们应该用转义字符替换所有的 "'"。代码如下:

我找到了解决这个问题的方法,我们应该用转义字符替换所有的 "'"。代码如下

    function autoComplete() {
$(document).ready(function () {
    $(".AutoCompleteClass").autocomplete({
        source: function (request, response) {
request.term = request.term.replace(/'/gi,"\\'"); // replace globally

4

听起来你需要在查询数据库之前转义输入中的单引号。尝试将AJAX调用中的"data"部分替换为以下内容:

data: "{ 'SearchCharacters': '" + request.term.replace("'", "''")  + "' }",

我的jQuery语法可能有点问题,但希望这能传达我想说的意思。

如果是这样的话,你以后可能会遇到其他特殊字符的问题。

注意:在mySQL和SQL Server中,额外的单引号是单引号的“转义字符”。您没有提到您使用的关系型数据库管理系统,因此可能对您不同。

必读:您可能已经知道这一点,但希望您不要将“request.term”值与服务器端的SQL查询进行连接。否则,您将容易受到SQL注入攻击=)


@MikeRichards 很好的发现!这是我复制/粘贴失败了。 - Josh Darnell

2
有点古怪,但我最终是这样替换的:request.term.replace("'", "%27")。然后在我的 Web 服务上,我拦截并替换回使用撇号:SearchCharacters = SearchCharacters.Replace("%27", "'"); 然后将其传递给我的数据库调用。这有效。这可能与自动完成插件或 jQuery 相关。既然这个方法行得通,我会使用它并继续前进。感谢所有的建议。顺便说一下,没有任何转义对我有用。再次感谢...

谢谢,这个方法对我也起作用了... 我尝试了一些上面的解决方案,但它们都没有起作用... 但是这个方法解决了问题!request.term.replace("'", "%27") - Devin Walker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,