كيفية تأخير دالة من العودة إلى ما بعد حدوث النقرات

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

  •  06-07-2019
  •  | 
  •  

سؤال

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

(أو، إذا كنت على المسار الخاطئ تمامًا، فما هي المشكلة وكيف أصلحها؟)

function confirmDialog(message) {
....
    $('input#continue', conf_dialog).click(function() {
        $(this).unbind();
        $('p',conf_dialog).fadeOut().text('Are you really sure you want to '+message).fadeIn();
        $(this).click(function() {
            $(conf_dialog).remove();
            return true;
        });
    }); 
    $('input#cancel', conf_dialog).click(function() {
        $(conf_dialog).remove();
        return false;
    }); 
}
هل كانت مفيدة؟

المحلول

function callingFunction() {
  $('a').click(function() {
    confirmDialog('are you sure?', dialogConfirmed);
    // the rest of the function is in dialogConfirmed so doesnt 
    // get run unless the confirm button is pressed
  })
}

function dialogConfirmed() {
  // put the rest of your function here
}

function confirmDialog(message, callback) {
  ...
  $('input#continue', conf_dialog).click(function() {
    callback()
    $(conf_dialog).remove();
    return false;
  }),
  $('input#cancel', conf_dialog).click(function() {
    $(conf_dialog).remove();
    return false;
  })
  ...
}

نصائح أخرى

وايم "غير متأكد من أنك يمكن. AFAIK فقط المدمج في وظيفة مثل confirm، alert أو prompt يمكن حظر حين يسأل عن إجابة.

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

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

والجزء الذي يعتمد على الضغط على زر سوف تحتاج إلى إعادة الحسبان. ربما وضعه في وظيفة أخرى، والذي يطلق عليه من النقر معالجات:

var afterConfirm = function(bool) {
    if(bool) {
        //continue clicked
    } else {
        //cancel clicked
    }
    //do for both cases here
}

//inside confirmDialog input#continue
$(this).click(function() {
    $(conf_dialog).remove();
    afterConfirm(true);
});

قد ترغب في النظر في استخدام الكائنات المؤجلة.فيما يلي رابطان يشرحانهما.

http://www.sitepen.com/blog/2009/03/31/queued-demystifying-deferreds/

http://api.dojotoolkit.org/jsdoc/1.3/dojo.Deferred

باستخدام المؤجل يمكنك أن تأخذ وظيفة الاتصال الخاصة بك:

function doSomething () {
  // this functions does something before calling confirmDialog
  if (confirmDialog) {
    // handle ok
  } else {
    // handle cancel
  }
  // just to be difficult lets have more code here
}

وأعد تشكيله إلى شيء مثل هذا:

function doSomethingRefactored() {
  // this functions does something before calling confirmDialog

  var handleCancel = function() { /* handle cancel */};
  var handleOk = function() { /* handle ok */};
  var doAfter = function() { /* just to be difficult lets have more code here */};

  var d = new dojo.deferred();
  d.addBoth(handleOk, handleCancel);
  d.addCallback(doAfter);
  confirmDialog(message, d);
  return d;
}
  • يجب تحديث تأكيد dialog للاتصال d.callback () أو d.errback () بدلاً من إعادة صحيح أو خطأ
  • إذا كانت الوظيفة التي تستدعي dosomething تحتاج إلى انتظار أن تنتهي من شيء ، فيمكنها إضافة وظائفها الخاصة إلى سلسلة رد الاتصال

أتمنى أن يساعدك هذا...سيكون الأمر أكثر منطقية بعد قراءة مقالة sitepen.

هل يمكن أن تضيف مهلة قبل أن يتم استدعاء الدالة المقبلة

http://www.w3schools.com/htmldom/met_win_settimeout.asp

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