在参数数据中使用特殊字符调用 Ajax 时出现问题

Posted

技术标签:

【中文标题】在参数数据中使用特殊字符调用 Ajax 时出现问题【英文标题】:Problem calling Ajax with special chars in parameter data 【发布时间】:2021-07-15 13:01:39 【问题描述】:

我正在使用此函数将JQuery.autocomplete 应用于文本框小部件:

function GetData(dest_widget) 
    dest_widget.autocomplete(
        minLength: 3,
        source: function (request, response) 
            $.ajax(
                type: "POST",
                url: "/Service/WSDataService.asmx/GetData",
                contentType: "application/json; charset=utf-8",
                data: "'filter':'" + request.term + "'",
                dataType: "json",
                async: true,
                success: function (data) 
                    var _data_array = data.d.split("<br />");
                    response(_data_array);
                ,
                error: function (result) 
                    alert("GetData() error" + result);
                
            )
        
    );

除非我尝试在文本框中输入特殊字符(如'),否则它可以正常工作...在这种情况下,我收到此错误:

Object 消息:“传递的对象无效。预期':'o ''...", StackTrace: " 在 System.Web.Script.Serialization.javascriptOb…”,异常类型: "System.ArgumentException"

看起来我需要在调用 ajax 之前对小部件值进行编码。我尝试过:

data: "'filter':'" + encodeURIComponent(request.term) + "'", 

还尝试更改contentType,但在这两种情况下都没有成功。

【问题讨论】:

试试FormData 你建议在哪里使用这样的调用?我的意思是...encodedURIComponent() 在我的示例中调用它根本没有被调用。错误似乎出现在source函数的参数通道中...顺便说一句我需要更改contentType 【参考方案1】:

这个问题很容易解决。 似乎encodeURIComponent() 在编码方面并不那么严格:在我的情况下,' char 根本没有被编码(尽管documentation 说了什么)。无论如何 Mozilla 添加一个使用建议:

function fixedEncodeURIComponent(str) 
  return encodeURIComponent(str).replace(/[!'()*]/g, function (c) 
    return '%' + c.charCodeAt(0).toString(16);
  );

正确编码' 字符(等等)。这听起来让我有点困惑,但它的工作方式......

【讨论】:

以上是关于在参数数据中使用特殊字符调用 Ajax 时出现问题的主要内容,如果未能解决你的问题,请参考以下文章

通过 jQuery 进行 ajax 调用时出现 403 错误

尝试使用 AJAX 在 Laravel 中上传单个文件时出现数组到字符串转换错误

下拉菜单在第一页加载时出现延迟

使用 Ajax 调用 Web Api 方法时出现错误 400

从 django 视图上的 AJAX 调用获取请求时出现错误 404

使用 vigenere 密码加密时出现奇怪的错误