Можно ли программно вызвать событие Javascript onsubmit в форме? - PullRequest
6 голосов
/ 29 августа 2008

В Ruby on Rails я пытаюсь обновить innerHTML тега div с помощью помощника form_remote_tag. Это обновление происходит всякий раз, когда связанный тег выбора получает событие onchange. Проблема в том, <select onchange="this.form.submit();">; не работает Также не document.forms[0].submit(). Единственный способ получить код onsubmit, сгенерированный в form_remote_tag, - это создать скрытую кнопку отправки и вызвать метод click для кнопки из тега 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(), отображаемый в форме.

Фактическая HTML-форма, которую Rails отображает из этого ERb, выглядит следующим образом:

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

Я хочу укоротить невидимую кнопку отправки, но использование прямой формы. Отправка не работает. Итак, мне нужен какой-то способ вызова кода события отправки формы.

Обновление: решение Orion Edwards сработало бы, если бы Rails не генерировал return(false);. Я не уверен, что хуже, посылая фантомный щелчок невидимой кнопке отправки или вызывая eval на вызове getAttribute('onsubmit') после удаления обратного вызова с заменой строки javascript!

Ответы [ 7 ]

5 голосов
/ 18 марта 2010

Я понимаю, что этот вопрос довольно старый, но какого чёрта вы делаете для этого?

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

или

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

Когда DOM документа загружен, события больше не являются строками, они являются функциями.

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

Так что нет смысла преобразовывать функцию в строку только для того, чтобы вы могли ее оценить.

3 голосов
/ 29 августа 2008

дайте вашей форме id.

тогда

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

Если вы загружаете Javascript в div через innerHTML, он не запустится ... только к вашему сведению.

2 голосов
/ 29 августа 2008

Если вам нужно использовать встроенное в Rail поколение Javascript, я бы использовал решение Ориона, но с одним небольшим изменением, чтобы компенсировать код возврата.

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

Однако, по моему мнению, вам было бы легче в конечном итоге разделить код Javascript на внешний файл или отдельные вызываемые функции.

1 голос
/ 19 сентября 2008

Не.

У вас есть решение.

Стоп, перейти к следующей функциональной точке.

Я знаю, это не красиво, но есть большие проблемы.

0 голосов
/ 27 января 2009

Не уверен, есть ли у вас ответ или нет, но в функции выбора onclick вызовите onsubmit вместо submit.

0 голосов
/ 29 августа 2008

Теоретически может работать что-то вроде eval ('function(){' + code + '}()'); (хотя этот синтаксис не работает). Даже если бы это сработало, все равно было бы что-то вроде гетто - вызывать eval через select onchange. Другим решением было бы как-то заставить Rails внедрить код onsubmit в поле onchange тега select, но я не уверен, есть ли способ сделать это. В ActionView есть link_to_remote, но нет очевидного помощника для генерации того же кода в поле onchange.

0 голосов
/ 29 августа 2008

Если вы на самом деле не хотели отправлять форму, а просто вызывали любой код, который оказался в onsubmit, вы могли бы сделать это: (не проверено)

var code = document.getElementById('formId').getAttribute('onsubmit');
eval(code);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...