Sweetalert: مفتاح Tab لا يعمل بعد فتح شكلين Sweet Alert على التوالي

تم إنشاؤها على ١٥ أكتوبر ٢٠١٤  ·  20تعليقات  ·  مصدر: t4t5/sweetalert

مرحبا،

يبدو أنه عندما يفتح مربع حوار SweetAlert مربعًا آخر بعد الانتهاء ، يتوقف مفتاح الجدولة عن العمل ، وتكون جميع ضغطات المفاتيح الأخرى على ما يرام.

يمكنك إعادة إنشاء هذا باستخدام المثال الموجود على http://tristanedwards.me/sweetalert.

هذا على وجه التحديد:

swal({      title: "Are you sure?",   
            text: "Your will not be able to recover this imaginary file!",   
            type:  "warning",   
            showCancelButton: true,   
            confirmButtonColor: "#DD6B55",   
            confirmButtonText: "Yes, delete it!",   
            cancelButtonText: "No, cancel plx!",   
            closeOnConfirm: false,   
            closeOnCancel: false }, 
            function(isConfirm){  
                 if (isConfirm) {     
                 swal("Deleted!", "Your imaginary file has been deleted.", "success");  
                 } else {     
                 swal("Cancelled", "Your imaginary file is safe :)", "error");   
                 } });

أعتقد أنه يقوم بالنسخ فوق معالجة ضغط المفاتيح من الوضع السابق ، وتحديداً في وظيفة closeModal () ، هذا الجزء:

 // Reset the page to its previous state
    window.onkeydown = previousWindowKeyDown;
    document.onclick = previousDocumentClick;
    if (previousActiveElement) {
      previousActiveElement.focus();
    }

ربما هو مجرد التركيز على النموذج السابق والتسجيل مرة أخرى keydown و onclick؟

help wanted

التعليق الأكثر فائدة

لتنفيذ الإصلاح بواسطة jayquest دون تغيير المكتبة ، استخدمت الكود التالي:

var previousWindowKeyDown = window.onkeydown ؛
سوال ({
العنوان: "هل أنت متأكد؟" ،
closeOnConfirm: خطأ ،
closeOnCancel: خطأ
} ، الوظيفة (isConfirm) {
window.onkeydown = previousWindowKeyDown ؛
إذا (isConfirm) {
swal ("تم حذف!"، "تم حذف ملفك التخيلي."، "نجاح")؛
} آخر {
swal ('ملغى'، 'ملفك التخيلي آمن :)'، 'error')؛
}
}) ؛

ال 20 كومينتر

من هذا المثال لا أرى حقًا أن ما تقوله صحيح ،
عندما يكون مفتاح "علامة التبويب" يتحرك فقط بين الأزرار ،
عندما أحصل على الوضع الثاني ، يكون لدي زر واحد فقط ، لذلك بغض النظر عن مقدار الضغط على زر علامة التبويب ، فسيظل دائمًا على زر واحد به.

آسف لم أوضح ذلك!

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

لقد حاولت الإصلاح في jack126guy / sweetalert @ issue127 . يبدو أنه يعمل بقدر ما يعود التركيز إلى الزر الموجود على الصفحة.

ومع ذلك ، فإنه يكشف عن مشكلة أخرى: لا يزال يتعذر عليك الانتقال إلى زر آخر ، وعندما تضغط على Enter لإظهار التنبيه مرة أخرى ، تصبح الأمور غريبة.

نعم ، لقد حاولت إصلاحًا مشابهًا لك ولكن باستخدام متغير عام للنافذة للتأكد من أنه عنصر من موقع الويب بخلاف SweetAlert ، فإنه يركز على العنصر في المستند ولكن لا يزال مفتاح Tab لا يعمل.

ما يبدو أنه تم إصلاحه في الوقت الحالي هو إزالة stopEventPropagation (e) في عبارة if (keycode == 9) في طريقة handleKeyDown . لكنني أعتقد أن هناك آثارًا جانبية أخرى لهذا ...

أود أن أعرض عليك التزامًا ولكنني أجريت بعض التغييرات الأخرى على المكتبة والتي قد لا يريدها الآخرون.

لذلك في حال أراد أي شخص إصلاحًا مؤقتًا لهذا الخطأ ، فإليك نسخة متشعبة من هذا المشروع: https://github.com/heero-yuy/sweetalert.git

إنه يعمل بنسبة 100 ٪ لجميع مشاريعي حتى الآن ، لكنني لم أختبره على نطاق واسع للتأكد من أن التغييرات التي أجريتها لم تعطل أي وظائف أخرى.

لقد أصلحته بإدخال سطرين من الكود أعلاه في بداية الوظيفة sweetAlert أو swal في السطر 215 ، ولا أعرف ما إذا كان هذا هو الحل الأفضل ، ولكنه يعمل بالنسبة لي.

/*
 * Global sweetAlert function
 */
var sweetAlert, swal;

sweetAlert = swal = function() {

    if(previousWindowKeyDown !== undefined && window.onkeydown !== previousWindowKeyDown)`
        window.onkeydown = previousWindowKeyDown;

: +1:. يجب أن يحصل هذا على بعض الأولوية.

يبدو أن الإصلاح بواسطة jayquest يعمل.

لتنفيذ الإصلاح بواسطة jayquest دون تغيير المكتبة ، استخدمت الكود التالي:

var previousWindowKeyDown = window.onkeydown ؛
سوال ({
العنوان: "هل أنت متأكد؟" ،
closeOnConfirm: خطأ ،
closeOnCancel: خطأ
} ، الوظيفة (isConfirm) {
window.onkeydown = previousWindowKeyDown ؛
إذا (isConfirm) {
swal ("تم حذف!"، "تم حذف ملفك التخيلي."، "نجاح")؛
} آخر {
swal ('ملغى'، 'ملفك التخيلي آمن :)'، 'error')؛
}
}) ؛

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

(function (){

    var _swal = window.swal;

    window.swal = function(){

        var previousWindowKeyDown = window.onkeydown;

        _swal.apply(this, Array.prototype.slice.call(arguments, 0));

        window.onkeydown = previousWindowKeyDown;

    };

})();

يمكنني تأكيد هذا الخطأ أيضًا ، كما أن الحل أعلاه يعمل جيدًا أيضًا! : +1:

نعم ، الحل البديل لـ JustinWinthers يعمل بشكل جيد!

ومع ذلك ، يبدو أن f-up باستخدام escape وإدخال المفاتيح في مربع الحوار

الحل البديل من amoralidad يعمل معي. شكر!

شكرا jayquest ... @ t4t5 الرجاء إصلاح هذا في الفرع الرئيسي!

لقد قدمت للتو طلب سحب مع الحل الخاص بي. https://github.com/t4t5/sweetalert/pull/547

JustinWinthers ، باستخدام type: 'input' . عند محاولة النقر فوق الزر "إلغاء" لإغلاق مربع الحوار ، تظهر الرسالة swal.showInputError is not a function .

على سبيل المثال ، انتقل إلى http://clubcare.no/dashboard واضغط على Glemt passord (نسيت كلمة المرور)

إزالة وظيفتك تجعلها تعمل مرة أخرى. أي أفكار عن كيفية التخلص من هذا السلوك؟ شكرا لك!

jayquest شكرًا لك على إصلاح هذه المشكلة.

مرحباJustinWinthers

لقد جربت اقتراحك لإصلاح مشكلة الجدولة هذه بعد فتح SweetAlert. لقد تم حل المشكلة ، ومع ذلك بدأت في تلقي هذا الخطأ عندما أحاول إغلاق Sweetalert باستخدام swal.close(); عند النقر فوق الزر cancel :

swal.close is not a function

هذا مشابه لما قاله EduardJS أعلاه. هل هناك طريقة لجعلهم يعملون؟ أشعر أننا اقتربنا كثيرًا ولكن بسبب هذا الخطأ ، اضطررت إلى إزالة الكود الذي اقترحته. أي مساعدة سوف تكون كبيرة.

في صحتك،
نيل.

أبسط حل ممكن استنادًا إلى الحل البديل لـ JustinWinthers الذي تمكنت من العثور عليه (بدون تعديل المكتبة) ، هو swal.close وتعيين window.onkeydown إلى window.onkeydown معالج الحدث

(function (){
    var close = window.swal.close;
    var previousWindowKeyDown = window.onkeydown;
    window.swal.close = function() {
        close();
        window.onkeydown = previousWindowKeyDown;
    };
})();

أو في حالتي أبسط:

(function (){
    var close = window.swal.close;
    window.swal.close = function() {
        close();
        window.onkeydown = null;
    };
})();

باستخدام هذا الحل البديل ، من الممكن الآن أيضًا استخدام مفتاحي Enter و Escape في مربع الحوار.

لم تعد رسائل الخطأ المذكورة بواسطة @ Mr-Anonymous و EduardJS تظهر أيضًا.

تضمين التغريدة شكرا جزيلا لك لمشاركة ذالك. لقد جربت الكود الخاص بك وهو يعمل بشكل مثالي. شكرا جزيلا لك!!

في صحتك،
نيل.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

Lusitaniae picture Lusitaniae  ·  4تعليقات

mouro001 picture mouro001  ·  3تعليقات

yrshaikh picture yrshaikh  ·  4تعليقات

rapeflower picture rapeflower  ·  4تعليقات

girishbr picture girishbr  ·  5تعليقات