django-bootstrap-datepicker-plus icon indicating copy to clipboard operation
django-bootstrap-datepicker-plus copied to clipboard

Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event deprecated

Open jalil2024 opened this issue 10 months ago • 5 comments

Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from browsers. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead.

jalil2024 avatar Apr 05 '24 10:04 jalil2024

Possibly related to this: In Firefox found warning "Use of Mutation Events is deprecated. Use MutationObserver instead". It points to datepicker-widget.js:46

    document.addEventListener('DOMNodeInserted', function (event) {

ptrba avatar Apr 17 '24 09:04 ptrba

This event (DOMNodeInserted) which of the Mutation Events is used to detect changes in the DOM tree but most browsers are of the motion that it slows down performance hence the use of it is discourage. Chrome for instance has stated that it would be disabling these event feature in June. It was suggested that MutationObserver be used instead

martins232 avatar May 04 '24 03:05 martins232

Seems like this is a duplicate of #115 and was already fixed. For Google Chrome the removal of those mutation events is announced for July 2024, so the end is near ;-). Will we have a new release before? Thanks

christianwgd avatar May 31 '24 12:05 christianwgd

Resurfacing this because it has just hit me on my projects and the datepicker works on none of them now that the DOMNodeInserted event is deprecated; I'm currently looking for a workaround to hold things temporarily. The fix is already in place, we just need a new version of this package to be published.

nicholas-ewing avatar Jul 31 '24 02:07 nicholas-ewing

Update for anyone needing a temporary fix:

I was able to add the following to my BOOTSTRAP_DATEPICKER_PLUS setting in settings.py:

BOOTSTRAP_DATEPICKER_PLUS = {
    ...,
    "app_static_url": f"http{'s' if not DEBUG else ''}://{DOMAIN}{':8000' if DEBUG else ''}/static/bootstrap_datepicker_plus/",
}

You can slim this down, but I wanted to account for debug and production modes. Theoretical slimmed version: "app_static_url": "http://localhost:8000/static/bootstrap_datepicker_plus/"
I also have an environment variable DOMAIN that gets loaded into my settings.py file, but you could hardcode a localhost and production domain if you need to.

I also had to copy the datepicker-widget.css and datepicker-widget.js files to my static files in the following directory structure so that they could override the out-of-date ones in the django_bootstrap_datepicker_plus package directory:

static
└ ── bootstrap_datepicker_plus
    ├── css
    │   └ datepicker-widget.css
    └── js
        └ datepicker-widget.js


Now the widget loads the local (and up-to-date) datepicker-widget.js file which includes the fix for DOMNodeInserted being deprecated.

nicholas-ewing avatar Jul 31 '24 02:07 nicholas-ewing