7

Ruby on Rails で、ヘルパーinnerHTMLを使用して div タグのを更新しようとしています。form_remote_tagこの更新は、関連する選択タグが onchange イベントを受け取るたびに発生します。問題は、<select onchange="this.form.submit();">; 動作しません。もありませんdocument.forms[0].submit()。form_remote_tag で生成された onsubmit コードを実行する唯一の方法は、非表示の送信ボタンを作成し、select タグからボタンのクリック メソッドを呼び出すことです。これは、動作する 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()

この ERb から Rails がレンダリングする実際の 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 イベント コードを呼び出す何らかの方法が必要です。

return(false);更新: Rails によって生成された がなければ、Orion Edwards ソリューションは機能します。目に見えない送信ボタンにファントム クリックを送信するかgetAttribute('onsubmit')、javascript 文字列置換でリターン コールを削除した後に呼び出しで eval を呼び出すか、どちらが悪いかはわかりません。

4

7 に答える 7

5

この質問はちょっと古いと思いますが、一体何のために eval をしているのですか?

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

また

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

ドキュメントの DOM が読み込まれると、イベントは文字列ではなくなり、関数になります。

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

したがって、関数を評価できるようにするためだけに関数を文字列に変換する理由はありません。

于 2010-03-17T22:20:48.630 に答える
3

フォームに を付けますid

それから

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

Javascript をdivviainnerHTMLにロードしている場合、実行されません...参考までに。

于 2008-08-29T02:43:46.877 に答える
2

If you have to use Rail's built-in Javascript generation, I would use Orion's solution, but with one small alteration to compensate for the return code.

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

However, in my opinion you'd have an easier time in the long run by separating out the Javascript code into an external file or separate callable functions.

于 2008-08-29T05:21:02.117 に答える
1

しないでください。

あなたには解決策があります。

停止して、次の機能ポイントに進みます。

きれいではありませんが、もっと大きな問題があります。

于 2008-09-19T17:47:10.017 に答える
0

まだ答えがあるかどうかはわかりませんが、selectの機能で、の代わりにをonclick呼び出します。onsubmitsubmit

于 2009-01-26T22:41:08.377 に答える
-1

理論的には、次のようなものeval ('function(){' + code + '}()');が機能する可能性があります (ただし、その構文は失敗します)。それが機能したとしても、 select を介して eval を呼び出すのは、いわばゲットーのようなものですonchange。もう 1 つの解決策は、Rails にselect タグonsubmitのフィールドにコードを挿入させるonchangeことですが、それを行う方法があるかどうかはわかりません。ActionView には link_to_remote がありますが、onchangeフィールドで同じコードを生成する明確なヘルパーはありません。

于 2008-08-29T06:18:14.723 に答える
-3

実際にフォームを送信したくないが、たまたま onsubmit にあるコードを呼び出すだけの場合は、次のようにすることができます: (未テスト)

var code = document.getElementById('formId').getAttribute('onsubmit');
eval(code);
于 2008-08-29T04:03:59.257 に答える