2011-01-30 94 views
0

问候。我现在正在创建报价服务,并在尝试进行类似twitter的数据提交和显示时鼓励出现这样的问题:我的所有ajax请求都会执行两次。我使用jQuery如下:Twitter类内容提交和更新

  • 我试过.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="&#x2713;" /><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

显示您的形式在这里,请。 – Voldy 2011-01-30 12:07:44

回答

1

我已通过您的来源看。恕我直言,更好的方式来实现你的目标是以Rails的方式做到这一点。我的意思是你已经使用jQuery rails脚本。所以,你可以很容易地坚持UJS与RJS方法在Rails 3应用程序:

在形式:

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; 
}); 
+0

对不起,我可以通过电子邮件,jabber或其他方式与您联系吗? – shybovycha 2011-01-30 13:48:28