examples - jquery link



انقر فوق الزناد على إدخال=ملف على ajax غير متزامن القيام به() (2)

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

  1. إرسال البيانات ،
  2. تحقق نتيجتها ،
  3. قم بتشغيل نقرة () لفتح مربع حوار ملف.

آخر شيء مع click () لا يعمل لأنه يبدو أن كتل المكالمات غير المتزامنة تفتح نافذة تحميل . لا يعمل إلا إذا قمت بتعيين async: false .

لا يمكنني العثور على أي شيء في الوثائق وهذا الموقع وأريد أن أعرف ما هي المشكلة هناك وكيفية جعلها تعمل على الحفاظ على المكالمة غير متزامنة؟

مثال:

$.ajax({
    type: "POST",
    url: "/Save",
    data: jsonText,
    dataType: "json",
    //async: false            [1]
}).done(function (msg) {    
    $("#upload").click();   
});

//$("#upload").click();       [2]

العرض التوضيحي: http://jsfiddle.net/c2v00uxn/

ملحوظة:

  • إذا قمت بإلغاء التثبيت [1] أو [2] ، فستعمل (يظهر مربع حوار الملف كما هو متوقع).
  • استبدال click () بـ trigger ("click") لا يعمل
  • استبدل click () بـ live () / on () لا يساعد
  • التحكم في تحميل الملفات مرئي حسب المثال (لذلك ليس بسبب التحكم المخفي)
  • إعدادات المهلة لاياكس لا تساعد.

تحديث

لا يتعلق الأمر بكيفية إجراء "نقرة" بشكل عام ، بل يتعلق بكيفية النقر بعد اتصال أجاكس غير متزامن (حتى الآن ، يعمل فقط مع مكالمة غير متزامنة).


تقول JQuery نفسها ، لن يعمل المشغل لعناصر مثل تحميل الملفات ومرساة. (المصدر - https://learn.jquery.com/events/triggering-event-handlers/ )

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

لذلك في هذه الحالة ، قد تحتاج إلى إنشاء أحداث يدويًا باستخدام وظائف javascript التالية.

  • document.createEvent
  • event.initMouseEvent
  • element.dispatchEvent

يمكن العثور على نموذج رمز + تعريف للوظائف المذكورة أعلاه في موقع مطور موزيلا

https://developer.mozilla.org/samples/domref/dispatchEvent.html

ربما هذا سوف تساعدك.


لدي حل يعمل الآن. إنه اختراق ، لذلك قد لا يعمل في المستقبل القريب ، لأنه يتحايل على ميزات الأمان المذكورة من قبل Tkay أعلاه.

أقدم مهلة تنتظر طلب ajax لإرجاع البيانات التي أريد التحقق منها قبل بدء مربع حوار مستعرض الملف.

customFileUploadButton.addEventListener('click', function(e) {

    var returnValueToCheck; //Value we want to check against

    //reference to vanilla JS ajax function that takes callback
    ajax(function(ajaxData) { 
        returnValueToCheck = ajaxData;
    });

    setTimeout(function() {
        if (returnValueToCheck !== undefined) { //dummy check for example
            file.click();
        } else {
           console.log("Criteria not fulfilled");
        }
    }, 1000);//timer should be larger than AJAX timeout
});

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

مثالي هو vanilla JS ، لكن يجب أن يكون من السهل إنشاء إصدار jQuery. انظر JSFiddle لهذا المثال الكامل.

(هذه هي مغامرتي الأولى للمساهمة ، لذا يرجى التعليق على الأخطاء المحتملة وعمليات الرقابة)





jquery