Wix如何绑定搜索按钮onClick事件触发复选框餐厅筛选
问题背景
我是编程新手,若表述不清或现有代码造成理解困扰还请谅解。
我基于Wix搭建了支持用户通过复选框搜索餐厅的网站,当前代码逻辑下,用户一旦点击任意筛选项(例如勾选城市“New York”)页面就会立即更新筛选结果。
我的需求是新增搜索按钮,由按钮的onClick事件触发筛选逻辑,即用户勾选“New York”等筛选条件时页面无响应,只有点击“搜索”按钮后才执行筛选。
现有代码如下:
$w.onReady(function() { }); //Restaurant filter export function filterPlaces() { let city = []; let type = []; let vibe = []; let sunshine = []; // Get the indexes of all the checkboxes checked in that group let cityOptions = $w("#cityGroupBox").selectedIndices let typeOptions = $w('#typeGroupBox').selectedIndices let vibeOptions = $w('#vibeGroupBox').selectedIndices let sunshineOptions = $w('#sunshineGroupBox').selectedIndices let filter = wixData.filter(); // Next, loop through the checked items and add each field to the array and apply filter if (cityOptions.length > 0) { for (var i = 0; i < cityOptions.length; i++) { city.push($w('#cityGroupBox').options[cityOptions[i]].value); } } if (city.length > 0) { filter = filter.hasSome("stad", city); //The "city" is a reference to the FiledKey in the database } if (typeOptions.length > 0) { for (var i2 = 0; i2 < typeOptions.length; i2++) { type.push($w('#typeGroupBox').options[typeOptions[i2]].value); } } if (type.length > 0) { filter = filter.hasSome("typ", type); } if (vibeOptions.length > 0) { for (var i3 = 0; i3 < vibeOptions.length; i3++) { vibe.push($w('#vibeGroupBox').options[vibeOptions[i3]].value); } } if (vibe.length > 0) { filter = filter.hasSome("bstFr", vibe); } if (sunshineOptions.length > 0) { for (var i4 = 0; i4 < sunshineOptions.length; i4++) { sunshine.push($w('#sunshineGroupBox').options[sunshineOptions[i4]].value); } } if (sunshine.length > 0) { filter = filter.hasSome("soltagg", sunshine); } $w("#dataset1").setFilter(filter) .then(() => { console.log("count after", $w("#dataset1").getTotalCount()); }) .catch((err) => { console.log(err); }); $w('#resetButton').onClick(function() { $w('#cityGroupBox').value = undefined $w('#typeGroupBox').value = undefined $w('#vibeGroupBox').value = undefined $w('#sunshineGroupBox').value = undefined $w('#dataset1').setFilter(wixData.filter()) }); }
请问应当在什么位置、如何实现上述搜索按钮的onClick事件?
实现方案
按以下操作即可实现需求:
- 在Wix编辑器中添加搜索按钮,将按钮元素ID设置为
searchButton(如果自定义其他ID,后续代码对应替换即可);进入四个复选框组的属性事件面板,删除之前绑定的「选项变化时调用filterPlaces」的配置,从根源上避免勾选时自动触发筛选。 - 替换原有页面代码,核心调整是把所有交互事件绑定放到
$w.onReady页面加载生命周期中,仅给搜索按钮绑定点击触发筛选的逻辑,同时把原代码中写在筛选函数内部的重置按钮事件移到外层,避免每次执行筛选都重复绑定事件导致逻辑异常。
修改后的完整代码:
$w.onReady(function() { // 绑定搜索按钮点击事件:点击时才执行筛选 $w('#searchButton').onClick(() => { filterPlaces(); }) // 绑定重置按钮点击事件:清空选项+重置数据集 $w('#resetButton').onClick(() => { $w('#cityGroupBox').value = undefined $w('#typeGroupBox').value = undefined $w('#vibeGroupBox').value = undefined $w('#sunshineGroupBox').value = undefined $w('#dataset1').setFilter(wixData.filter()) }); // 保险配置:拦截复选框选项变化的默认触发逻辑,如删除面板事件后已不自动刷新可删掉这段 $w('#cityGroupBox, #typeGroupBox, #vibeGroupBox, #sunshineGroupBox').onChange(() => {}) }); // 筛选逻辑独立为内部函数,仅在搜索按钮点击时调用 function filterPlaces() { let city = []; let type = []; let vibe = []; let sunshine = []; // 获取所有复选框组的选中项索引 let cityOptions = $w("#cityGroupBox").selectedIndices let typeOptions = $w('#typeGroupBox').selectedIndices let vibeOptions = $w('#vibeGroupBox').selectedIndices let sunshineOptions = $w('#sunshineGroupBox').selectedIndices let filter = wixData.filter(); // 拼接城市筛选条件 if (cityOptions.length > 0) { for (var i = 0; i < cityOptions.length; i++) { city.push($w('#cityGroupBox').options[cityOptions[i]].value); } } if (city.length > 0) { filter = filter.hasSome("stad", city); } // 拼接餐厅类型筛选条件 if (typeOptions.length > 0) { for (var i2 = 0; i2 < typeOptions.length; i2++) { type.push($w('#typeGroupBox').options[typeOptions[i2]].value); } } if (type.length > 0) { filter = filter.hasSome("typ", type); } // 拼接氛围筛选条件 if (vibeOptions.length > 0) { for (var i3 = 0; i3 < vibeOptions.length; i3++) { vibe.push($w('#vibeGroupBox').options[vibeOptions[i3]].value); } } if (vibe.length > 0) { filter = filter.hasSome("bstFr", vibe); } // 拼接日照相关筛选条件 if (sunshineOptions.length > 0) { for (var i4 = 0; i4 < sunshineOptions.length; i4++) { sunshine.push($w('#sunshineGroupBox').options[sunshineOptions[i4]].value); } } if (sunshine.length > 0) { filter = filter.hasSome("soltagg", sunshine); } // 执行数据集筛选 $w("#dataset1").setFilter(filter) .then(() => { console.log("筛选后结果数量:", $w("#dataset1").getTotalCount()); }) .catch((err) => { console.log("筛选出错:", err); }); }
注意事项
- 原代码将重置按钮的onClick绑定写在
filterPlaces函数内是错误写法,会导致每执行一次筛选就多绑定一次重置事件,多次操作后点击一次重置会触发多次逻辑,调整到onReady中只会在页面加载时绑定一次,无该问题。 - 如果你的搜索按钮ID不是
searchButton,把代码中#searchButton部分替换为你实际设置的按钮ID即可。
内容的提问来源于stack exchange,提问作者Andre Winström
相关产品推荐
相关产品推荐

