【问题标题】:How can I pass textarea data via ajax that contains ampersands and/or linebreaks?如何通过包含 & 和/或换行符的 ajax 传递 textarea 数据?
【发布时间】: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代码,它突然起作用了。我更新了帖子以反映我所做的更改。所以是的,看起来有些东西正在“处理”数据,但我仍然不确定是什么......

标签: php jquery textarea json


【解决方案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);

这表明 & 不是你的问题,但 [] 是。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-23
    • 2014-02-02
    • 1970-01-01
    相关资源
    最近更新 更多