[英]Submitting Textarea on enter with Ajax and then rendering partial without refreshing whole page
目前我正在尝试通过JS和Ajax在没有提交按钮的情况下发表评论帖并且它有效。
问题是当提交帖子时,页面重新加载到/post/:id/comment
页面,我希望它呈现部分而不是刷新整个页面或带我到另一个页面。 我对JS不熟悉,任何帮助都将不胜感激!
这就是我正在使用的:
用于使用enter发布的JS
<script type="text/javascript" language="javascript">
$(function(){
$('textarea').keypress(function(e) {
if (e.keyCode == 13 && !e.shiftKey) {
e.preventDefault();
var frm = this.form.submit();
$.ajax({
url: frm.attr('action'),
data: frm.serialize(),
complete: function(){
frm.submit();
},
dataType: json
});
}
});
</script>
评论表
<div class="CommentField">
<%= form_for ([micropost, @comment]), :remote => true do |f| %>
<%= f.text_area :content, :class => "CommentText", :placeholder => "Write a Comment..." %>
<% end %>
</div>
编辑
评论HTML
<div class='UserCommentContainer'>
<div class='UserPicture'>
<%= image_tag comment.user.avatar.url(:bit), :class =>"PP" %>
</div>
<div class='UserComment'>
<div class='UserName sm'>
<%= link_to comment.user.name, user_path(comment.user) %>
</div>
<div class='UserCommentText'>
<%= comment.content %>
</div>
<div class='UserCommentDate'>
<%= time_ago_in_words(comment.created_at) %>
</div>
</div>
</div>
你需要一些可以使用URL解决的东西,所以部分不会这样做。 您应该为此功能设置一个页面来调用并调用它
好的,让我们再试一次......
我认为你在寻找看起来更像这样的AJAX:
$('textarea').keypress(function(e) {
if (e.keyCode == 13 && !e.shiftKey) {
e.preventDefault();
var myTextArea = this,
frm = this.form;
this.disabled = true;
$.ajax({
url: frm.attr('action'),
data: frm.serialize(),
complete: function(){
$('<div>', { text: myTextArea.value }).appendTo('body');
myTextArea.value = '';
myTextArea.disabled = false;
},
dataType: 'json'
});
}
});
你看到在完整的方法中我们只是将<textarea>
的内容附加到正文......你可能有一个容器要放入它,但这被称为“客户端渲染”意味着你正在构建在客户端而不是服务器上的DOM(或更改它)...希望这有助于确认
-----编辑-----
我应该注意你可能想要做更多的事情: .appendTo('#container')
,你在页面的某个地方有一个<div id="container">
,我确信评论需要更多格式化什么不......
看看这个演示是否有助于您实现这个想法: http : //jsbin.com/uruzul/edit#javascript,html,live
-----更多编辑-----
我也认为要正确地做到这一点你将不得不“使用”AJAX返回,并且我最初没有包含这个,因为它似乎没有你的代码中有任何概念,但看到之后您的评论HTML ...您将需要您的服务器返回一个看起来像这样的JSON对象:
{
"userImage": "pictureUrl/image.jpg",
"userName": "user name here",
"userLink": "link/to/user/page",
"date": "3/5/2012",
"comment": "the text of the comment"
}
然后,而不是使用complete
你想开始使用success
和error
请参阅文档: http : //api.jquery.com/jQuery.ajax/ 喜欢这样:
error: function(jqXHR, textStatus, errorThrown) {
alert('comment submit failed!\n\n' + textStatus);
},
success: function(data, textStatus, jqXHR){
var cnt = $('<div>')
.addClass('UserCommentContainer')
.appendTo('.CommentContainer');
$('<div>')
.addClass('UserPicture')
.appendTo(cnt)
.append($('<img>', { src: data.userImage, 'class': 'pp' }));
cnt = $('<div>')
.addClass('UserComment')
.appendTo(cnt);
$('<div>')
.addClass('UserName sm')
.appendTo(cnt)
.append($('<a>', { href: data.userLink, text: data.userName }));
$('<div>')
.addClass('UserCommentText')
.appendTo(cnt)
.text(data.comment);
$('<div>')
.addClass('UserCommentDate')
.appendTo(cnt)
.append(data.date);
myTextArea.value = '';
},
complete: function(data, textStatus, jqXHR){
myTextArea.disabled = false;
},
这是一个开始。 您的代码告诉表单在ajsax发生之前提交... 我怀疑你没有回复json,所以可能仍然存在“json”dataType不正确的问题
$(function(){
$('textarea').keypress(function(e) {
if (e.keyCode == 13 && !e.shiftKey) {
e.preventDefault();
var frm = $(this).closest('form');
$.ajax({
url: frm.attr('action'),
data: frm.serialize(),
complete: function(){
/*frm.submit();*/
window.location='url/you/want';
},
dataType: 'json'
});
}
});
})
你应该找到一些Rails的常规Ajax指南,我推荐一个免费的Railscast 。 有一个示例,搜索表单不会在提交时重新加载整个页面,您的情况非常相似。 另外,我建议首先使用提交按钮实现此功能。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.