Переход с jQuery 1.12.4 на 3.3.0 проблем - PullRequest
0 голосов
/ 18 июня 2020

Следуя руководству на jQuery github, я устранил 8/10 проблем, если я хочу обновить. Однако у меня есть 2 проблемы, которые я не могу решить самостоятельно или с помощью Google. Пожалуйста, посмотрите:

JQMIGRATE: jQuery .fn.offset () требует действительного элемента DOM

            var viewportOffsets = this.$viewportElement.offset(),
                hasOffsets = viewportOffsets !== null && viewportOffsets !== undefined;

            this.viewportWidth = this.$viewportElement.width();
            this.viewportHeight = this.$viewportElement.height();

            this.viewportOffsetTop = (hasOffsets ? viewportOffsets.top : 0);
            this.viewportOffsetLeft = (hasOffsets ? viewportOffsets.left : 0);
        },

И следующее: JQMIGRATE: jQuery .fn.offset ( ) требуется элемент, связанный с документом

$backgroundElements.each(function() {
                var $this = $(this),
                    backgroundPosition = getBackgroundPosition($this),
                    horizontalOffset,
                    verticalOffset,
                    positionLeft,
                    positionTop,
                    marginLeft,
                    marginTop,
                    offsetLeft,
                    offsetTop,
                    $offsetParent,
                    parentOffsetLeft = 0,
                    parentOffsetTop = 0,
                    tempParentOffsetLeft = 0,
                    tempParentOffsetTop = 0;

                // Ensure this element isn't already part of another scrolling element
                if (!$this.data('stellar-backgroundIsActive')) {
                    $this.data('stellar-backgroundIsActive', this);
                } else if ($this.data('stellar-backgroundIsActive') !== this) {
                    return;
                }

Как решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 19 июня 2020

Источник: https://github.com/jquery/jquery-migrate/blob/master/warnings.md#jqmigrate -jqueryfnoffset-requires-a-valid-dom-element

JQMIGRATE: jQuery .fn.offset () требует действительного элемента DOM Причина: В более ранних версиях jQuery метод .offset () возвращал значение {top: 0, left: 0} в некоторых случаях недопустимого ввода. jQuery 3.0 выдает ошибки в некоторых из этих случаев. Выбранный элемент в коллекции jQuery должен быть элементом DOM, у которого есть метод getBoundingClientRect. Текстовые узлы, объект окна и простые объекты JavaScript не являются допустимыми входными данными для метода .offset (). jQuery может вызывать ошибку в этих случаях, но в целом не гарантирует определенных c результатов с недопустимыми входными данными.

Решение: не пытайтесь получить или установить информацию о смещении недопустимого ввода.


Насколько я понимаю, $ viewportElement имеет значение null / undefined, когда у него должно быть значение .... поэтому вам нужно отследить, почему это так ... или обработать, если он недействителен.

// As of jQuery 3.0, .offset() only works for elements that are currently
// in the document. In earlier versions, this would return the value below
// but in jQuery 3.0 this throws an error.

//so we are defualting it to a value and use this instead.
var parentOffset = {top: 0, left: 0};

// If the element is in the document we are safe to use .offset()
if(document.body.contains($viewportElement[0])) {
    parentOffset = $viewportElement.offset();
}

//###########

var viewportOffsets = parentOffset;

//this will now neever be null or undefined as we set it above.
//this is not where it was failing... it was failing before this 
hasOffsets = viewportOffsets !== null && viewportOffsets !== undefined;


//but the above code would try an ensure that .offset();
// when .offset(); is called on something that does not exist it defaults to what > 3.0 would of done....

0 голосов
/ 19 июня 2020

Этот jQuery плагин, Stellar.js, больше не поддерживается. Существует запрос на вытягивание от 1 апреля 2018 года, который устраняет эту проблему и делает его совместимым с jQuery 3.2.1, но он так и не был объединен.

Вы можете просмотреть изменения здесь jquery.stellar.js и измените его вручную:

Измените это:

var viewportOffsets = this.$viewportElement.offset(),

На это:

var viewportOffsets = this.$viewportElement[0] !== window ? this.$viewportElement.offset() : {top: 0, left: 0},

Или еще лучше, форкните репо , примените PR и полностью обновите jquery.stellar.js для использования на вашем сайте / в приложении.

Вы также можете использовать вилку участников, которая поддерживает фиксацию jQuery 3.2.1 отсюда: https://github.com/sancas/stellar.js

...