Shopify购物车页jQuery日期选择器:按星期切换配送时段显示
嘿,我来帮你搞定这个问题!首先得明确一个核心点:Liquid是服务器端渲染的模板语言,在页面发送到浏览器之前就已经执行完毕了,而JavaScript是在客户端浏览器里运行的——所以你没法直接用JavaScript的输出去触发Liquid生成新的HTML。不过别担心,我们可以换个思路:提前把所有星期对应的配送时段HTML块都写好,然后用JavaScript来控制它们的显示和隐藏就行。
第一步:添加所有星期的配送时段HTML块
先在日期选择器的下方,添加各个星期对应的配送时段容器,初始设置为隐藏(用CSS的display: none),你可以根据实际需求修改每个时段的内容:
<!-- 配送时段容器,初始全部隐藏 --> <div class="delivery-slots"> <div class="delivery-slot delivery-slot--monday" style="display: none;"> <p><strong>周一配送时段:</strong>9:00-12:00,14:00-18:00</p> </div> <div class="delivery-slot delivery-slot--tuesday" style="display: none;"> <p><strong>周二配送时段:</strong>8:30-11:30,13:30-17:30</p> </div> <div class="delivery-slot delivery-slot--wednesday" style="display: none;"> <p><strong>周三配送时段:</strong>9:00-12:00,14:00-18:00</p> </div> <div class="delivery-slot delivery-slot--thursday" style="display: none;"> <p><strong>周四配送时段:</strong>8:30-11:30,13:30-17:30</p> </div> <div class="delivery-slot delivery-slot--friday" style="display: none;"> <p><strong>周五配送时段:</strong>9:00-12:00,15:00-19:00</p> </div> <div class="delivery-slot delivery-slot--saturday" style="display: none;"> <p><strong>周六配送时段:</strong>10:00-14:00</p> </div> <!-- 周日你已经禁用了,所以不用加 --> </div>
第二步:修改jQuery Datepicker代码,添加选中事件和初始化逻辑
接下来,我们需要在日期选择器的代码里添加两个关键逻辑:
- 当用户选中日期时,检测星期几,显示对应的时段块
- 页面加载时,如果购物车已经保存了配送日期,自动显示对应的时段
修改后的完整JS代码如下:
window.onload = function() { if (window.jQuery) { let $ = window.jQuery; $(function() { // 定义一个函数,根据星期几切换配送时段显示 function showDeliverySlot(dayOfWeek) { // 先隐藏所有时段 $('.delivery-slot').hide(); // 根据星期几显示对应的时段 switch(dayOfWeek) { case 1: // 周一(getDay()返回1是周一,默认规则0为周日) $('.delivery-slot--monday').show(); break; case 2: // 周二 $('.delivery-slot--tuesday').show(); break; case 3: // 周三 $('.delivery-slot--wednesday').show(); break; case 4: // 周四 $('.delivery-slot--thursday').show(); break; case 5: // 周五 $('.delivery-slot--friday').show(); break; case 6: // 周六 $('.delivery-slot--saturday').show(); break; } } // 初始化日期选择器 $("#date").datepicker({ minDate: 0, maxDate: '+2M', firstDay: 1, dateFormat: 'DD, MM d yy', dayNamesMin: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"], beforeShowDay: function(date) { var day = date.getDay(); var array = ["01-01-2021","12-02-2021","13-02-2021","02-04-2021","01-05-2021","13-05-2021","26-05-2021","20-07-2021","09-08-2021","04-11-2021","25-12-2021"]; var string = jQuery.datepicker.formatDate('dd-mm-yy', date); return [(day != 0) && array.indexOf(string) == -1]; }, // 选中日期时触发的事件 onSelect: function(dateText) { // 解析选中的日期,获取星期几 var selectedDate = $.datepicker.parseDate('DD, MM d yy', dateText); var dayOfWeek = selectedDate.getDay(); // 显示对应的配送时段 showDeliverySlot(dayOfWeek); } }); // 页面加载时,如果购物车已有配送日期,自动显示对应时段 var savedDate = "{{ cart.attributes.delivery_date }}"; if (savedDate) { try { var parsedDate = $.datepicker.parseDate('DD, MM d yy', savedDate); var dayOfWeek = parsedDate.getDay(); showDeliverySlot(dayOfWeek); } catch(e) { // 如果日期格式不对,就不处理 console.log('无法解析保存的配送日期'); } } $.datepicker.setDefaults({ showOn: "both", buttonImageOnly: true, buttonImage: "calendar.gif", buttonText: "Calendar" }); }); } }
关键知识点解释
- Liquid和JS的关系:Liquid在服务器端生成页面,所以你不能用JS的变量去让Liquid动态生成HTML——所有需要显示的HTML必须提前写好,然后用JS控制显示隐藏。
- getDay()的注意点:虽然你设置了
firstDay: 1(周一作为一周的第一天),但Date.getDay()方法还是遵循默认规则:0是周日,1是周一,以此类推,所以我们的switch判断是对应的。 - 初始化时的处理:当用户返回购物车页,且之前已经选过日期,我们通过
cart.attributes.delivery_date获取保存的日期,解析后自动显示对应的时段,提升用户体验。
完整整合后的代码
把以上部分和你原来的代码整合起来,就是完整的购物车页代码:
{{ '//code.jquery.com/ui/1.9.2/themes/base/jquery-ui.css' | stylesheet_tag }} <script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.9.2/jquery-ui.min.js" defer="defer"></script> <div class="datepicker-calendar"> <p> <label for="date">Pick a delivery date:</label> <input required class="required" id="date" type="text" name="attributes[Delivery Date]" value="{{ cart.attributes.delivery_date }}" data-error="Please tell us your info."> <span style="display:block" class="instructions"> .</span> </p> </div> <!-- 新增的配送时段容器 --> <div class="delivery-slots"> <div class="delivery-slot delivery-slot--monday" style="display: none;"> <p><strong>Monday Delivery Slots:</strong> 9:00-12:00, 14:00-18:00</p> </div> <div class="delivery-slot delivery-slot--tuesday" style="display: none;"> <p><strong>Tuesday Delivery Slots:</strong> 8:30-11:30, 13:30-17:30</p> </div> <div class="delivery-slot delivery-slot--wednesday" style="display: none;"> <p><strong>Wednesday Delivery Slots:</strong> 9:00-12:00, 14:00-18:00</p> </div> <div class="delivery-slot delivery-slot--thursday" style="display: none;"> <p><strong>Thursday Delivery Slots:</strong> 8:30-11:30, 13:30-17:30</p> </div> <div class="delivery-slot delivery-slot--friday" style="display: none;"> <p><strong>Friday Delivery Slots:</strong> 9:00-12:00, 15:00-19:00</p> </div> <div class="delivery-slot delivery-slot--saturday" style="display: none;"> <p><strong>Saturday Delivery Slots:</strong> 10:00-14:00</p> </div> </div> <script> window.onload = function() { if (window.jQuery) { let $ = window.jQuery; $(function() { function showDeliverySlot(dayOfWeek) { $('.delivery-slot').hide(); switch(dayOfWeek) { case 1: $('.delivery-slot--monday').show(); break; case 2: $('.delivery-slot--tuesday').show(); break; case 3: $('.delivery-slot--wednesday').show(); break; case 4: $('.delivery-slot--thursday').show(); break; case 5: $('.delivery-slot--friday').show(); break; case 6: $('.delivery-slot--saturday').show(); break; } } $("#date").datepicker({ minDate: 0, maxDate: '+2M', firstDay: 1, dateFormat: 'DD, MM d yy', dayNamesMin: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"], beforeShowDay: function(date) { var day = date.getDay(); var array = ["01-01-2021","12-02-2021","13-02-2021","02-04-2021","01-05-2021","13-05-2021","26-05-2021","20-07-2021","09-08-2021","04-11-2021","25-12-2021"]; var string = jQuery.datepicker.formatDate('dd-mm-yy', date); return [(day != 0) && array.indexOf(string) == -1]; }, onSelect: function(dateText) { var selectedDate = $.datepicker.parseDate('DD, MM d yy', dateText); var dayOfWeek = selectedDate.getDay(); showDeliverySlot(dayOfWeek); } }); var savedDate = "{{ cart.attributes.delivery_date }}"; if (savedDate) { try { var parsedDate = $.datepicker.parseDate('DD, MM d yy', savedDate); var dayOfWeek = parsedDate.getDay(); showDeliverySlot(dayOfWeek); } catch(e) { console.log('Could not parse saved delivery date'); } } $.datepicker.setDefaults({ showOn: "both", buttonImageOnly: true, buttonImage: "calendar.gif", buttonText: "Calendar" }); }); } } </script>
内容的提问来源于stack exchange,提问作者Ella SG
相关产品推荐
相关产品推荐

