问候。我正在创建一个报价服务,并在尝试进行类似Twitter的数据提交和显示时鼓励这样的问题:我的所有ajax请求都执行了两次。我正在使用jQuery如下:
我已尝试使用“提交”按钮.click()
,.live("click", function())
和.one("click", function())
处理程序。他们都执行了两次查询。是的,.one("click", function())
也是。
我设置超时功能以检查新报价,并且它也会执行两次
我的JS / RoR代码出了什么问题?
您可以在github看到我的所有来源。
任何帮助都会很棒。
UPD:以下是我的表格HTML:
<div class="msg"></div><br />
<form accept-charset="UTF-8" action="/quotes" class="new_quote" id="new_quote" method="post"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="✓" /><input name="authenticity_token" type="hidden" value="vD6hAOmZjenRFw1aO1yH75K9K7WTFneJuP3H7sOR/Qw=" /></div>
<div class="field">
<label for="quote_author">Author</label><br />
<input id="quote_author" name="quote[author]" size="30" type="text" />
</div>
<div class="field">
<label for="quote_body">Body</label><br />
<textarea cols="60" id="quote_body" name="quote[body]" rows="8"></textarea>
</div>
<div class="field">
<label for="quote_approved">Approved</label><br />
<input name="quote[approved]" type="hidden" value="0" /><input id="quote_approved" name="quote[approved]" type="checkbox" value="1" />
</div>
<div class="actions">
<input id="quote_submit" name="commit" type="submit" value="Create Quote" />
</div>
</form>
这是我的javascript:
onerror = function moo(msg, url, line) {
//alert('Error: ' + msg + '\nURL: ' + url + '\nLine: ' + line);
}
function moo() {
var cnt = 0, type = "";
var id = $("div.quote:first").attr("id");
$.getJSON("/after/" + id, function(data) {
var cnt = data.length;
if (cnt > 0)
$(".msg").css("backgrount-color", "#ffff00").text(cnt + " new quotes added. Please, update").fadeIn('slow').delay(20000).fadeOut('slow');
});
setTimeout("moo()", 30000);
}
$(document).ready(function() {
var to = setTimeout("moo()", 30000);
$.getJSON("/author_list", function(data) {
$("#quote_author").autocomplete({ source: data, minLength: 1 })
});
$("form.new_quote > .actions > [type=submit]").live("click", function() {
$.post('/ajax_new', $('form.new_quote').serialize(), function(resp) {
resp = $.parseJSON(resp);
if (resp[0].done == "ok") {
$(".msg").css("background-color", "#00fe00").text("Ok").fadeIn('slow').delay(5000).fadeOut('slow');
$("#quote_author,#quote_body").each(function(i,e) {
$(this).val("");
});
}
});
return false;
});
});
答案 0 :(得分:1)
我查看了你的消息来源。恕我直言,实现目标的更好方法是以Rails方式实现。我的意思是你已经使用了jquery rails脚本。所以你可以在rails 3应用程序中轻松地使用RJS方法坚持UJS:
表格:
form_for(@quote, :remote => true) do |f|
在控制器中:
def create
@quote = Quote.new(params[:quote])
respond_to do |format|
if @quote.save
format.html { redirect_to(@quote, :notice => :quote_created) }
format.xml { render :xml => @quote, :status => :created, :location => @quote }
format.js
else
format.html { render :action => "new" }
format.xml { render :xml => @quote.errors, :status => :unprocessable_entity }
format.js
end
end
end
在create.js.erb中(下面是HAML语法):
- if @quote.errors.any?
$('#data_form').html('#{escape_javascript(render(:partial => "form"))}');
- else
$('ul.data_grid').prepend('#{escape_javascript(render :partial => "quote", :locals => { :quote => quote })}');
您可以使用#data_form
和带有ul.data_grid的引号列表来包装表单,或者更改create.js.erb
中的选择器。同样在该文件中,您可以在成功时清除表单并显示Flash消息或此处需要的任何内容。
毕竟不要忘记从application.js中抛出这段代码(不再需要了):
$("form.new_quote > .actions > [type=submit]").live("click", function() {
$.post('/ajax_new', $('form.new_quote').serialize(), function(resp) {
resp = $.parseJSON(resp);
if (resp[0].done == "ok") {
$(".msg").css("background-color", "#00fe00").text("Ok").fadeIn('slow').delay(5000).fadeOut('slow');
$("#quote_author,#quote_body").each(function(i,e) {
$(this).val("");
});
}
});
return false;
});