Javascript在连接期间截断字符串

我在使用laravel和JS(jquery)构建的应用程序中遇到字符串截断问题。 起初我认为这是一个后端问题(我问了这个问题: Laravel Truncating Strings )。 仔细调试后,我注意到我的JS代码有问题。

我试图通过JQuery post(AJAX)请求将一些字符串从CKEditor传递到后端,但在某些情况下,字符串被截断,特别是包含特殊字符的嵌入!

这是发生问题的片段

var content = CKEDITOR.instances.editor.getData(); alert("Content :" + content + "
Length :" + content.length); var data = 'post_id=' + post_id + '&content=' + content + '&_token=' + $('#token').val(); alert("Data :" + data); alert("Content Again :" + content);

发生了什么?

  1. 我从CKEditor获取字符串
  2. 提醒内容和调试长度,看起来都很好
  3. 我将内容连接到数据变量,该变量稍后在ajax请求中发送
  4. 警报数据在某些情况下显示截断的字符串
  5. 我再次检查内容一切都很好,但由于某种原因数据被截断。

示例???

我将这个facebook粘贴在编辑器中

  

警告内容显示正确的结果而不截断。 警告数据变量给出了

 Data :post_id='+post_id+'&content=

<iframe src="https://www.facebook.com/plugins/comment_embed.php?href=https%3A%2F

很明显,字符串正在%2F周围切割有时%3A (我试过的另一个嵌入)

数据变量如何看起来与普通字符串(

This is some string

 Data :post_id='+post_id+'&content=

This is some string

&_token='+$('#token').val()

拜托,我做错了什么? 并且一般如何在JS中避免这种截断我看到在不同的情况下多次截断字符串,这些很难解释。 提前致谢

如果content有特殊字符,让我们说它You & I foreverYou & I forever ,那么你的data变量将如下所示:

 post_id=1&content=You & I forever&_token=bla 

看到问题了吗? 内容在You之后结束,因为&符号未编码。 所以你应该这样做:

 var data = 'post_id=' + post_id + '&content=' + encodeURIComponent(content) + '&_token=' + $('#token').val(); 

有了它,您的data变量将如下所示:

 post_id=1&content=You%20%26%20I%20forever&_token=bla 

这一切都会顺利进行

更新

@ Piyin上面的答案是一种更好,更清洁的方法! 然而,我留下了漫长而无聊的方法,它可能会出于另一个目的。

旧解决方案(不酷:))

因为我需要尽快解决这个问题(在生产大声笑)我用这个工作! 如果遇到麻烦我们会得到更好的答案你可以使用这个:)

1)创建一个隐藏的表单

 

2)使用JQuery(或其他)将数据传递给此表单

  var post_id = $('#post-id').val(); //get post id $('#content-post-id').val(post_id); //put in form var content = CKEDITOR.instances.editor.getData(); //get content $('#content').val(content); //put in form 

3)使用JQuery .serialize() )序列化表单(而不是“手动”执行)

 var data = $('#content-form').serialize(); 

如果你没有使用JQuery,这可能不是很酷,除非你有任何替代序列化你正在使用!

这可能不是一个好的解决方案,但它的工作原理! 我确定深入研究(代码)serialize()函数可以帮助我(或者你)了解如何在复杂情况下正确地序列化数据,就像我拥有的​​那样。