带有 '&' 的参数会破坏 $.ajax 请求

Posted

技术标签:

【中文标题】带有 \'&\' 的参数会破坏 $.ajax 请求【英文标题】:Parameter with '&' breaking $.ajax request带有 '&' 的参数会破坏 $.ajax 请求 【发布时间】:2012-01-01 08:04:02 【问题描述】:

我正在开发一个 Web 应用程序,它在客户端使用 javascript + JQuery,在服务器端使用 php

我想作为 AJAX 请求的参数传递的字符串之一在其内容中有一个“&”。

因此,请求的字符串被破坏。浏览器“认为”这个参数结束了,因为字符串上有一个'&'。

var hasChar = "This is a string that has a & in the content.";
var doesntHave = "This one does not contain.";
var dataString = "first=" + hasChar + "&second=" + doesntHave;

$.ajax(
    type : "POST",
    url : "myurl.php",
    data : dataString,
    cache : false,
    success : function(html) 
    
);

服务器接收到的第一个参数为“这是一个带有”的字符串

我的问题:

如何在客户端对字符串进行编码以及如何在 PHP 服务器上对其进行解码。

【问题讨论】:

【参考方案1】:

让 jQuery 为您处理hasChar(和您的其他参数)的编码:

var hasChar = "This is a string that has a & in the content.";
var doesntHave = "This one does not contain.";

$.ajax(
    type : "POST",
    url : "myurl.php",
    data :  first: hasChar, second: doesntHave ,
    cache : false,
    success : function(html) 
    
);

【讨论】:

【参考方案2】:

为什么不做以下事情:

    $.ajax(
        type : "POST",
        url : "myurl.php",
        data : 
          'first': hasChar,
          'second': doesntHave
        ,
        cache : false,
        success : function(html) 
        
    );

在这种情况下,jQuery 将确保字符串被正确编码。

作为替代方案,您可以使用 encodeURIComponent() JS 的内置函数来正确编码字符串:

var dataString = "first=" + encodeURIComponent(hasChar) + "&second=" + encodeURIComponent(doesntHave);

【讨论】:

【参考方案3】:

您可以使用.param

dataString = $.param(first: asChar, second: doesntHave);

【讨论】:

【参考方案4】:

或者如果您想跳过@alex-k 提到的$.param 部分

data : 'first': hasChar, 'second': doesntHave,

【讨论】:

【参考方案5】:

您可以将其设置为对象:

var hasChar = "This is a string that has a & in the content.";
var doesntHave = "This one does not contain.";

$.ajax(
    type : "POST",
    url : "myurl.php",
    data : first: hasChar, second: doesntHave,
    cache : false,
    success : function(html) 
    
);

【讨论】:

【参考方案6】:

你也可以使用encodeURI

var encodedData = encodeURI(dataString);
$.ajax(
    type : "POST",
    url : "myurl.php",
    data : encodedData,
    cache : false,
    success : function(html) 
    
);

Link

【讨论】:

【参考方案7】:

如果您想要服务器端解码/编码,请使用 urlencode()urldecode()

【讨论】:

这不是问题的真正答案。 @bazmegakapa:是的 - 问题已被编辑。 “如何在 server 端对字符串进行编码......”是最初的问题。【参考方案8】:

试试这个

var dataString = ;
dataString["hasChar"] = "This is a string that has a & in the content.";
dataString["doesntHave"] = "This one does not contain.";

$.ajax(
    type : "POST",
    url : "myurl.php",
    data : dataString,
    cache : false,
    success : function(html) 
    
);

【讨论】:

【参考方案9】:

您的参数需要进行简单的 URL 编码。在 PHP 方面,您不需要解码它们,一切都会正常工作。

有一个名为 encodeURIComponent() 的 Javascript 函数可以正确地对您的字符串进行 URL 编码。所以在基本层面上,你可以这样做:

var dataString = "first=" + encodeURIComponent(hasChar) + "&second=" + encodeURIComponent(doesntHave);

如果你使用 jQuery,它会自动为你处理这个问题,如果 in your $.ajax() call you pass it an object instead of a query string:

data 选项可以包含以下形式的查询字符串 key1=value1&key2=value2,或 key1: 'value1', key2: 形式的映射 '值2'。如果使用后一种形式,则数据将转换为 在发送之前使用 jQuery.param() 查询字符串。

所以你只需要在你的代码中这样做:

var dataString =  first: hasChar, second: doesntHave);

【讨论】:

以上是关于带有 '&' 的参数会破坏 $.ajax 请求的主要内容,如果未能解决你的问题,请参考以下文章

Vue 3 警告“带有副作用的标签”正在破坏生产

带有 Video.js 和 AJAX 的 HTML5 视频

带有父选择器的 BEM 嵌套 SCSS 会破坏 Sublime Text 语法突出显示?

带有 CSS 显示的元素:无;破坏布局 - 导致错位

带有水平滚动条的 pre/code 元素破坏了 Firefox 上的 flex 布局

使用带有ajax的<a>标签[重复]