是否可以在表单上以编程方式调用Javascript的onsubmit事件?
在RubyonRails中,我试图使用form_remote_标记助手更新div标记的innerHTML。每当关联的select标记接收到onchange事件时,就会发生此更新。问题是;不起作用。document.forms[0]也不提交。获取表单_remote _标记中生成的onsubmit代码以执行的唯一方法是创建一个隐藏的submit按钮,并从select标记调用按钮上的click方法。下面是一个有效的ERb部分示例是否可以在表单上以编程方式调用Javascript的onsubmit事件?,javascript,ruby-on-rails,ruby,Javascript,Ruby On Rails,Ruby,在RubyonRails中,我试图使用form_remote_标记助手更新div标记的innerHTML。每当关联的select标记接收到onchange事件时,就会发生此更新。问题是;不起作用。document.forms[0]也不提交。获取表单_remote _标记中生成的onsubmit代码以执行的唯一方法是创建一个隐藏的submit按钮,并从select标记调用按钮上的click方法。下面是一个有效的ERb部分示例 <% form_remote_tag :url => pro
<% 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 %>
我想删除不可见的submit按钮,但使用直接表单。submit似乎不起作用。所以,我需要一些方法来调用表单的onsubmit事件代码
更新:猎户座爱德华兹解决方案将工作,如果没有一个错误;由Rails生成。我不确定哪一个更糟糕,发送一个幻影点击到一个不可见的提交按钮,或者在删除带有javascript字符串替换的返回调用后调用getAttribute'onsubmit'调用上的eval 给你的表格一个id
然后
如果您是通过innerHTML将Javascript加载到div中,它将不会运行…仅供参考。如果您实际上不想提交表单,而只是调用onsubmit中的任何代码,您可能会这样做:未经测试
var code = document.getElementById('formId').getAttribute('onsubmit');
eval(code);
如果您必须使用Rail的内置Javascript生成,我将使用Orion的解决方案,但只需对返回代码进行一个小改动即可
eval ('(function(){' + code + '})()');
然而,在我看来,通过将Javascript代码分离到外部文件或单独的可调用函数中,从长远来看会更容易;如果语法失败,可能会起作用。即使这真的起作用了,通过选择一次改变来进行评估还是有点像犹太人区。另一个解决方案是让Rails将onsubmit代码注入select标记的onchange字段,但我不确定是否有办法做到这一点。ActionView具有指向远程的链接,但是在onchange字段中没有明显的帮助程序来生成相同的代码。不要这样做
alert(typeof document.formName.onsubmit); // function
你有一个解决办法
停止,转到下一个功能点
我知道,这并不漂亮,但还有更大的问题。不确定您是否有答案,但在select的onclick功能中,调用submit而不是submit。我意识到这个问题有点老了,但您到底在做什么评估
document.getElementById('formId').onsubmit();
document.getElementById('formId').submit();
或
加载文档的DOM时,事件不再是字符串,而是函数
alert(typeof document.formName.onsubmit); // function
因此,没有理由将函数转换为字符串,以便对其求值。这在理论上是可行的,但我仍然在生产中使用我的原始代码,只是为了避免使用求值。
document.getElementById('formId').onsubmit();
document.getElementById('formId').submit();
document.formName.onsubmit();
document.formName.submit();
alert(typeof document.formName.onsubmit); // function