Что реализовать
- Включите раскрывающийся список доставки, который показывает время и цены доставки, читайте информацию о доставке на другой странице.
2. Добавьте панель поиска в заголовок, которая отображается в виде увеличительного стекла, а затем расширяется в панель поиска при нажатии. Она также должна всплывать с результатами поиска, когда пользователь начинает печатать.
3. Измените способ отображения цветов и размеров из раскрывающегося списка в палитру выбора цвета.
Внедрение моего первого кода
Я никогда раньше не внедрял JavaScript в Squarespace, поэтому сначала решил попробовать сделать что-то очень простое, работающее, чтобы дать мне хорошую отправную точку.
Я добавил следующий JavaScript в заголовок, это должно добавить html "<h1>Hello World!</h1>"
в элемент с идентификатором "block-ca33eeb90eb2c5aa8c35"
:
<script>
window.onload = function() {
document.getElementById("block-ca33eeb90eb2c5aa8c35").innerHTML = "<h1>Hello World!</h1>";
}
</script>
Это сайт до сохранения кода:
При сохранении кода это имело следующий эффект:
Затем я решил использовать библиотеку jQuery Javascript, так как многие предлагаемые ею функции были бы полезны для того, что я хотел реализовать. Я нашел следующий веб-сайт очень полезным для понимания синтаксиса.
https://www.w3schools.com/jquery/
Я загрузил библиотеку jQuery на свой сайт Squarespace, используя следующую строку кода:
<script src="<https://code.jquery.com/jquery-3.6.0.js>"></script>
Реализация выпадающего списка доставки 1)
Во-первых, я добавил раскрывающийся список и элемент div, используя блок HTML:
<div class="country-container">
<select id="country-select" >
<option value="">Select your country</option>
</select>
<div id="country-display">Delivery Times and Cost</div>
</div>
Я создал новую несвязанную страницу и назвал ее доставкой, на этой странице я создал текстовый блок и вставил данные о доставке для каждой страны в следующем формате.
COUNTRY_NAME, DELIVERY_TIME, DELIVERY_COST
Обратите внимание, что запятые в приведенном выше очень важны и используются для разделения каждого ввода.
Наличие данных для информации о доставке на этой странице позволит любому, у кого есть доступ к веб-сайту в Squarespace, обновить эту информацию.
Немного поиграв с jQuery, мне удалось заставить работать следующий код:
<script>
$(document).ready(function () {
//read all options in from shipping page
$.get("/shipping", function (data) {
data = $(data).find("p");
//print them into a hidden div so they can be read in through an each loop
$("div#test").html(data);
//for each item add an option element with number of days and cost data attributes
$("div#test p").each(function () {
const countryArray = $(this).text().split(","); //Split each paragraph using the comma
//Add each country to a select element and add the delivery days and costs as attributes
$("select#country-select").append(
"<option data-country=" +
countryArray[0].trim() +
" data-days=" +
countryArray[1].trim() +
" data-cost=" +
countryArray[2].trim() +
">" +
countryArray[0].trim() +
"</option>"
);
});
//Select the UK as the default option
$("select#country-select option[data-country=UK]")
.attr("selected", "selected")
.change();
});
//When the selected option is changed, change the text displayed in the div
$("#country-select").change(function () {
var optionSelected = $(this).find("option:selected");
var day = optionSelected.data("days") + " days - ";
var cost = "£" + optionSelected.data("cost");
var country = optionSelected.data("country") + " - ";
$("#country-display").text(country + day + cost);
});
});
</script>
Ограничения
- Информация о доставке будет обновляться только тогда, когда кто-то обновляет ее вручную, она никоим образом не связана с фактической ценой доставки, которая предоставляется Squarespace в другой момент.
Реализация панели поиска 2)
Наличие панели поиска в заголовке не является стандартной функцией Squarespace, я нашел следующее руководство, в котором объясняется, как ее туда добавить:
https://www.will-myers.com/articles/adding-a-search-bar-to-your-header-in-squarespace-71
После выполнения вышеуказанных шагов я хотел изменить его так, чтобы показывалось только увеличительное стекло, пока пользователь не щелкнул его, для этого я использовал увеличительное стекло из библиотеки значков шрифта awesome и добавил некоторые jQuery и CSS, чтобы скрыть и показать некоторые элементы, когда пользователь щелкнул.
//Link to the fontawesome icon
<script src="<https://kit.fontawesome.com/95625e95a1.js>" crossorigin="anonymous"></script>
<script>
$(document).ready(function(){
$(function () {
//Change the id to the id of the search block in the footer
let searchBlock = $("#block-48b06b63c27b9bc086e0")
.attr("id", "")
.addClass("header-search-bar");
//Display the magnifiying glass icon
$("<i class='fa-solid fa-magnifying-glass'></i>").insertBefore(
$(".showOnDesktop .header-actions-action--cart")
);
$("<div class='search hide'></div>").insertBefore("header");
$("div.search").append(searchBlock);
$("div.search").append("<i class='fa-solid fa-xmark'></i>");
//When the magnificy glass is clicked
$("i.fa-magnifying-glass").click(function () {
//hide everything in the header and display the search bar full width
$("header").addClass("hide"); //hide the header
$("div.search").removeClass("hide"); //unhide the search bar
});
//Show an X mark icon that will re show the header when clicked
$("i.fa-xmark").click(function () {
$("header").removeClass("hide"); //unhide the header
$("div.search").addClass("hide"); //hide the search bar
});
})
});
</script>;
Ограничения
- Панель поиска в настоящее время ограничена функциональностью, которую добавил Squarespace.
- В настоящее время не отображается в пользовательском меню
Реализация селекторов цвета и размера 3)
Я начал с того, что скрыл предыдущие раскрывающиеся списки:
//Hides both dropdown boxes
$("div.variant-select-wrapper").hide();
Затем добавление тега <ul>
с использованием правильных селекторов здесь немного сложно:
$("div.variant-select-wrapper:has(select[data-variant-option-name='Color'])")
.after("<ul class='color-selector'>");
Затем для каждого параметра в раскрывающемся списке, кроме первого параметра, который используется в качестве заполнителя, мы добавляем тег <li>
с некоторым встроенным CSS для установки цвета.
//for every option in the select tag except the first
$("div.variant-select-wrapper:has(select[data-variant-option-name='Color']) option:not(:first)")
.each(function () {
var color = $(this).val(); //store the color
$(
"<li class='color-selector-item'> <button class='color-selector-button' type='button' title='" +
color +
"' style='background-color: " +
color +
" !important;'>" +
color +
"</button></li>"
).appendTo("ul.color-selector");
});
//after the loop close the <ul> tag
$("li.color-selector-item:last").after("</ul>");
При нажатии любого из селекторов цвета мы хотим отобразить цвет на экране в виде текста и выбрать его в раскрывающемся списке, скрытом на заднем плане:
$("button.color-selector-button").click(function () {
//Chnage the text on the screen
$("div.variant-option-title:contains('Color')").html(
"Color: " + $(this).text()
);
});
К сожалению, я столкнулся с проблемами при настройке скрытых выпадающих меню.
Проблемы с реализацией селектора цвета и размера:
Изменение значения элемента select, как показано ниже, не изменит цвет, который был написан в раскрывающемся меню на экране.
$("select[data-variant-option-name=Color]")
.val($(this).text());
Даже запуск события изменения не сработал:
$("select[data-variant-option-name=Color]")
.val($(this).text())
.change();
Единственный способ, которым я нашел изменить то, что было в раскрывающемся списке, - это изменить атрибут data-text, выделенный в приведенном выше HTML.
<div class="variant-select-wrapper color-wrapper" data-text="White" id="yui_3_17_2_1_1651002078249_616"> <select aria-label="Select Color" data-variant-option-name="Color" id="yui_3_17_2_1_1651002078249_615"> <option value="">Select Color</option> <option value="Black">Black</option><option value="White">White</option><option value="Grey">Grey</option><option value="Teal">Teal</option><option value="Charcoal">Charcoal</option><option value="Purple">Purple</option> </select> </div>
$("div.variant-select-wrapper.color-wrapper") .attr("data-text", $(this).text()) .change();
Хотя это работало с точки зрения отображения цвета в раскрывающемся списке при нажатии на один из новых селекторов цветов, это не позволяло мне добавить этот элемент в корзину с надписью «Пожалуйста, выберите цвет и размер».
Я просмотрел HTML-код и заметил, что, когда я вручную делал выбор в раскрывающихся списках, было изменено несколько заметных атрибутов.
data-unselected-options="["Color","Size"]"
Вышеприведенное изменится, чтобы удалить один или оба элемента при выборе, когда был выбран цвет:
data-unselected-options="["Size"]"
Также будет добавлен новый атрибут, когда будут выбраны и цвет, и размер:
data-selected-variant="{"attributes":{"Size":"M","Color":"White"},"optionValues":[
{"optionName":"Size","value":"M"},{"optionName":"Color","value":"White"}],
"id":"ae248023-a7b2-4ebb-89ef-55764797f7e1","sku":"SQ2275958","price":4000,
"salePrice":0,"priceMoney":{"currency":"GBP","value":"40.00"},
"salePriceMoney":{"currency":"GBP","value":"0.00"},"onSale":false,"unlimited":true,
"qtyInStock":0,"width":0,"height":0,"weight":0,"imageIds":[],"images":[],"len":0}"
Также будет добавлен следующий атрибут, если вариант был на складе
data-variant-in-stock="true"
Если бы я вручную жестко закодировал эти значения и установил data-unselected-options
пустым, data-variant-in-stock
истинным, а data-selected-variant
реальным значением, я смог бы добавить товар в корзину, проблема в том, что я не смог бы чтобы легко получить всю информацию по атрибуту data-selected-variant
, а также узнать, был ли вариант в наличии.
Мне нужно найти способ выбрать раскрывающийся список в фоновом режиме, как если бы пользователь просто щелкал его вручную.
Решение
Наконец, я нашел решение для запуска выбора селекторов Squarespace как цвета, так и размера.
document.querySelector("select[data-variant-option-name='Color']").dispatchEvent(new Event("change"));
В следующем коде просто показано, как выбрать цвет и размер с помощью jQuery, а затем инициировать событие изменения, чтобы при нажатии кнопки «Добавить в корзину» в корзину добавлялся нужный товар:
$(document).ready(function () {
let myColour = "Grey";
let mySize = "M";
$(".variant-option-title").click(function () {
$("select[data-variant-option-name=Color]").val(myColour);
document.querySelector("select[data-variant-option-name='Color']").dispatchEvent(new Event("change"));
$("select[data-variant-option-name=Size]").val(mySize);
document.querySelector("select[data-variant-option-name='Size']").dispatchEvent(new Event("change"));
});
});
Ограничения
- Цвета будут отображаться только в том случае, если они являются цветами html, как в этом списке (поддерживается всеми браузерами), это означает, что вариант продукта также должен называться этим цветом, в будущем это можно обойти, связав цвета. в шестнадцатеричные значения или значения RGB или даже изображения, но это упрощает его на данный момент (предупреждение отображается, когда цвет не существует, обнаружит опечатки и т. д.)
- Изображение не изменяется для отображения другого цветового варианта при его изменении.
Посмотреть сайт здесь
https://crane-cinnamon-w8mr.squarespace.com/
Пароль — 123