如何通过包含 & 和/或换行符的 ajax 传递 textarea 数据?
Posted
技术标签:
【中文标题】如何通过包含 & 和/或换行符的 ajax 传递 textarea 数据?【英文标题】:How can I pass textarea data via ajax that contains ampersands and/or linebreaks? 【发布时间】:2011-09-07 23:13:29 【问题描述】:我有一个文本区域,我正在尝试使用 jQuery 通过 ajax 发送。我的问题是当 textarea 包含换行符和 & 符号时。
我用下面的js代码得到textarea的值:
// Find all the fields with class dirty
$('#customer .dirty').each(function()
fieldName = $(this).attr('id');
fieldValue = $(this).val();
// Create an object of dirty field names and values
var fields = 'fieldName' : fieldName, 'value' : fieldValue ;
// Add the object of field names and values to the custRecordToUpdate array
custRecordToUpdate.push(fields); // note: this was initialized before
);
var arrayToSend =
customer : custRecordToUpdate
;
var dataToSend = JSON.stringify(arrayToSend);
与textarea的值如下:
1/8 CLEAR MIRROR
3/8 CLEAR GLASS
如果我 console.log(dataToSend),我会得到以下信息:
"customer":["fieldName":"cust_note","value":"1/8 CLEAR MIRROR\n3/8 CLEAR GLASS"]
在 php 脚本上,我 json_decode 发布的数据并且它工作正常。
如果我随后将 textarea 更改为包含 & 符号,如下所示:
1/8 CLEAR MIRROR
3/8 CLEAR GLASS & GLASS
json_decode 失败。 console.log(dataToSend) 显示以下内容:
"customer":["fieldName":"cust_note","value":"1/8 CLEAR MIRROR\n3/8 CLEAR GLASS & GLASS"]
json_last_error() 显示语法错误
如果我把上面的js代码改成这样:
fieldValue = encodeURIComponent($(this).val());
然后console.log(dataToSend)显示:
"customer":["fieldName":"cust_note","value":"1%2F8%20CLEAR%20MIRROR%0A3%2F8%20CLEAR%20GLASS"]
和 json_decode 失败,两种数据情况均出现 语法错误。
那么,如何通过 ajax 将包含换行符和 & 号的 textarea 数据发送到 php 后端,并且 json_decode 不会失败?
解决方案:
基于下面的一些 cmets,我决定更改发送数据的 ajax 代码,这解决了问题,虽然我不知道为什么。
无论如何,这是代码,以防它可以帮助其他人。
var returnedhtml = $.ajax(
type: "POST",
url: 'index.php/customer/save_edit_customer',
//data : "data="+dataToSend, // This is how I was sending it before
data : "data" : dataToSend , // This is the new code that works!
async: false,
cache: false
).responseText;
【问题讨论】:
当我在我的 PHP 安装 (5.3.2-1) 上执行print_r(json_decode($your_bad_sample_here))
时,我得到了一个预期的对象。我建议在调用 json_decode() 之前立即转储您在 PHP 端收到的字符串。很可能你有一些东西在那里处理数据,比如 magic_quotes 之类的。
@Marc B,这条评论和下面的评论让我思考了我发送数据的方式,而不是关注数据本身。我更改了ajax代码,它突然起作用了。我更新了帖子以反映我所做的更改。所以是的,看起来有些东西正在“处理”数据,但我仍然不确定是什么......
【参考方案1】:
假设您的文本保存在变量 textareaText 中,请执行此操作
var val = textareaText.replace('&', '__and__');
将此作为 ajax 发送
在服务器端
假设您的 json_decode`d 值保存在名为 $data 的变量中,请执行以下操作:
$val = str_replace( '__and__', '&', $data['value'] );
这样你就可以在不让你的 json_decode 失败的情况下保留与号
你可以用别的东西代替和作为占位符
虽然它为什么会中断令人困惑。
【讨论】:
这是一种解决方法,但不能解决根本问题 - javascript 不会将字符串中的&
视为元字符,因此 json_decode 没有理由失败。其他东西正在修改 OP 的数据。
确切地说,$_GET 或 $_POST 数组发生了变化,或者在用户尝试 json_decode 该值之前数据发生了变化
最好弄清楚是什么/为什么要更改数据,而不是用字符串操作来掩盖它。不能保证它不会将您正在使用的哨兵字符转换成其他东西。
请注意,替换客户端中的 & 符号,然后根据此建议将其切换回服务器端,这对我有类似的问题,我正在创建一个包含来自 tinymce 文本的文本的 javascript 数组领域。该对象与 stringify 打包并通过 ajax 发送到服务器,如果文本包含一个&符号,它会破坏服务器端为空的数组,uriencoding 也没有帮助,按照这里的建议替换&符号解决了问题。【参考方案2】:
我不确定你的对象应该是什么形状,但如果我改变它对我有用:
"customer":["fieldName":"cust_note","value":"1/8 CLEAR MIRROR\n3/8 CLEAR GLASS & GLASS"]
到
"customer":"fieldName":"cust_note","value":"1/8 CLEAR MIRROR\n3/8 CLEAR GLASS & GLASS"
即从 json 对象中删除数组语法。
这是我的测试...
var customer = "customer":"fieldName":"cust_note","value":"1/8 CLEAR MIRROR\n3/8 CLEAR GLASS & GLASS";
alert(customer.customer.fieldName);
alert(customer.customer.value);
这表明 & 不是你的问题,但 [] 是。
【讨论】:
以上是关于如何通过包含 & 和/或换行符的 ajax 传递 textarea 数据?的主要内容,如果未能解决你的问题,请参考以下文章