代码之家  ›  专栏  ›  技术社区  ›  hoyhoy

是否可以在窗体上以编程方式调用JavaScript的OnSubmit事件?

  •  6
  • hoyhoy  · 技术社区  · 16 年前

    在RubyonRails中,我正在尝试更新 innerHTML 使用 form_remote_tag 帮手。每当关联的select标记收到onchange事件时,就会进行此更新。问题是, <select onchange="this.form.submit();"> 不起作用。也不 document.forms[0].submit() . 获取表单“remote”标记中生成的on submit代码的唯一方法是创建一个隐藏的提交按钮,并从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>
    

    我想删除不可见的提交按钮,但是使用一个直接的表单。提交似乎不起作用。所以,我需要某种方法来调用表单的onSubmit事件代码。

    更新:如果没有 return(false); 由Rails生成。不过,我不确定哪一个更糟,发送一个幻影点击到一个看不见的提交按钮或调用eval getAttribute('onsubmit') 用javascript字符串替换移除返回调用后调用!

    7 回复  |  直到 7 年前
        1
  •  -3
  •   Orion Edwards    16 年前

    如果您实际上不想提交表单,只需调用OnSubmit中的任何代码,就可以这样做:(未测试)

    var code = document.getElementById('formId').getAttribute('onsubmit');
    eval(code);
    
        2
  •  5
  •   ErikE Russ Cam    14 年前

    我知道这个问题有点老了,但你为什么要逃避呢?

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

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

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

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

    所以没有理由将一个函数转换成一个字符串,这样就可以对它进行求值。

        3
  •  3
  •   Alexander Elgin    8 年前

    给你的表格一张 id .

    然后

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

    如果要将javascript加载到 div 通过 innerHTML ,它不会运行…仅供参考。

        4
  •  2
  •   John Millikin    16 年前

    如果您必须使用Rail的内置JavaScript生成,我将使用Orion的解决方案,但只需进行一个小的修改就可以补偿返回代码。

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

    但是,在我看来,从长远来看,通过将JavaScript代码分离为外部文件或单独的可调用函数,您可以获得更轻松的时间。

        5
  •  0
  •   fatgeekuk    16 年前

    不要。

    你有解决办法。

    停止,转到下一个功能点。

    我知道,它不漂亮,但有更大的问题。

        6
  •  0
  •   Alexander Elgin    8 年前

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

        7
  •  -1
  •   Alexander Elgin    8 年前

    理论上,有点像 eval ('function(){' + code + '}()'); 可以工作(但语法失败)。即使这真的有效,通过选择呼叫疏散仍然是一种贫民区。 onchange . 另一种解决方案是以某种方式让Rails注入 onsubmit 代码进入 换上 select标记的字段,但我不确定是否有这样的方法。ActionView有到远程的链接,但是没有明显的帮助器可以在 换上 字段。