Làm cách nào để dừng cuộn đến thông báo lỗi xác thực đầu tiên trên magento2 khi thêm vào giỏ hàng?


Câu trả lời:


17

Sao chép

MAGENTO_ROOT / nhà cung cấp / magento / magento2-cơ sở / lib / web / mage / verify.js

vào ứng dụng / thiết kế / frontend / THEME_ROOT / web / mage /

sau đó xóa (bắt đầu trong dòng 1956)

if (firstActive.length) {
    $('html, body').animate({
       scrollTop: firstActive.offset().top
    });
    firstActive.focus();
}

trở nên

if (firstActive.length) {                   
   firstActive.focus();
}

2
Ghi đè toàn bộ tập tin chỉ để xóa 3 dòng không phải là một ý tưởng tốt. Xem câu trả lời của tôi cho một giải pháp với một mixin JS.
Daniel Kratohvil

8

Đây là một giải pháp với một mixin để tránh ghi đè lên toàn bộ tệp:

1) ứng dụng / thiết kế / frontend / [THEME_VENDOR] / [THEME_NAME] /Magento_Theme/requirejs-config.js

var config = {
    config: {
        mixins: {
            'mage/validation': {
                'Magento_Theme/js/lib/mage/validation-mixin': true
            }
        }
    }
};

2) ứng dụng / thiết kế / frontend / [THEME_VENDOR] / [THEME_NAME] /Magento_Theme/web/js/lib/mage/validation-mixin.js

define([
    'jquery'
], function ($) {
    'use strict';

    return function (widget) {

        $.widget('mage.validation', widget, {
            /**
             * Handle form validation. Focus on first invalid form field.
             *
             * @param {jQuery.Event} event
             * @param {Object} validation
             */
            listenFormValidateHandler: function (event, validation) {
                let firstActive = $(validation.errorList[0].element || []),
                    lastActive = $(validation.findLastActive() ||
                        validation.errorList.length && validation.errorList[0].element || []),
                    parent, windowHeight, successList;

                if (lastActive.is(':hidden')) {
                    parent = lastActive.parent();
                    windowHeight = $(window).height();
                    $('html, body').animate({
                        scrollTop: parent.offset().top - windowHeight / 2
                    });
                }

                // ARIA (removing aria attributes if success)
                successList = validation.successList;

                if (successList.length) {
                    $.each(successList, function () {
                        $(this)
                            .removeAttr('aria-describedby')
                            .removeAttr('aria-invalid');
                    });
                }

                if (firstActive.length) {
                    /* vertically center the first field on the screen. This is best for UX but if you prefer to avoid the scrolling completelly, just remove the next line and the function "scrollToCenterFormFieldOnError" below. */
                    scrollToCenterFormFieldOnError(firstActive);
                    firstActive.focus();
                }
            }
        });

        function scrollToCenterFormFieldOnError(firstActive) {
            let fieldTop = firstActive.offset().top,
                fieldHeight = firstActive.height(),
                windowHeight = $(window).height(),
                offset;

            offset = fieldTop - ((windowHeight / 2) - (fieldHeight / 2));

            $('html, body').stop().animate({
                scrollTop: offset
            });
        }

        return $.mage.validation;
    }
});
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.