هل من الممكن استدعاء حدث onsubmit الخاص بـ Javascript برمجيًا في نموذج؟

StackOverflow https://stackoverflow.com/questions/33860

  •  09-06-2019
  •  | 
  •  

سؤال

في Ruby on Rails، أحاول تحديث ملف innerHTML لعلامة div باستخدام form_remote_tag المساعد.يحدث هذا التحديث عندما تتلقى علامة تحديد مرتبطة حدث onchange.المشكلة هي، <select onchange="this.form.submit();">;لا يعمل.ولا كذلك document.forms[0].submit().الطريقة الوحيدة للحصول على رمز onsubmit الذي تم إنشاؤه في form_remote_tag لتنفيذه هي إنشاء زر إرسال مخفي، واستدعاء طريقة النقر على الزر من علامة التحديد.فيما يلي مثال جزئي لـ 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>

أريد إلغاء زر الإرسال غير المرئي، ولكن يبدو أن استخدام نموذج إرسال مباشر لا يعمل.لذا، أحتاج إلى طريقة ما لاستدعاء رمز حدث onsubmit الخاص بالنموذج.

تحديث:قد ينجح حل أوريون إدواردز إذا لم يكن هناك return(false); تم إنشاؤها بواسطة القضبان.لست متأكدًا من الأمر الأسوأ، إرسال نقرة وهمية إلى زر إرسال غير مرئي أو الاتصال بالتقييم على getAttribute('onsubmit') اتصل بعد إزالة مكالمة العودة باستبدال سلسلة جافا سكريبت!

هل كانت مفيدة؟

المحلول

إذا لم تكن ترغب فعليًا في إرسال النموذج، ولكنك فقط تستدعي أي رمز موجود في عملية الإرسال، فمن المحتمل أن تتمكن من القيام بذلك:(غير مجرب)

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

نصائح أخرى

أدرك أن هذا السؤال قديم نوعًا ما، ولكن ما الذي تفعله بالتقييم؟

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

أو

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

عندما يتم تحميل DOM لمستند ما، فإن الأحداث لم تعد سلاسل، بل أصبحت وظائف.

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

لذلك لا يوجد سبب لتحويل دالة إلى سلسلة فقط حتى تتمكن من تقييمها.

إعطاء النموذج الخاص بك id.

ثم

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

إذا كنت تقوم بتحميل Javascript إلى ملف div عبر innerHTML, ، لن يتم تشغيله...فقط لمعلوماتك.

إذا كان عليك استخدام جيل جافا سكريبت المدمج في Rail، فسأستخدم حل Orion، ولكن مع تعديل واحد صغير للتعويض عن رمز الإرجاع.

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

ومع ذلك، في رأيي، سيكون لديك وقت أسهل على المدى الطويل من خلال فصل كود Javascript إلى ملف خارجي أو وظائف منفصلة قابلة للاستدعاء.

لا.

لديك الحل.

توقف، وانتقل إلى نقطة الوظيفة التالية.

أعلم أن الأمر ليس جميلًا، لكن هناك مشاكل أكبر.

لست متأكدا إذا كان لديك إجابة حتى الآن أم لا، ولكن في onclick وظيفة التحديد والاتصال onsubmit بدلاً من submit.

من الناحية النظرية، شيء من هذا القبيل eval ('function(){' + code + '}()'); يمكن أن تعمل (على الرغم من فشل بناء الجملة هذا).حتى لو نجح ذلك، فسيظل الأمر بمثابة الغيتو الذي يتم من خلاله استدعاء التقييم من خلال التحديد onchange.الحل الآخر هو جعل Rails يقوم بطريقة ما بحقن ملف onsubmit رمز في onchange حقل علامة التحديد، ولكني لست متأكدًا مما إذا كانت هناك طريقة للقيام بذلك.يحتوي ActionView على link_to_remote، ولكن لا يوجد مساعد واضح لإنشاء نفس الكود في ملف onchange مجال.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top