Signature_pad: يؤدي تغيير الحجم إلى مسح اللوحة ولكن يظل فارغ () يُرجع القيمة false

تم إنشاؤها على ١٢ مارس ٢٠١٥  ·  11تعليقات  ·  مصدر: szimek/signature_pad

1) ارسم على القماش
2) تغيير الحجم -> قماش يزيل
3) isEmpty () ترجع خطأ ويمكن إرسال اللوحة الفارغة.

يمكن إعادة إنتاجه على http://szimek.github.io/signature_pad/

ربما يجب على SignaturePad مشاهدة التغييرات على القماش؟ بهذه الطريقة لن يتمكن المستخدم من تمرير توقيع فارغ.

bug

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

انتهى بي الأمر بإضافة سطرين إلى resizecanvas () على النحو التالي وقد عملت بسلاسة حتى الآن في IE / FF / Chrome-

function resizeCanvas() {
    // When zoomed out to less than 100%, for some very strange reason,
    // some browsers report devicePixelRatio as less than 1
    // and only part of the canvas is cleared then.

    var data = signaturePad.toDataURL(); //Added

    var ratio = Math.max(window.devicePixelRatio || 1, 1);
    canvas.width = canvas.offsetWidth * ratio;
    canvas.height = canvas.offsetHeight * ratio;
    canvas.getContext("2d").scale(ratio, ratio);

    signaturePad.fromDataURL(data); //Added
}

ال 11 كومينتر

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

الحل ليس صعبًا للغاية ، رغم ذلك. لقد أضفت مكالمة SignaturePad.clear () في نهاية روتين تغيير الحجم وهذا إلى حد كبير يحل المشكلة.

لقد نسيت أن #clear يعين بالفعل isEmpty على true :) على أي حال ، ربما يكون من الجيد الاتصال بـ #clear في صفحة العرض التوضيحي أيضًا مع تعليق سبب وجوده ، لذا سأتركه مفتوحًا حتى يتوفر لي الوقت للقيام بذلك.

الكل في الكل ، بسبب هذا والمشكلة رقم 32 انتهى بي الأمر باستخدام متغير مساعد ، hasSignature النحو التالي.

        signaturePad = new SignaturePad(canvas, {
            onEnd: function() {
                hasSignature = true;
            }
        });

و

clearButtonAction = function () {
    hasSignature = false;
    signaturePad.clear();
}

وبذلك يمكنني بعد ذلك المضي قدمًا في وضع علامة على اللوحة القماشية على أنها واضحة ، أو عند وجود توقيع ، قم بنسخ ولصق التوقيع.

        var resizeCanvas = function () {
            if (hasSignature) {
                signatureCopy = signaturePad.toDataURL();
            }

            var ratio = window.devicePixelRatio || 2;

            // Note fixed width:height ratio. No need for dynamic height.       
            canvas.width = canvas.offsetWidth * ratio;
            canvas.height = Math.floor(canvas.offsetWidth/3) * ratio; 
            canvas.getContext("2d").scale(ratio, ratio);

            // Line width is relative to canvas size to prevent different
            // width after orientation changes.
            signaturePad.minWidth = canvas.offsetWidth / 1000;
            signaturePad.maxWidth = signaturePad.minWidth * 5;

            if (hasSignature) {
                signaturePad.fromDataURL(signatureCopy);
            } else {
                // signaturePad doesn't watch canvas and needs to be told it's clear now
                signaturePad.clear(); 
            }
        }

كما هو مذكور في رقم 32 ، ينتهي الأمر بالنسخة غير واضحة بعض الشيء ولكنها أفضل بكثير من فقدان التوقيع تمامًا.

على أي حال ، شكرًا جزيلاً على قطعة رائعة من البرامج ، Szymon!

من وجهة نظري ، يجب التعامل مع تغيير الحجم داخليًا بطريقة ما ، أعني عندما يتم تغيير حجم الصفحة ، يجب أن ترسم اللوحة القماشية نفسها تلقائيًا.

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

تواجه نفس المشكلة: عند فقدان التوقيع ، يمكن إعادة إنتاجه على http://szimek.github.io/signature_pad/

انتهى بي الأمر بإضافة سطرين إلى resizecanvas () على النحو التالي وقد عملت بسلاسة حتى الآن في IE / FF / Chrome-

function resizeCanvas() {
    // When zoomed out to less than 100%, for some very strange reason,
    // some browsers report devicePixelRatio as less than 1
    // and only part of the canvas is cleared then.

    var data = signaturePad.toDataURL(); //Added

    var ratio = Math.max(window.devicePixelRatio || 1, 1);
    canvas.width = canvas.offsetWidth * ratio;
    canvas.height = canvas.offsetHeight * ratio;
    canvas.getContext("2d").scale(ratio, ratio);

    signaturePad.fromDataURL(data); //Added
}

niteshluharuka هل تواجه هذه المشكلة حيث يصبح التوقيع ضبابيًا عند تغيير الحجم؟

قبل تغيير الحجم

بعد تغيير الحجم

iamjoyce لا ، لقد كانت مشكلة مختلفة في إزالة القماش بالكامل. لم تواجه مشكلة ضبابية :)

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

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

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

50l3r picture 50l3r  ·  3تعليقات

MarcGodard picture MarcGodard  ·  8تعليقات

crazzeto picture crazzeto  ·  8تعليقات

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