jQuery - ডিফল্ট প্রতিরোধ করুন, তারপরে ডিফল্ট চালিয়ে যান


106

আমার একটি ফর্ম রয়েছে যা জমা দেওয়ার পরে আমার ফর্মটি জমা দেওয়ার আগে কিছু অতিরিক্ত প্রক্রিয়াজাতকরণ করা দরকার। আমি ডিফল্ট ফর্ম জমা দেওয়ার আচরণটি আটকাতে পারি, তারপরে আমার অতিরিক্ত প্রক্রিয়াজাতকরণ করুন (এটি মূলত গুগল ম্যাপস এপিআই কল করে এবং ফর্মটিতে কয়েকটি লুকানো ক্ষেত্র যুক্ত করছে) - এবং তারপরে আমাকে ফর্মটি জমা দিতে হবে।

"ডিফল্ট প্রতিরোধ" করার কোনও উপায় আছে, তারপরে কিছু পরে "ডিফল্ট চালিয়ে যেতে চান?"


@FelixKling আপনি কি বোঝাতে চেয়েছেন stackoverflow.com/questions/7610871/... ?
এম মিম্পেন

উত্তর:


54

আপনি যখন .submit()ইভেন্টটিকে ফর্মের সাথে আবদ্ধ করেন এবং আপনি ফিরে আসার আগে যা করতে চান তা করেন (সত্য), আসল জমা দেওয়ার আগে এই জিনিসগুলি ঘটে।

উদাহরণ স্বরূপ:

$('form').submit(function(){
    alert('I do something before the actual submission');
    return true;
});

সহজ উদাহরণ

Jquery.com- এ অন্য একটি উদাহরণ: http://api.jquery.com/submit/#entry- উদাহরণ


4
আপনি কি বলছেন যে "সত্য প্রত্যাবর্তনের আগে" সমস্ত কোড না হওয়া পর্যন্ত ফর্মটি জমা দেওয়া হবে না; বিবৃতি কার্যকর করা হয়?
ডেভেলপারভিন

4
হ্যাঁ এটি (জমা দেওয়া) ফাংশনটি ঠিক তাই করে।
রন ভ্যান ডের হাইজডেন

8
এটি সমকালীন কারণ এটি একটি ভাল উদাহরণ নয়। আমার যে জিনিসগুলি করার দরকার তা যদি এসিঙ্ক কল হয়? সুতরাং কেসটি হ'ল "জমা দিন -> অ্যাসিঙ্ক স্টাফ করুন এবং ফর্মটি করবেন না -> অ্যাসিঙ্ক কলব্যাক ফর্মের কিছু ক্ষেত্র পূরণ করুন -> কলব্যাক থেকে ফর্মটি জমা দিন"
দ্য গডফাদার

4
কিছু অ্যাসিঙ্ক jQuery কোড রান সম্পর্কে কি ?! কাজও করবে?
মোমবাতি জ্যাক

এটি আমার পক্ষে দুর্দান্ত কাজ করে। জমা দেওয়ার আগে জিনিসগুলি নিয়ন্ত্রণ করতে আমি এটি ব্যবহার করি এবং জিনিসগুলি ঠিক না হলে আমি "মিথ্যা প্রত্যাবর্তন" ব্যবহার করি। আমি একদিনের জন্য এই সমাধানটির সন্ধান করেছি। অনেক ধন্যবাদ.
livefreeor

54

ব্যবহার jQuery.one()

উপাদানগুলির জন্য একটি ইভেন্টে একটি হ্যান্ডলার সংযুক্ত করুন। হ্যান্ডলারটি ইভেন্টের টাইপ অনুযায়ী উপাদান হিসাবে একবারে সম্পাদিত হয়

$('form').one('submit', function(e) {
    e.preventDefault();
    // do your things ...

    // and when you done:
    $(this).submit();
});

ব্যবহার রোধও oneঅসীম লুপ কারণ এই কাস্টম submitইভেন্টটি প্রথম জমা দেওয়ার পরে আলাদা করা হয়েছে।


4
এটি আবার ক্লিক করার পরে জমা দেওয়া হবে :(
কৌতূহল

4
সম্ভবত আপনি অসীম লুপের সাথে মুখোমুখি হবেন
মেহরদাদ হোসেইননেজাদ

অসীম লুপ, ফাংশনটি হওয়া উচিত .একটি নয়
স্যাডভলপ

অসীম লুপটি রোধ করতে প্রথমে ফর্ম ইভেন্টটি আবদ্ধ করুন এবং জমা দিন। $(this).unbind(); $(this).submit();
রবি আলভিয়ান জয়া মুলিয়া

27

আমি শুধু করতাম:

 $('#submiteButtonID').click(function(e){
     e.preventDefault();
     //do your stuff.
     $('#formId').submit();
 });

preventDefaultপ্রথমে কল করুন এবং submit()ফাংশনটি পরে ব্যবহার করুন , যদি আপনাকে কেবল ফর্মটি জমা দেওয়ার প্রয়োজন হয়


আপনার ক্লিক ইভেন্ট হ্যান্ডলারের ভিতরে যুক্তি যুক্ত করবেন না। অন্যকে দায়িত্ব অর্পণ করুন।
রই নমির

27
এটি নিশ্চিত করে একটি বোতামটি ক্লিক করবে। যদি ব্যবহারকারীটি ফর্মের মধ্যে থেকে কেবল "প্রবেশ" বোতামটি হিট করে? সেটিও ফর্ম জমা দেবে। সুতরাং, সাবমিট বাটন ক্লিক করার উপর নির্ভর করা সম্ভবত ভাল ধারণা নয়।
স্ট্যাকওভারফ্লো নিউবি

আমি কেবল একটি ক্লিকের উদাহরণ
দিচ্ছিলাম

4
যাই হোক না কেন, আপনি যে স্নিপেটটি দিয়েছেন তা কেবলমাত্র ব্যবহারকারী একটি বোতামে ক্লিক করলেই কাজ করবে। এটি ফর্মগুলি কীভাবে কাজ করে তা নয়। অন্য কোন পরামর্শ?
স্ট্যাকওভারফ্লো নিউবি


18

এই উপায়টি ব্যবহার করে আপনি আপনার জেএসে একটি অবিরাম লুপ করবেন। আরও ভাল উপায় করতে আপনি নিম্নলিখিতটি ব্যবহার করতে পারেন

var on_submit_function = function(evt){
    evt.preventDefault(); //The form wouln't be submitted Yet.
    (...yourcode...)

    $(this).off('submit', on_submit_function); //It will remove this handle and will submit the form again if it's all ok.
    $(this).submit();
}

$('form').on('submit', on_submit_function); //Registering on submit.

আমি আসা করি এটা সাহায্য করবে! ধন্যবাদ!


সেরা উপায়ে আসলে, অ্যাসিঙ্ক
srghma

@bjornmelgaard আমার মনে আছে যে ASYNC আছে অ মান
ভ্যালারিও বোজ

6

এটি, আইএমএইচও, সবচেয়ে জেনেরিক এবং শক্তিশালী সমাধান (যদি আপনার ক্রিয়াগুলি ব্যবহারকারী-ট্রিগার হয়, যেমন 'বোতামে ব্যবহারকারী ক্লিক করুন'):

  • প্রথমবার একজন হ্যান্ডলারকে চেক ডাব্লুএইচও বলে ডাকা হয়:
    • যদি কোনও ব্যবহারকারী এটিকে কল্পনা করে থাকে - আপনার স্টাফটি করুন এবং তারপরে এটি আবার ট্রিগার করুন (আপনি যদি চান) - প্রোগ্রামেটিকভাবে
    • অন্যথায় - কিছুই করবেন না (= "ডিফল্ট চালিয়ে যান")

উদাহরণ হিসাবে, "আপনি কি নিশ্চিত?" যুক্ত করার জন্য এই মার্জিত সমাধানটি নোট করুন কোনও বৈশিষ্ট্যযুক্ত একটি বোতাম সজ্জিত করে কোনও বোতামে পপআপ। ব্যবহারকারী শর্তসাপেক্ষে ডিফল্ট আচরণ চালিয়ে যাব যদি ব্যবহারকারী অনির্বাচন না করে।

1. আসুন আমরা যে প্রতিটি বোতামটিতে একটি "নিশ্চিত আপনি" একটি সতর্কতা পাঠ্য পপআপ করতে চাই:

<button class="btn btn-success-outline float-right" type="submit"  ays_text="You will lose any unsaved changes... Do you want to continue?"                >Do something dangerous</button>

২. এই জাতীয় সমস্ত বোতামে হ্যান্ডলার সংযুক্ত করুন:

$('button[ays_text]').click(function (e, from) {
    if (from == null) {  // user clicked it!
        var btn = $(this);
        e.preventDefault();
        if (confirm() == true) {
            btn.trigger('click', ['your-app-name-here-or-anything-that-is-not-null']);
        }
    }
    // otherwise - do nothing, ie continue default
});

এটাই.


4
দুর্দান্ত উত্তর! আমি জানতাম না যে আপনি .trigger ()
জেমস হিববার্ড


2

খাঁটি জাভাস্ক্রিপ্ট পদ্ধতিতে, আপনি ডিফল্ট প্রতিরোধের পরে ফর্মটি জমা দিতে পারেন।

এটি কারণ HTMLFormElement.submit() কখনও কল না onSubmit()। সুতরাং আমরা ফর্মটি জমা দেওয়ার জন্য সেই নির্দিষ্টকরণের বিজোড়তার উপর নির্ভর করছি যেন এখানে কোনও কাস্টম অনসামিত হ্যান্ডলার নেই।

var submitHandler = (event) => {
  event.preventDefault()
  console.log('You should only see this once')
  document.getElementById('formId').submit()
}

একটি সিঙ্ক্রোনাস অনুরোধের জন্য এই ফিডলটি দেখুন ।


সমাপ্তির জন্য একটি অ্যাসিঙ্ক অনুরোধের জন্য অপেক্ষা করা ঠিক তত সহজ:

var submitHandler = (event) => {
  event.preventDefault()
  console.log('before')
  setTimeout(function() {
    console.log('done')
    document.getElementById('formId').submit()
  }, 1400);
  console.log('after')
}

অ্যাসিঙ্ক্রোনাস অনুরোধের উদাহরণের জন্য আপনি আমার ফিডলটি পরীক্ষা করতে পারেন ।


এবং আপনি যদি প্রতিশ্রুতি দিয়ে নামেন:

var submitHandler = (event) => {
  event.preventDefault()
  console.log('Before')
    new Promise((res, rej) => {
      setTimeout(function() {
        console.log('done')
        res()
      }, 1400);
    }).then(() => {
      document.getElementById('bob').submit()
    })
  console.log('After')
}

এবং এখানে যে অনুরোধ


2

সঙ্গে jQuery এবং উপরোক্ত @ Joepreludian এর উত্তর একটি ছোট প্রকরণ:

মনে রাখা গুরুত্বপূর্ণ পয়েন্ট:

  • .one(...) পরিবর্তে .on(...) or .submit(...)
  • namedফাংশন পরিবর্তে anonymous functionযেহেতু আমরা এটির মধ্যে উল্লেখ করব callback

$('form#my-form').one('submit', function myFormSubmitCallback(evt) {
    evt.stopPropagation();
    evt.preventDefault();
    var $this = $(this);
    if (allIsWell) {
        $this.submit(); // submit the form and it will not re-enter the callback because we have worked with .one(...)
    } else {
        $this.one('submit', myFormSubmitCallback); // lets get into the callback 'one' more time...
    }
});

আপনি allIsWellনীচের স্নিপেটে ভেরিয়েবলের মান পরিবর্তন করতে trueবা falseকার্যকারিতা পরীক্ষা করতে পারেন:

$('form#my-form').one('submit', function myFormSubmitCallback(evt){
  evt.stopPropagation();
  evt.preventDefault();
  var $this = $(this);
  var allIsWell = $('#allIsWell').get(0).checked;
  if(allIsWell) {
    $this.submit();
  } else {
    $this.one('submit', myFormSubmitCallback);
  }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form action="/" id="my-form">
  <input name="./fname" value="John" />
  <input name="./lname" value="Smith" />
  <input type="submit" value="Lets Do This!" />
  <br>
  <label>
    <input type="checkbox" value="true" id="allIsWell" />
    All Is Well
  </label>
</form>

শুভকামনা ...


1

তুমি ব্যবহার করতে পার e.preventDefault() যা বর্তমান ক্রিয়াকলাপ বন্ধ করবে।

আপনি কি করতে পারেন তুলনায়$("#form").submit();

 $('#form').submit(function (e)
{
    return !!e.submit;
});
if(blabla...)
{...
}
else
{
    $('#form').submit(
    {
        submit: true
    });
}

এটি আমার জন্য খুব বিভ্রান্তিকর .. এটি কেবল চারপাশে ঘুরে বেড়াবে না?
দপিডমিনি

1

"লুপিং জমা না করে বৈধতা ইনজেকশন":

আমি এইচটিএমএল 5 যাচাইয়ের আগে কেবল পুনরায় ক্যাপচা এবং কিছু অন্যান্য জিনিস পরীক্ষা করতে চাই, তাই আমি এর মতো কিছু করেছি (যাচাইকরণের ফাংশনটি সত্য বা মিথ্যা প্রত্যাবর্তন করে):

$(document).ready(function(){
   var application_form = $('form#application-form');

   application_form.on('submit',function(e){

        if(application_form_extra_validation()===true){
           return true;
        }

        e.preventDefault();

   });
});
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.