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

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

  product_path, :update => 'content', :method => 'get' do -%>  'content' do -%>  "this.form.commit.click" %>  "display: none" %>   

我想做的就是这样,但它不起作用。

  product_path, :update => 'content', :method => 'get' do -%>  'content' do -%> # the following line does not work  "this.form.onsubmit()" %>   

那么,有没有办法删除此用例的隐形提交按钮?

似乎有些混乱。 所以,让我解释一下。 基本问题是submit()不会调用呈现在表单中的onsubmit()代码。

Rails从此ERb呈现的实际HTML表单如下所示:

 
foo bar

我想要破解隐形提交按钮,但是使用直接的form.submit似乎不起作用。 所以,我需要一些方法来调用表单的onsubmit事件代码。

更新:Orion Edwards解决方案在没有return(false);会起作用return(false); 由Rails生成。 我不确定哪个更糟糕,在使用javascript字符串替换删除返回调用后,在getAttribute('onsubmit')调用上发送幻像点击不可见的提交按钮或调用eval!

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

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

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

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

要么

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

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

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

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

给你的表格一个id

然后

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

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

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

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

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

别。

你有一个解决方案。

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

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

不确定你是否有答案,但在select的onclickfunction中,请调用onsubmit而不是submit

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