是否可以在表单上以编程方式调用Javascript的onsubmit事件?

时间:2008-08-29 02:33:21

标签: javascript ruby-on-rails ruby

在Ruby on Rails中,我正在尝试使用innerHTML帮助程序更新div标签的form_remote_tag。只要关联的选择标记收到onchange事件,就会发生此更新。问题是,<select onchange="this.form.submit();">;不起作用。 document.forms[0].submit()也没有。获取form_remote_tag中生成的onsubmit代码执行的唯一方法是创建一个隐藏的提交按钮,并从select标签调用按钮上的click方法。这是一个有效的ERb部分示例。

<% 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!

7 个答案:

答案 0 :(得分:5)

我意识到这个问题有点陈旧,但你到底在做什么呢?

document.getElementById('formId').onsubmit();
document.getElementById('formId').submit();

document.formName.onsubmit();
document.formName.submit();

当加载文档的DOM时,事件不再是字符串,它们是函数。

alert(typeof document.formName.onsubmit); // function

因此没有理由将函数转换为字符串,以便您可以评估它。

答案 1 :(得分:3)

将表单设为id

然后

document.getElementById('formid').submit();

如果您通过div将Javascript加载到innerHTML,它将无法运行...仅供参考。

答案 2 :(得分:2)

如果你必须使用Rail的内置Javascript生成,我会使用Orion的解决方案,但只需要一个小的改动来补偿返回代码。

eval ('(function(){' + code + '})()');

但是,在我看来,从长远来看,通过将Javascript代码分离为外部文件或单独的可调用函数,您将有更轻松的时间。

答案 3 :(得分:1)

别。

你有一个解决方案。

停止,继续前进到下一个功能点。

我知道,它不漂亮,但存在更大的问题。

答案 4 :(得分:0)

不确定您是否有答案,但在选择的onclick功能中,请拨打onsubmit而不是submit

答案 5 :(得分:-1)

理论上,像eval ('function(){' + code + '}()');这样的东西可以工作(虽然语法失败了)。即使这确实有效,通过选择onchange调用eval仍然是一种贫民窟。另一个解决方案是以某种方式让Rails将onsubmit代码注入select标签的onchange字段,但我不确定是否有办法做到这一点。 ActionView有link_to_remote,但没有明显的帮助器在onchange字段中生成相同的代码。

答案 6 :(得分:-3)

如果您实际上并不想提交表单,只是调用发生在onsubmit中的任何代码,您可能会这样做:(未经测试)

var code = document.getElementById('formId').getAttribute('onsubmit');
eval(code);