您的朋友重视您的意见,请留下您的评论和想法以帮助他们做出决定。
开始使用
随身行李箱
删除项目
$362
325 加元
如果您想要更多行李空间但又不想行李太大,Check-In Medium 就是完美的中型行李箱
案件。 是我们屡获殊荣的随身行李箱的理想伴侣,可嵌入内部,方便存放。
配备牢不可破的聚碳酸酯外壳、超坚固的伸缩手柄。
了解更多
地铁行李袋
280 加元
Metro Duffel 具有时尚的外形和防水的超细纤维纯素皮革,是完美的选择
日常旅行的多用途伴侣——从日常通勤到周末旅行。 Metro Duffel 特点
我们独特的 QuickSnap™ 模块化套件系统,可轻松添加可互换的 Metro 套件。
了解更多
<脚本>
var 购物车 ID = null;
var 购物车令牌 = null;
var 用户 ID = null;
var 用户名 = null;
var 共享状态 = null;
// 在cookie中设置唯一标识符
函数 setUserID() {
// 检查用户是否有带有唯一标识符的cookie
如果(!文档。曲奇饼包括('用户ID')) {
// 生成随机唯一标识符
const userID =generateUniqueID();
// 设置具有唯一标识符的cookie
文档。cookie = `userID=${userID};过期=2026 年 1 月 1 日星期四 00:00:00 UTC;路径=/`;
}
}
// 生成随机唯一标识符
函数generateUniqueID() {
// 这只是一个简单的例子;您可能想要使用更可靠的方法来生成 ID
返回数学。随机的()。到字符串(36)。子字符串(2, 9);
}
// 从cookie中获取用户的唯一标识符
函数 getUserID() {
常量 cookies = 文档。曲奇饼分裂(';');
for (令 i = 0; i < cookies.长度;我++){
const cookie = cookies[i].修剪();
如果(饼干。开始于('userID=')) {
返回cookie。子串(7); // 提取'userID='之后的ID
}
}
// 如果cookie不存在,则返回null或进行相应处理
返回空值;
}
// 使用示例
设置用户ID(); // 在cookie中设置用户的唯一标识符
用户 ID = getUserID(); // 从cookie中获取用户的唯一标识符
安慰。日志(用户ID);
// 获取当前URL
const url = 新 URL(窗口.地点。链接);
// 获取“token”参数的值
const params = new URLSearchParams(url.搜索);
const 标记 = 参数。获取('令牌');
安慰。日志(令牌); // 输出:abc123 cart Token = token;如果(令牌){ 的(窗口。会话存储。getItem('sharedStatus')) {
共享状态=真;
} 别的 {
共享状态=假;
}
常量请求数据 = {
类型:'获取购物车',
用户ID:用户ID,
额外的: {
共享状态:共享状态,
},
数据: {
令牌,
},
};
fetch('/apps/询问朋友', {
方法:'POST',
标题:{
'内容类型':'应用程序/json',
},
正文:JSON。字符串化(reqData),
})
。然后((响应)=>响应。json())
。然后((数据)=> {
窗户。会话存储。setItem('sharedStatus', true);
安慰。日志(数据);
初始化自定义页面(数据);
// 处理来自服务器的响应
})
。捕获((错误)=> {
安慰。error('发送请求时出错:', error);
});
}
const stringToSlug = (str) => {
返回字符串
。toLowerCase() // 转换为小写
。Replace(/[^a-zA-Z0-9 -]/g, '') // 删除特殊字符
。Replace(/\s+/g, '-') // 用连字符替换空格
。Replace(/-+/g, '-') // 删除连续的连字符
。修剪(); // 修剪前导/尾随空格
};
异步函数 getproductbyApi(vid, pid) {
常量请求数据 = {
类型:'获取产品',
用户ID:用户ID,
额外:{},
数据: {
视频,
进程号,
},
};
fetch('/apps/询问朋友', {
方法:'POST',
标题:{
'内容类型':'应用程序/json',
},
正文:JSON。字符串化(reqData),
})
。然后((响应)=>响应。json())
。然后((数据)=> {
安慰。日志(数据);
// 处理来自服务器的响应
})
。捕获((错误)=> {
安慰。error('发送请求时出错:', error);
});
}
异步函数 getProductByHandle(handle) {
尝试 {
const 响应 = 等待 fetch(`${window.Shopify.routes.root}产品/${handle}.js`);
常量产品 = 等待响应。json();
安慰。log('该产品的标题是',product.标题);
// 对产品数据进行进一步的操作
退回产品;
} 捕获(错误){
安慰。error('获取产品时出错:', error);
throw new Error('获取产品失败');
}
}
// 根据commenterId过滤评论的函数
函数filterCommentsByCommenterId(评论,commenterId){
返回评论。过滤器((评论)=>评论。评论者Id ===评论者Id);
}
异步函数 initCustomPage(data) {
var mainHTML = '';
var 好评论 = ``;
var badComment = ``;
对于(让数据项。大车购物车项目){
var 注释 = ``;
让句柄 = stringToSlug(item.处理);
getproductbyApi(项目。变体 ID,项目。产品ID);
const 产品 = 等待 getProductByHandle(handle);
// 访问产品数据
安慰。日志(产品);
让 prevComment = '';
const FilteredComments = filterCommentsByCommenterId(item.评论、用户ID);
安慰。日志(过滤后的评论); if(过滤评论。长度 > 0) {
上一条评论 = 过滤评论[0]。内容;
}
如果(项目。评论长度 > 0) {
对于(让 com 为 item.评论) {
如果(com.喜欢== 1) {
评论 += `
`;
}
如果(com.不喜欢== 1) {
评论 += `
`;
}
}
}
mainHTML += `
<图片
src="${product.featured_image}"
alt="产品图片"
类=“购物车产品图像”
>
${product.price / 100} ${Shopify.currency.active}
${product.description || ''}
了解更多
`;
}
如果(数据。大车购物车项目长度==0){
文档。查询选择器('.rte')。innerHTML = '未找到购物车';
}
文档。查询选择器('.购物车产品主分区')。内部HTML = mainHTML;
如果(数据。大车所有者 ID == 用户 ID) {
文档。查询选择器('#askbtn')。点击();
var learnmore = 文档。查询选择器全部('.购物车产品-了解更多');
了解更多。forEach(函数(元素){
元素。风格显示='块';
});
var 删除按钮 = 文档。查询选择器全部('.购物车产品删除按钮');
删除按钮。forEach(函数(元素){
//元素。风格显示='弯曲';
元素。onclick = 函数 (e) {
安慰。log('删除点击');
安慰。日志(例如目标。getAttribute('数据-id'));
安慰。日志(例如目标。getAttribute('数据卡'));
var 请求数据 = {
类型:'删除项目',
用户ID:用户ID,
额外:{},
数据: {
购物车 ID:e.目标。getAttribute('数据卡'),
项目 ID:e.目标。getAttribute('数据 ID'),
},
};
fetch('/apps/询问朋友', {
方法:'POST',
标题:{
'内容类型':'应用程序/json',
},
正文:JSON。字符串化(reqData),
})
。然后((响应)=>响应。json())
。然后((数据)=> {
安慰。日志(数据);
窗户。地点。重新加载();
// 初始化自定义页面(数据)
// 处理来自服务器的响应
})
。捕获((错误)=> {
安慰。error('发送请求时出错:', error);
});
};
});
安慰。log('购物车所有者');
// 获取类名为“ask-comment-area”的所有 div
var AskCommentAreas = 文档。查询选择器全部('.提问评论区');
// 循环遍历每个div并隐藏它
问评论区。forEach(函数(元素){
元素。风格显示=“无”;
});
// 获取类为“cart-product-feedback-btn”的元素
var反馈按钮=文档。查询选择器('.购物车-产品-反馈-btn');
// 改变属性值
反馈按钮。setAttribute('数据类型', '结帐');
反馈按钮。innerText = '结帐';
} 别的 {
var learnmore = 文档。查询选择器全部('.购物车产品-了解更多');
了解更多。forEach(函数(元素){
元素。风格显示=“无”;
});
var 删除按钮 = 文档。查询选择器全部('.购物车产品删除按钮');
删除按钮。forEach(函数(元素){
元素。风格显示=“无”;
});
}
// 获取所有 cart-product-like-dislike 元素
var cartProductLikeDislikeElements = 文档。查询选择器全部('.购物车产品喜欢不喜欢');
// 迭代每个 cart-product-like-dislike 元素
购物车产品喜欢不喜欢元素。forEach(函数(元素){
// 获取当前元素内的喜欢和不喜欢按钮
var likeButton = 元素。查询选择器('.类似购物车产品');
var dislikeButton = 元素。查询选择器('.购物车产品不喜欢');
// 为点赞按钮添加点击事件监听
喜欢按钮。addEventListener('点击', function () {
// 将“active”和“liked”类添加到like按钮
喜欢按钮。类列表。添加('活跃','喜欢'); // 从不喜欢按钮中删除“active”类 dislike Button。类列表。删除('活动');不喜欢按钮。类列表。删除('不喜欢'); // 将“空”类添加到不喜欢按钮不喜欢按钮。类列表。添加('空');
喜欢按钮。类列表。删除('空'); }); // 给dislike按钮添加点击事件监听 dislike Button.addEventListener('click', function () { // 将“active”和“disliked”类添加到dislike按钮 dislike Button.类列表。add('活跃', '不喜欢'); // 从“like”按钮中删除“active”类,如Button。类列表。删除('活动'); // 从不喜欢按钮中删除“空”类(如果存在)不喜欢按钮。类列表。删除('空');
喜欢按钮。类列表。添加('空');
});
});
文档。查询选择器('.购物车-产品-反馈-btn')onclick = 函数 (e) {
e.防止默认();
//文档。查询选择器(“#ask2”)。风格显示=“无”
//文档。查询选择器(“#ask3”)。风格显示=“块”
安慰。log('发送反馈');
如果这。getAttribute('数据类型') == '反馈') {
文档。查询选择器('#ask2')。风格显示=“无”;
文档。查询选择器('#ask3')。风格显示='块';
窗户。滚动到(0, 0);
var getFeedBackDiv = 文档。查询选择器全部('.购物车-产品-单'); //购物车产品单
让反馈数据 = [];
for (让 getFeedBackDiv 的反馈) {
让 tmp = {
购物车项目:反馈。查询选择器('.购物车产品反馈')。getAttribute('数据 ID'),
反馈意见反馈。查询选择器('.购物车产品反馈')。价值,
喜欢:反馈。查询选择器('.评论积极的')类列表。包含('喜欢')? 1:0,
不喜欢:反馈。查询选择器('.评论积极的')类列表。包含('不喜欢')? 1:0,
};
反馈数据。推(tmp);
购物车 ID = 反馈。查询选择器('.购物车产品反馈')。getAttribute('数据卡');
}
常量请求数据 = {
类型:'保存反馈',
用户ID:用户ID,
额外:{},
数据: {
评论者ID:用户ID,
购物车 ID: 购物车 ID,
购物车令牌: 购物车令牌,
反馈数据:反馈数据,
},
};
安慰。日志(reqData);
fetch('/apps/询问朋友', {
方法:'POST',
标题:{
'内容类型':'应用程序/json',
},
正文:JSON。字符串化(reqData),
})
。然后((响应)=>响应。json()) 然后((数据)=> {
安慰。日志(数据);
// 初始化自定义页面(数据)
// 处理来自服务器的响应
})
。捕获((错误)=> {
安慰。error('发送请求时出错:', error);
});
} 别的 {
安慰。log('已调用结账');
窗户。地点。href = `${window.Shopify.routes.root}结账`;
}
};
文档。querySelector('#askbtnlast').onclick = 函数 (e) {
安慰。log('最后点击的按钮');
e.防止默认();
如果(文档。querySelector('#askbtnlast').getAttribute('数据完成')) {
窗户。地点。href = 窗口.购物。路线。根;
返回假;
}
//文档。查询选择器('#ask1')。风格显示=“无”;
//文档。查询选择器('#ask2')。风格显示='块';
var AskButton = 文档。querySelector('#askbtnlast');
询问按钮。禁用=真;
询问按钮。内部文本 = '正在处理。';
让 Askname = 文档。querySelector('#thankyouname');
让askemail = 文档。querySelector('#thankyouemail');
var getFeedBackDiv = 文档。查询选择器全部('.购物车-产品-单'); //购物车产品单
让反馈数据 = [];
for (让 getFeedBackDiv 的反馈) {
让 tmp = {
购物车项目:反馈。查询选择器('.购物车产品反馈')。getAttribute('数据 ID'),
评论者姓名:询问姓名。价值,
评论者电子邮件:askemail。价值,
};
反馈数据。推(tmp);
购物车 ID = 反馈。查询选择器('.购物车产品反馈')。getAttribute('数据卡');
}
常量请求数据 = {
类型:'更新反馈',
用户ID:用户ID,
额外:{},
数据: {
评论者ID:用户ID,
购物车 ID: 购物车 ID,
购物车令牌: 购物车令牌,
反馈数据:反馈数据,
},
};
fetch('/apps/询问朋友', {
方法:'POST',
标题:{
'内容类型':'应用程序/json',
},
正文:JSON。字符串化(reqData),
})
。然后((响应)=>响应。json()) 然后((数据)=> {
安慰。日志(数据);
文档。查询选择器('#thankyouname')值='';
文档。查询选择器('#thankyouemail')值='';
// 禁用按钮并更改文本
var AskButton = 文档。querySelector('#askbtnlast');
询问按钮。删除属性('禁用');
询问按钮。innerText = '我们去购物吧';
询问按钮。setAttribute('数据完成', true);
文档。查询选择器全部('.询问朋友部分第一个框')。forEach(函数(元素){
元素。风格显示=“无”;
});
文档。查询选择器('.谢谢您输入容器')。风格显示=“无”;
// 初始化自定义页面(数据)
// 处理来自服务器的响应
})
。捕获((错误)=> {
安慰。error('发送请求时出错:', error);
});
};
var allclose = 文档。查询选择器全部('.询问朋友部分关闭图标');
全部关闭。forEach(函数(元素){
元素。onclick = 函数 (e) {
安慰。log('点击关闭按钮');
e.防止默认();
窗户。地点。href = 窗口.购物。路线。根;
};
});
}
脚本>