2008-08-29 65 views
6

在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部分示例。是否可以在窗体上以编程方式调用Javascript的onsubmit事件?

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

回答

-3

如果你实际上并没有想提交表单,而只是调用任何代码正好是在的onsubmit,你可能做到这一点:(未经测试)

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

这在理论上有效,但我仍然在生产中使用我的原始代码,以避免使用eval。 – hoyhoy 2008-09-12 07:56:39

3

给你一个id

然后

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

如果通过innerHTML加载JavaScript为div,它不会运行...仅供参考。

2

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

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

然而,在我看来,你会被分离出的Javascript代码到外部文件或单独的可调用的函数必须从长远来看,一个更简单的时间。

+0

这种语法是错误的,但这个想法是可靠的。 – hoyhoy 2008-09-12 07:57:59

-1

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

0

不要。

您有一个解决方案。

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

我知道,这不是很漂亮,但有更大的问题。

0

不确定您是否有答案,但在onclick函数的select中,请致电onsubmit而不是submit

5

我意识到这个问题有点古怪,但是你在做什么样的评估?

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

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

当加载文档的DOM中,事件不是任何字符串的更多,但它们的功能。

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

所以没有理由的功能转换为字符串,所以您可以EVAL它。

相关问题