关于ruby on rails:是否可以在表单上以编程方式调用Javascript的onsubmit事件?

关于ruby on rails:是否可以在表单上以编程方式调用Javascript的onsubmit事件?

Is it possible to call Javascript's onsubmit event programmatically on a form?

在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部分示例。

1
2
3
4
5
6
<% 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 %>

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

1
2
3
4
5
6
<% 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格式如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
<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;">
 
    <input name="authenticity_token" type="hidden" value="4eacf78eb87e9262a0b631a8a6e417e9a5957cab" />
 
 
    <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" />
 
</form>

我想砍掉不可见的提交按钮,但是使用直线形式。提交似乎不起作用。因此,我需要某种方式来调用表单的onsubmit事件代码。

更新:如果没有Rails生成的return(false);,则Orion Edwards解决方案将起作用。我不知道哪一种情况更糟,将幻像式点击发送到不可见的提交按钮,或者在用JavaScript字符串替换删除返回调用之后,在getAttribute('onsubmit')调用中调用eval!


我知道这个问题有点陈旧,但是您打算做什么呢?

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

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

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

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

因此,没有理由仅将函数转换为字符串即可进行评估。


为您的表格提供id

然后

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

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


如果必须使用Rail的内置Javascript生成,我将使用Orion的解决方案,但需要进行一些小的改动以补偿返回代码。

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

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


不要。

您有解决方法。

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

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


不确定是否有答案,但是在选择的onclick函数中,调用onsubmit而不是submit


理论上,类似eval ('function(){' + code + '}()');的东西可能会起作用(尽管语法失败)。即使这样做确实可行,通过select onchange调用eval仍然是一种贫民窟。另一个解决方案是以某种方式使Rails将onsubmit代码注入到select标签的onchange字段中,但是我不确定是否有这样做的方法。 ActionView具有link_to_remote,但是在onchange字段中没有明显的帮助程序来生成相同的代码。


如果您实际上不想提交表单,而只是调用onsubmit中碰巧的任何代码,则可以执行以下操作:(未经测试)

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

推荐阅读

    linux终端命令行编程?

    linux终端命令行编程?,系统,工作,命令,终端,概念,时间,第一,代码,发行,地方,L

    linux内核总调用命令?

    linux内核总调用命令?,工作,地址,系统,信息,管理,策略,命令,目录,时间,基础,

    linux编程调用命令?

    linux编程调用命令?,系统,标准,管理,工作,基础知识,情况,环境,设备,基础,首

    linux编程所需的命令?

    linux编程所需的命令?,工作,地址,档案,系统,命令,管理,标准,信息,目录,文件,L

    linux命令行编程乱码?

    linux命令行编程乱码?,环境,统一,乱码,中文,状态,软件,数据,系统,字符集,文

    linux命令窗口调用?

    linux命令窗口调用?,系统,工具,首页,终端,命令,数据,盘中,代码,密码,快捷键,

    linux服务器调用命令?

    linux服务器调用命令?,系统,地址,设备,标准,工作,密码,中心,盘中,网络,软件,

    linuxc调用命令框?

    linuxc调用命令框?,系统,工作,标准,情况,设备,环境,命令,函数,语言,程序,如何

    linux系统调用命令行?

    linux系统调用命令行?,系统,网络,代码,密码,位置,工作,通用,平台,电脑,环境,

    批量调用linux命令?

    批量调用linux命令?,工具,下来,软件,系统,密码,地址,时间,认证,向日葵,文件,l

    linux编程c命令符?

    linux编程c命令符?,工具,代码,系统,保险,环境,文件,程序,命令,终端,编辑,到底

    linux内核调用命令?

    linux内核调用命令?,系统,工作,信息,工具,内核,命令,名称,标准,流程,网络,在l

    linux常用编程命令?

    linux常用编程命令?,基础,基础知识,系统,管理,概念,在线,发展,设备,设计,名

    linux命令行界面编程?

    linux命令行界面编程?,系统,环境,代码,密码,命令,终端,首页,软件,工作,电脑,l

    linux内核态调用命令?

    linux内核态调用命令?,系统,密码,名称,代码,状态,异常,内核,工作,服务,数据,

    linux命令调用记录?

    linux命令调用记录?,信息,系统,名称,地址,时间,数据,命令,服务,环境,用户,lin

    linux命令行编程参数?

    linux命令行编程参数?,网络,信息,系统,实时,状态,情况,工具,服务,环境,分析,L

    linux调用编辑命令行?

    linux调用编辑命令行?,工作,状态,系统,命令,模式,数字,代码,首开,第一,管理,l