在Ruby on Rails中,我试图使用form_remote_tag
帮助程序更新div标签的innerHTML
。只要关联的选择标签收到onchange事件就会发生此更新。问题是,<select onchange="this.form.submit();">
;不起作用。 document.forms[0].submit()
也不是。获取form_remote_tag中生成的onsubmit代码执行的唯一方法是创建一个隐藏的提交按钮,并从select标签调用该按钮上的click方法。这是一个有效的ERb部分示例。是否可以在窗体上以编程方式调用Javascript的onsubmit事件?
<% form_remote_tag :url => product_path, :update => 'content', :method => 'get' do -%>
<% content_tag :div, :id => 'content' do -%>
<%= select_tag :update, options_for_select([["foo", 1], ["bar", 2]]), :onchange => "this.form.commit.click" %>
<%= submit_tag 'submit_button', :style => "display: none" %>
<% end %>
<% end %>
我想要做的就是这样的,但它不起作用。
<% form_remote_tag :url => product_path, :update => 'content', :method => 'get' do -%>
<% content_tag :div, :id => 'content' do -%>
# the following line does not work
<%= select_tag :update, options_for_select([["foo", 1], ["bar", 2]]), :onchange => "this.form.onsubmit()" %>
<% end %>
<% end %>
那么,有什么办法可以删除这个用例的不可见提交按钮吗?
似乎有一些混淆。所以,让我解释一下。基本问题是,submit()
不会将代码呈现为表单中的onsubmit()
代码。
Rails所从这个ERb的呈现实际的HTML形式如下:
<form action="/products/1" method="post" onsubmit="new Ajax.Updater('content', '/products/1', {asynchronous:true, evalScripts:true, method:'get', parameters:Form.serialize(this)}); return false;">
<div style="margin:0;padding:0">
<input name="authenticity_token" type="hidden" value="4eacf78eb87e9262a0b631a8a6e417e9a5957cab" />
</div>
<div id="content">
<select id="update" name="update" onchange="this.form.commit.click">
<option value="1">foo</option>
<option value="2">bar</option>
</select>
<input name="commit" style="display: none" type="submit" value="submit_button" />
</div>
</form>
我想斧头无形的提交按钮,但使用直form.submit似乎不起作用。所以,我需要一些方法来调用窗体的onsubmit事件代码。
更新:如果没有Rails生成的return(false);
,Orion Edwards解决方案可以工作。我不确定哪个更糟糕,但在用javascript字符串替换删除回拨后,发送幻影点击到隐形提交按钮或在getAttribute('onsubmit')
调用上调用eval!
这在理论上有效,但我仍然在生产中使用我的原始代码,以避免使用eval。 – hoyhoy 2008-09-12 07:56:39