Проблема импорта nouislider в проект Django
В моем базовом шаблоне я пытаюсь ссылаться на библиотеку nouislider:
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<!-- existing code in the head -->
<!-- Include noUiSlider CSS -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/noUiSlider/15.7.1/nouislider.css"
integrity="sha512-MKxcSu/LDtbIYHBNAWUQwfB3iVoG9xeMCm32QV5hZ/9lFaQZJVaXfz9aFa0IZExWzCpm7OWvp9zq9gVip/nLMg==" crossorigin="anonymous"
referrerpolicy="no-referrer" />
<!-- existing code in the head -->
</head>
<body>
<!-- existing code in body -->
<!-- Include noUiSlider library -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/noUiSlider/15.7.1/nouislider.min.js"
integrity="sha512-UOJe4paV6hYWBnS0c9GnIRH8PLm2nFK22uhfAvsTIqd3uwnWsVri1OPn5fJYdLtGY3wB11LGHJ4yPU1WFJeBYQ=="
crossorigin="anonymous"
referrerpolicy="no-referrer">
</script>
<script src="{% static 'javascript/slideshow.js' %}" defer></script>
<script src="{% static 'javascript/scrollToTop.js' %}" defer></script>
<script src="{% static 'javascript/productFilter.js' %}" defer></script>
</body>
Этот базовый шаблон расширяется в другом шаблоне.
Теперь проблема в том, что в моем productFilter.js есть все необходимые javascript-коды, включая те, которые нужны для nouislider, однако, в то время как коды в productFilter.js выполняются как положено, сам nouislider не работает на странице. Слайдер даже не отображается. Странно то, что если я, вместо использования productFilter.js, просто помещу все в HTML-файл, как это -
<body>
<!-- existing code in body -->
<!-- Include noUiSlider library -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/noUiSlider/15.7.1/nouislider.min.js"
integrity="sha512-UOJe4paV6hYWBnS0c9GnIRH8PLm2nFK22uhfAvsTIqd3uwnWsVri1OPn5fJYdLtGY3wB11LGHJ4yPU1WFJeBYQ=="
crossorigin="anonymous"
referrerpolicy="no-referrer">
</script>
<script>
// contents of the productFilter.js
</script>
</body>
слайдер отображается и работает.
Я не понимаю, почему он не работает, когда коды javascript находятся в js-файле, но работает, когда те же коды js находятся в html-файле, встроенном в тег script. Все связано правильно, потому что другие коды javascript в productFilter.js работают просто отлично.
Что я упускаю?
Я решил проблему. Проблема была не в том, как я связывал внешний Javascript, поскольку, как я уже сказал, другие Javascript-коды, не связанные с noUIslider, выполнялись правильно.
Проблема заключалась в том, что JavaScript-файл - productFilter.js - не мог напрямую обращаться к шаблонным переменным Django, таким как {{ min_price }} и {{ max_price }}, а я использовал их для min и max значений в noUIslider. Поскольку Javascript-файл не мог получить данные, связанные с этими переменными, noUIslider не мог отображаться или работать.
Я решил проблему, передавая данные через атрибуты данных, а затем обращаясь к атрибутам в моем Javascript. В моем html у меня есть -
<body data-min-price="{{ min_price }}" data-max-price="{{ max_price }}">
в моем productFilter.js у меня есть -
document.addEventListener("DOMContentLoaded", function() {
// Get the minimum and maximum prices from Django template
var minPrice = parseFloat(document.body.getAttribute('data-min-price'));
var maxPrice = parseFloat(document.body.getAttribute('data-max-price'));
// Check if the slider element already has a noUiSlider instance
var priceSlider = document.getElementById('priceSlider');
if (!priceSlider.classList.contains('noUi-target')) {
// Initialize the slider only if it's not already initialized
noUiSlider.create(priceSlider, {
start: [minPrice, maxPrice], // Initial values for the handles
connect: true, // Connect the handles with a colored bar
range: {
'min': minPrice,
'max': maxPrice
}
});
}
И теперь это работает.