هل ينبغي لـ jQuery $(form).submit();لا يتم تشغيل onSubmit ضمن علامة النموذج؟

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

  •  22-07-2019
  •  | 
  •  

سؤال

لدي ما يلي:

<script type="text/javascript">
function CancelFormButton(button) {
    $(button.form).submit();
}
</script>

<form onsubmit="alert('here');">
<input type="button" value="Cancel" onClick="CancelFormButton(this);" />
</form>

عندما أنقر فوق الزر "إلغاء"، لا يتم تشغيل عملية الإرسال من علامة النموذج.

بدلاً من ذلك، يرسل هذا السطر النموذج بنجاح: $(button.form).submit(); ولكن يتخطى alert('here'); ضمن onsubmit في علامة النموذج.

هل هذا صحيح أم أفعل شيئًا خاطئًا؟

بالمناسبة، في هذه الحالة، أريد هذه الوظيفة، لكنني أتساءل فقط عما إذا كنت سأواجه مشكلة في المتصفح حيث يتم تشغيل عملية الإرسال.

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

المحلول

آسف، أسيء فهم سؤالك.

وفق جافا سكريبت - التقاط onsubmit عند استدعاء form.submit():

سُئلت مؤخرًا:"لماذا لا يتم إطلاق حدث form.onsubmit عندما أكون إرسال النموذج الخاص بي باستخدام جافا سكريبت؟"

الاجابة:المتصفحات الحالية لا الالتزام بهذا الجزء من HTML مواصفات.الحدث ينطلق فقط عندما يتم تنشيطه من قبل المستخدم - و لا يطلق النار عند تنشيطه بواسطة رمز.

(تم اضافة التأكيدات).

ملحوظة: يتضمن "التنشيط بواسطة المستخدم" أيضًا الضغط على أزرار الإرسال (ربما بما في ذلك سلوك الإرسال الافتراضي من مفتاح الإدخال ولكني لم أحاول ذلك).كما أعتقد أنه لا يتم تشغيله إذا قمت (باستخدام الكود) بالنقر فوق زر إرسال.

نصائح أخرى

هذا سيؤدي الحل البديل إلى حل المشكلة التي عثر عليهاCletus.

function submitForm(form) {
    //get the form element's document to create the input control with
    //(this way will work across windows in IE8)
    var button = form.ownerDocument.createElement('input');
    //make sure it can't be seen/disrupts layout (even momentarily)
    button.style.display = 'none';
    //make it such that it will invoke submit if clicked
    button.type = 'submit';
    //append it and click it
    form.appendChild(button).click();
    //if it was prevented, make sure we don't get a build up of buttons
    form.removeChild(button);
}

سوف تعمل على جميع المتصفحات الحديثة.
سيعمل عبر علامات التبويب/النوافذ الفرعية الناشئة (نعم، حتى في IE<9).
وهو في الفانيليا!

ما عليك سوى تمرير مرجع DOM إلى عنصر نموذج وسيتأكد من أن جميع المستمعين المرفقين، والإرسال، و(إذا لم يتم منعهم بحلول ذلك الوقت) يرسلون النموذج أخيرًا.

وبلدي حل بسيط:

$("form").children('input[type="submit"]').click();

وإنه عمل بالنسبة لي.

وأعتقد أنه من المعقول أن تريد هذا السلوك في بعض الحالات، ولكن أود أن أقول هذا الرمز لا تعرض لتقديم الشكل الذي ينبغي (دائما) يكون السلوك الافتراضي. افترض أنك تريد للقبض على تقديم شكل مع

$("form").submit(function(e){
    e.preventDefault();
});

ومن ثم القيام ببعض المصادقة على المدخلات. إذا كان رمز يمكن أن تؤدي إلى تقديم معالجات، لا يمكن أبدا أن تشمل

$("form").submit()

وداخل هذا المعالج لأنه من شأنه أن يؤدي في حلقة لا نهائية (سيتم استدعاء معالج نفس، ومنع تقديم والتحقق من صحة، وإعادة). عليك أن تكون قادرة على تقديم النموذج يدويا داخل تقديم معالج من دون التسبب في نفس معالج.

وأنا أدرك هذا لا يجيب على السؤال مباشرة، ولكن هناك الكثير من إجابات أخرى على هذه الصفحة حول كيف يمكن أن يكون اخترق هذه الوظيفة، وشعرت أن هذا يحتاج إلى الإشارة إلى (وهذا طويلا للحصول على تعليق ).

والزناد ( 'تقدم') لا work.because onSubmit الطريقة لا الحصول على النار. التعليمة البرمجية التالية يعمل بالنسبة لي، والدعوة onSubmit طريقة عند استخدام هذا الرمز:

و$("form").find(':submit').click();

وفي محاولة لتحريك () الحدث في وظيفة الخاص بك:

$("form").trigger('submit'); // and then... do submit()

وبدلا من

و$("form").submit()

وهذه محاولة

 $("<input type='submit' id='btn_tmpSubmit'/>").css('display','none').appendTo('form');
 $("#btn_tmpSubmit").click();

ولقد وجدت هذا السؤال منذ سنوات اشابيل.

ومؤخرا حاولت "إعادة كتابة" طريقة تقديمها. أدناه هو رمز بلادي

window.onload= function (){
for(var i= 0;i<document.forms.length;i++){
    (function (p){
        var form= document.forms[i];
        var originFn= form.submit;
        form.submit=function (){
            //do something you like
            alert("submitting "+form.id+" using submit method !");
            originFn();
        }
        form.onsubmit= function (){
            alert("submitting "+form.id+" with onsubmit event !");
        }
    })(i);


}

و}

<form method="get" action="" id="form1">
<input type="submit" value="提交form1" />
<input type="button" name="" id="" value="button模拟提交1" onclick="document.forms[0].submit();" /></form>

وفعلت في IE، لكنها فشلت في المتصفحات الأخرى لنفس السبب "كليتوس"

وأسهل حل لمشكلة هذه هو خلق "مؤقتة" الإدخال مع نوع تقدم والزناد فوق:

var submitInput = $("<input type='submit' />");
$("#aspnetForm").append(submitInput);
submitInput.trigger("click");
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top