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);
发生了什么?
- 我从CKEditor获取字符串
- 提醒内容和调试长度,看起来都很好
- 我将内容连接到数据变量,该变量稍后在ajax请求中发送
- 警报数据在某些情况下显示截断的字符串
- 我再次检查内容一切都很好,但由于某种原因数据被截断。
示例???
我将这个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 forever
像You & 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()函数可以帮助我(或者你)了解如何在复杂情况下正确地序列化数据,就像我拥有的那样。