是否可以在窗体上以编程方式调用Javascript的onsubmit事件?
在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部分示例。
<% 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!
解决方案
回答
给表格一个" id"。
然后
document.getElementById('formid').submit();
如果我们要通过innerHTML将Javascript加载到div中,它将无法运行...仅供参考。
回答
如果我们实际上不想提交表单,而只是调用onsubmit中碰巧的任何代码,则可以执行以下操作:(未经测试)
var code = document.getElementById('formId').getAttribute('onsubmit'); eval(code);
回答
如果我们必须使用Rail的内置Javascript生成,我将使用Orion的解决方案,但需要进行一些小的改动以补偿返回代码。
eval ('(function(){' + code + '})()');
但是,从我的角度来看,通过将Javascript代码分离到一个外部文件或者单独的可调用函数中,从长远来看,我们将有一个更轻松的时间。
回答
从理论上讲,类似`eval('function(){'+ code +'}()';;)之类的东西可能会起作用(尽管语法失败)。即使这样做确实可行,通过选择的" onchange"调用一个eval仍然是一种贫民窟。另一个解决方案是以某种方式使Rails将onsubmit代码注入到select标签的onchange字段中,但是我不确定是否有这样做的方法。 ActionView具有link_to_remote,但是没有明显的帮助器可以在onchange字段中生成相同的代码。
回答
别。
我们有解决方案。
停止,继续下一个功能点。
我知道,这并不漂亮,但是存在更大的问题。
回答
不确定是否有答案,但是在选择的onclick函数中,调用onsubmit而不是submit。
回答
我知道这个问题有点陈旧,但是我们打算做什么呢?
document.getElementById('formId').onsubmit(); document.getElementById('formId').submit();
或者
document.formName.onsubmit(); document.formName.submit();
加载文档的DOM时,事件不再是字符串,而是函数。
alert(typeof document.formName.onsubmit); // function
因此,没有理由仅将函数转换为字符串即可进行评估。