سؤال

أحاول استخدام مسج التنبيهات الحوار المكتبة من http://abeautifulsite.net/notebook/87 بدلا من الافتراضي التنبيهات (التي تبدو فظيعة جدا في رأيي).هذا يبدو أن يكون مكتبة كبيرة ، ولكن ليس هناك مثال على كيفية استخدام jConfirm المكتبة.

أريد أن أفعل شيئا مثل هذا:

function confirm() {
        var result = false;
        var response = false;
        jConfirm('are you sure?', 'Confirmation Dialog',
          function(r) {
            result = r;
            response = true;
            return r;
        });
        if (response == true) {
            alert(result);
            return result;
        }
        else {
            //wait for response
            alert('hi');
        }
    }

و دعوتي من بلدي .صافي زر:

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

أي أفكار حول كيفية استخدام رد الاتصال بشكل صحيح للحصول على النتيجة قبل بقية جافا سكريبت ينفذ?

شكرا

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

المحلول

jConfirm('are you sure?', 'Confirmation Dialog',
    function(r) {
        result = r;
        response = true;
        return r;
    }
);
if (response == true) {

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

  1. jConfirm يسمى حصوله على وظيفة واحدة من معالمها ، وهو يتذكر.
  2. jConfirm يعرض واجهة المستخدم على الصفحة والعودة فورا.
  3. إن 'إذا (الرد==true)' خط ينفذ.حقا هذا أن مجرد قراءة 'إذا (استجابة)', منطقية المقارنة هي زائدة عن الحاجة.ولكن في أي حال الاستجابة بالطبع كاذبة.وظيفة الخاص بك يتخلى عن مخارج ، مما يتيح التحكم مرة أخرى إلى المتصفح.
  4. ينقر المستخدم jConfirm UI.
  5. jConfirm الآن فقط يقفز إلى العمل ويدعو الى الوراء وظيفة أعطيته و تذكرت في وقت سابق.
  6. المتداخلة وظيفة مجموعات استجابة صحيح متأخرا جدا ل 'إذا (الرد==true)' شرط أن تفعل أي شيء معها.

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

طرق لجعل رمز غير متزامن العمل في سياق متزامن (والعكس بالعكس) موجودة - ولا سيما المواضيع coroutines (المحدود بالنسبة مولدات).ولكن جافا سكريبت لديه أيا من هذه الميزات ، لذلك يجب كتابة التعليمات البرمجية الخاصة بك لتناسب متزامن أو غير متزامن نموذج المكتبة الخاصة بك باستخدام.

نصائح أخرى

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

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

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

function confirm(fnCallback) 
{
    jConfirm('are you sure?', 'Confirmation Dialog', function(r) 
    {
        // Do something with r 

        fnCallback && fnCallback(r); // call the callback if provided
    });
}

// in the caller

alert('begin');

confirm(function(r)
{
    alert(r);

    alert('end');
})

منذ الاستدعاء هو غير متزامن (على الأقل ، بمعنى أنه ينتظر على المستخدم أن يفعل شيئا) ، قد يكون من الأسهل التعامل مع ما تحتاج إلى داخل الاستدعاء:

function confirm() {
    jConfirm('are you sure?', 'Confirmation Dialog', function(r) {
        if (r) doSomething();
    });
}

@klogan [التعليقات]

افترض أنك حصلت على هذه من هنا?

الصفحة يعطيك الجواب:(انظر تحت الاستخدام)

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


@klogan

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

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

نقطة: أفضل رهان هو تجنب هذا في محاولة لإجبار الحدث يحركها في الإجرائية.

function confirm() {
    var result = false;
    var response = false;

    jConfirm('are you sure?', 'Confirmation Dialog',
      function(r) {
        result = r;
        response = true;
    });

    while(!response) continue; // wait
    return result;
}

من الناحية الفنية ، نعم, لكنني لن أفعل ذلك على الموقع.

نلقي نظرة على السرد جافا سكريبت, التي يوجد مقرها خارج نرجس.

السرد جافا سكريبت هو امتداد صغير إلى لغة جافا سكريبت التي يمكن حجب قدرات حدث غير متزامن رد.وهذا يجعل رمز غير متزامن ممتع للقراءة ومفهوم.

السيلينيوم يستخدم هذه التكنولوجيا.


التحديث

تحقق من جافا سكريبت خيوط:

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

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

أود أن نفترض أن لديك للاستيلاء على رد مثل هذا.أعتقد أنك لا تحتاج إلى رد.

function confirm() {
        var response = jConfirm('are you sure?', 'Confirmation Dialog');
        if (response) {
            alert(result);
        }
        else {
            //wait for response
            alert('hi');
        }
    }

أعتقد أنه قد حان حتى مع حل ممكن لهذه المشكلة.كنت أقرأ هذا المقال:http://treasure4developer.wordpress.com/2008/06/23/calling-postback-event-from-javascript/

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

يتعلق DotnetShadow

كيف الرجال قال ليس هناك طريقة!ولكن...كيف نستخدم القول في بلدي (البرازيل), le gambi:

ونحن يمكن أن تفعل شيئا مثل هذا:

<h:commandLink styleClass="linkValor xExcluir" value="x"  
                     onclick="if(confirmar('Confirmar excluir.','Deseja realmente excluir este registro?', this)) return true; else return false;"
                     action="#{mBeanPesquisarLinhas.excluir}"/>

و جافا سكريبت:

function confirmar(titulo, msg, elemento) { 

    if ($(elemento).attr('sim')) {      
        $(elemento).removeAttr('sim');      
        return true;
    } else if ($(elemento).attr('nao')) {       
        $(elemento).removeAttr('nao');      
        return false;
    } else {
        $("#dialog-confirm").html('<p>' + msg + '</p>').dialog({
            resizable : false,
            height : 200,
            modal : true,
            title : titulo,
            buttons : {
                "Sim" : function() {
                    $(this).dialog("close");
                    $(elemento).attr('sim', 'sim');
                    $(elemento).click();
                },
                "Não" : function() {
                    $(this).dialog("close");
                    $(elemento).attr('nao', 'nao');
                    $(elemento).click();
                }
            }
        });
    }

    return false;
}

انها نفس المشكلة ولكن باستخدام مسج-ui.

إلى اللقاء و أتمنى أن هذا يمكن أن يساعد شخص ما.

التفكير في رد مثل إرسال الرسائل وسوف يؤدي إلى تحسين هيكل في التعليمات البرمجية الخاصة بك.

يعمل هذا الشيء.يحتاج مسج.

function myconfirm(kyssa, elm, e){ // neG
    if(jQuery('#confirmquestion').data('result')){
        var V = jQuery('#confirmquestion').data('result');
        jQuery('#confirmquestion').remove(); 
        return V == 'Y' ? true : false;         
    }else if(!jQuery('#confirmquestion').length){
        jQuery('body').append('<div id="confirmquestion">'+
        '<h4>Kinnitus</h4>'+
        '<div id="kyssa">'+kyssa+'</div>'+
        '<center>'+
        '<button onclick="jQuery(\'#confirmquestion\').data(\'result\', \'Y\');">Jah</button>&nbsp;'+
        '<button onclick="jQuery(\'#confirmquestion\').data(\'result\', \'N\');">Ei</button></div>'+
        '</center>');
        jQuery('#confirmquestion button').click(function(){
            jQuery(elm).trigger(e.type);
        })
    }       
    return false;
}

onChange="if(myconfirm(\'Saada kiri: \'+jQuery(this).find(\'option:selected\').html()+\' ?\', this, event)) { ... }"

CSS

#confirmquestion{
    border:1px solid #999;
    background:white;
    padding-bottom: 30px;
    position:fixed;
    width:300px;
    font-size:12px;
    top:45%;
    left:50%;
    margin-left:-150px;
}

#confirmquestion h4 {
    background:blue;
    color:white;
    margin:0;
    padding: 2px 5px;
    border-bottom:#777; 
    text-align:center;
}

#confirmquestion #kyssa {
    padding: 30px 25px;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top