- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们正在寻找一种解决方案,让客户无法将超过三种产品放入购物车。如果您的购物车中有三件商品,整个过程应该通过一条警告消息和一个隐藏的添加到购物车按钮来完成。
问题是,我们使用的是 ajaxify 购物车。 shopify 提供的基本教程不起作用。与应用程序相同。
这是我们商店的链接: printnil.com
如果您的购物车中有三件商品,如何隐藏添加到购物车按钮?
if ((typeof Shopify) === 'undefined') {
Shopify = {};
}
Shopify.money_format = '${{amount}}';
// -------------------------------------------------------------------------------------
// API Helper Functions
// -------------------------------------------------------------------------------------
function floatToString(numeric, decimals) {
var amount = numeric.toFixed(decimals).toString();
if(amount.match(/^\.\d+/)) {return "0"+amount; }
else { return amount; }
};
function attributeToString(attribute) {
if ((typeof attribute) !== 'string') {
attribute += '';
if (attribute === 'undefined') {
attribute = '';
}
}
return jQuery.trim(attribute);
}
function getCookie(c_name) {
var c_value = document.cookie;
var c_start = c_value.indexOf(" " + c_name + "=");
if (c_start == -1) {
c_start = c_value.indexOf(c_name + "=");
}
if (c_start == -1) {
c_value = null;
}
else {
c_start = c_value.indexOf("=", c_start) + 1;
var c_end = c_value.indexOf(";", c_start);
if (c_end == -1) {
c_end = c_value.length;
}
c_value = unescape(c_value.substring(c_start,c_end));
}
return c_value;
}
// -------------------------------------------------------------------------------------
// API Functions
// -------------------------------------------------------------------------------------
Shopify.formatMoney = function(cents, format) {
if (typeof cents == 'string') cents = cents.replace('.','');
var value = '';
var patt = /\{\{\s*(\w+)\s*\}\}/;
var formatString = (format || this.money_format);
function addCommas(moneyString) {
return moneyString.replace(/(\d+)(\d{3}[\.,]?)/,'$1,$2');
}
switch(formatString.match(patt)[1]) {
case 'amount':
value = addCommas(floatToString(cents/100.0, 2));
break;
case 'amount_no_decimals':
value = addCommas(floatToString(cents/100.0, 0));
break;
case 'amount_with_comma_separator':
value = floatToString(cents/100.0, 2).replace(/\./, ',');
break;
case 'amount_no_decimals_with_comma_separator':
value = addCommas(floatToString(cents/100.0, 0)).replace(/\./, ',');
break;
}
return formatString.replace(patt, value);
};
Shopify.onProduct = function(product) {
alert('Received everything we ever wanted to know about ' + product.title);
};
Shopify.onCartUpdate = function(cart) {
alert('There are now ' + cart.item_count + ' items in the cart.');
};
Shopify.updateCartNote = function(note, callback) {
var params = {
type: 'POST',
url: '/cart/update.js',
data: 'note=' + attributeToString(note),
dataType: 'json',
success: function(cart) {
if ((typeof callback) === 'function') {
callback(cart);
}
else {
Shopify.onCartUpdate(cart);
}
},
error: function(XMLHttpRequest, textStatus) {
Shopify.onError(XMLHttpRequest, textStatus);
}
};
jQuery.ajax(params);
};
Shopify.onError = function(XMLHttpRequest, textStatus) {
var data = eval('(' + XMLHttpRequest.responseText + ')');
if (!!data.message) {
alert(data.message + '(' + data.status + '): ' + data.description);
} else {
alert('Error : ' + Shopify.fullMessagesFromErrors(data).join('; ') + '.');
}
};
// -------------------------------------------------------------------------------------
// POST to cart/add.js returns the JSON of the line item associated with the added item.
// -------------------------------------------------------------------------------------
Shopify.addItem = function(variant_id, quantity, callback) {
var quantity = quantity || 1;
var params = {
type: 'POST',
url: '/cart/add.js',
data: 'quantity=' + quantity + '&id=' + variant_id,
dataType: 'json',
success: function(line_item) {
if ((typeof callback) === 'function') {
callback(line_item);
}
else {
Shopify.onItemAdded(line_item);
}
},
error: function(XMLHttpRequest, textStatus) {
Shopify.onError(XMLHttpRequest, textStatus);
}
};
jQuery.ajax(params);
};
// ---------------------------------------------------------
// POST to cart/add.js returns the JSON of the line item.
// - Allow use of form element instead of id
// - Allow custom error callback
// ---------------------------------------------------------
Shopify.addItemFromForm = function(form, callback, errorCallback) {
var params = {
type: 'POST',
url: '/cart/add.js',
data: jQuery(form).serialize(),
dataType: 'json',
success: function(line_item) {
if ((typeof callback) === 'function') {
callback(line_item, form);
}
else {
Shopify.onItemAdded(line_item, form);
}
},
error: function(XMLHttpRequest, textStatus) {
if ((typeof errorCallback) === 'function') {
errorCallback(XMLHttpRequest, textStatus);
}
else {
Shopify.onError(XMLHttpRequest, textStatus);
}
}
};
jQuery.ajax(params);
};
// ---------------------------------------------------------
// GET cart.js returns the cart in JSON.
// ---------------------------------------------------------
Shopify.getCart = function(callback) {
jQuery.getJSON('/cart.js', function (cart, textStatus) {
if ((typeof callback) === 'function') {
callback(cart);
}
else {
Shopify.onCartUpdate(cart);
}
});
};
// ---------------------------------------------------------
// GET products/<product-handle>.js returns the product in JSON.
// ---------------------------------------------------------
Shopify.getProduct = function(handle, callback) {
jQuery.getJSON('/products/' + handle + '.js', function (product, textStatus) {
if ((typeof callback) === 'function') {
callback(product);
}
else {
Shopify.onProduct(product);
}
});
};
// ---------------------------------------------------------
// POST to cart/change.js returns the cart in JSON.
// ---------------------------------------------------------
Shopify.changeItem = function(variant_id, quantity, callback) {
var params = {
type: 'POST',
url: '/cart/change.js',
data: 'quantity='+quantity+'&id='+variant_id,
dataType: 'json',
success: function(cart) {
if ((typeof callback) === 'function') {
callback(cart);
}
else {
Shopify.onCartUpdate(cart);
}
},
error: function(XMLHttpRequest, textStatus) {
Shopify.onError(XMLHttpRequest, textStatus);
}
};
jQuery.ajax(params);
};
/* Modernizr 2.7.0 (Custom Build) | MIT & BSD
* Build: http://modernizr.com/download/#-csstransforms-csstransforms3d-touch-teststyles-testprop-testallprops-prefixes-domprefixes
*/
;window.Modernizr=function(a,b,c){function y(a){i.cssText=a}function z(a,b){return y(l.join(a+";")+(b||""))}function A(a,b){return typeof a===b}function B(a,b){return!!~(""+a).indexOf(b)}function C(a,b){for(var d in a){var e=a[d];if(!B(e,"-")&&i[e]!==c)return b=="pfx"?e:!0}return!1}function D(a,b,d){for(var e in a){var f=b[a[e]];if(f!==c)return d===!1?a[e]:A(f,"function")?f.bind(d||b):f}return!1}function E(a,b,c){var d=a.charAt(0).toUpperCase()+a.slice(1),e=(a+" "+n.join(d+" ")+d).split(" ");return A(b,"string")||A(b,"undefined")?C(e,b):(e=(a+" "+o.join(d+" ")+d).split(" "),D(e,b,c))}var d="2.7.0",e={},f=b.documentElement,g="modernizr",h=b.createElement(g),i=h.style,j,k={}.toString,l=" -webkit- -moz- -o- -ms- ".split(" "),m="Webkit Moz O ms",n=m.split(" "),o=m.toLowerCase().split(" "),p={},q={},r={},s=[],t=s.slice,u,v=function(a,c,d,e){var h,i,j,k,l=b.createElement("div"),m=b.body,n=m||b.createElement("body");if(parseInt(d,10))while(d--)j=b.createElement("div"),j.id=e?e[d]:g+(d+1),l.appendChild(j);return h=["­",'<style id="s',g,'">',a,"</style>"].join(""),l.id=g,(m?l:n).innerHTML+=h,n.appendChild(l),m||(n.style.background="",n.style.overflow="hidden",k=f.style.overflow,f.style.overflow="hidden",f.appendChild(n)),i=c(l,a),m?l.parentNode.removeChild(l):(n.parentNode.removeChild(n),f.style.overflow=k),!!i},w={}.hasOwnProperty,x;!A(w,"undefined")&&!A(w.call,"undefined")?x=function(a,b){return w.call(a,b)}:x=function(a,b){return b in a&&A(a.constructor.prototype[b],"undefined")},Function.prototype.bind||(Function.prototype.bind=function(b){var c=this;if(typeof c!="function")throw new TypeError;var d=t.call(arguments,1),e=function(){if(this instanceof e){var a=function(){};a.prototype=c.prototype;var f=new a,g=c.apply(f,d.concat(t.call(arguments)));return Object(g)===g?g:f}return c.apply(b,d.concat(t.call(arguments)))};return e}),p.touch=function(){var c;return"ontouchstart"in a||a.DocumentTouch&&b instanceof DocumentTouch?c=!0:v(["@media (",l.join("touch-enabled),("),g,")","{#modernizr{top:9px;position:absolute}}"].join(""),function(a){c=a.offsetTop===9}),c},p.csstransforms=function(){return!!E("transform")},p.csstransforms3d=function(){var a=!!E("perspective");return a&&"webkitPerspective"in f.style&&v("@media (transform-3d),(-webkit-transform-3d){#modernizr{left:9px;position:absolute;height:3px;}}",function(b,c){a=b.offsetLeft===9&&b.offsetHeight===3}),a};for(var F in p)x(p,F)&&(u=F.toLowerCase(),e[u]=p[F](),s.push((e[u]?"":"no-")+u));return e.addTest=function(a,b){if(typeof a=="object")for(var d in a)x(a,d)&&e.addTest(d,a[d]);else{a=a.toLowerCase();if(e[a]!==c)return e;b=typeof b=="function"?b():b,typeof enableClasses!="undefined"&&enableClasses&&(f.className+=" "+(b?"":"no-")+a),e[a]=b}return e},y(""),h=j=null,e._version=d,e._prefixes=l,e._domPrefixes=o,e._cssomPrefixes=n,e.testProp=function(a){return C([a])},e.testAllProps=E,e.testStyles=v,e}(this,this.document);
// -------------------------------------------------------------------------------------
// Ajaxify Shopify Add To Cart
// -------------------------------------------------------------------------------------
var ajaxifyShopify = (function(module, $) {
'use strict';
// Public functions
var init;
// Private general variables
var settings, cartInit, $drawerHeight, $cssTransforms, $cssTransforms3d, $isTouch;
// Private plugin variables
var $formContainer, $btnClass, $wrapperClass, $addToCart, $cartCountSelector, $cartCostSelector, $toggleCartButton, $cartContainer, $closeCart, $drawerContainer, $refreshCartCallback;
// Private functions
var updateCountPrice, drawerSetup, showDrawer, hideDrawer, setToggleButtons, formOverride, itemAddedCallback, itemErrorCallback, cartUpdateCallback, refreshCart, adjustCart, adjustCartCallback, scrollTop, isEmpty, log;
/**
* Initialise the plugin and define global options
*/
init = function (options) {
// Default settings
settings = {
debug: true,
method: 'drawer',
formSelector: 'form[action="/cart/add"]',
addToCartSelector: 'input[type="submit"]',
cartCountSelector: null,
cartCostSelector: null,
toggleCartButton: null,
btnClass: null,
wrapperClass: null
};
// Override defaults with arguments
$.extend(settings, options);
// Select DOM elements
$formContainer = $(settings.formSelector);
$btnClass = settings.btnClass;
$wrapperClass = settings.wrapperClass;
$addToCart = $formContainer.find(settings.addToCartSelector);
$cartCountSelector = $(settings.cartCountSelector);
$cartCostSelector = $(settings.cartCostSelector);
$toggleCartButton = $(settings.toggleCartButton);
$refreshCartCallback = settings.refreshCartCallback;
// CSS Checks
$cssTransforms = Modernizr.csstransforms;
$cssTransforms3d = Modernizr.csstransforms3d;
$isTouch = Modernizr.touch;
// Touch check
if ($isTouch) {
$('body').addClass('ajaxify-touch is-touch');
}
drawerSetup();
if ( $addToCart.length ) {
// Take over the add to cart form submit
formOverride();
}
// Run this function in case we're using the quantity selector outside of the cart
adjustCart();
};
updateCountPrice = function (cart) {
if ($cartCountSelector) {
$cartCountSelector.html(cart.item_count);
}
if ($cartCostSelector) {
var price = Shopify.formatMoney(cart.total_price);
$cartCostSelector.html(price);
}
};
setToggleButtons = function () {
// Reselect the element in case it just loaded
$toggleCartButton = $(settings.toggleCartButton);
if ($toggleCartButton) {
// Turn it off by default, in case it's initialized twice
$toggleCartButton.off('hover');
$toggleCartButton.on('hover', function(e) {
e.preventDefault();
if ( $drawerContainer.hasClass('shoppingbagshow') ) {
hideDrawer();
} else {
showDrawer(true);
}
});
}
};
drawerSetup = function () {
/* This function is completely changed from the original.
* Vivetta has its own drawer structure, so we don't need to create one.
*/
// Drawer selectors
$drawerContainer = $('#shoppingBag');
$cartContainer = $('.shoppingbag__listcontain');
setToggleButtons();
};
showDrawer = function (toggle) {
// opening the drawer for the first time
if ( !cartInit && toggle) {
Shopify.getCart(cartUpdateCallback);
}
};
formOverride = function () {
$formContainer.submit(function(e) {
e.preventDefault();
// Remove any previous quantity errors
$('.qty-error').remove();
Shopify.addItemFromForm(e.target, itemAddedCallback, itemErrorCallback);
});
};
itemAddedCallback = function (product) {
Shopify.getCart(cartUpdateCallback);
};
itemErrorCallback = function (XMLHttpRequest, textStatus) {
var data = eval('(' + XMLHttpRequest.responseText + ')');
if (!!data.message) {
if (data.status == 422) {
$formContainer.append('<p class="qty-error">'+ data.description +'</p>')
}
}
};
cartUpdateCallback = function (cart) {
// Update quantity and price
updateCountPrice(cart);
refreshCart(cart);
showDrawer();
};
refreshCart = function (cart) {
$drawerContainer.load('/cart #shoppingBagInner', function() {
log('cart loaded from /cart');
// This line triggers the callback, which will
// run JS manipulating the cart.
$refreshCartCallback(cart);
// Tell our plugin that the cart has loaded
cartInit = true;
// With new elements we need to relink the adjust cart functions
adjustCart();
});
};
adjustCart = function () {
// This function only runs if the entire cart is reprinted.
// To be safe, turn off the previous clicks that were assigned.
var qtyAdjust = $('.qty__sub, .qty__add'),
qtyNew = 0;
// Add or remove from the quantity
qtyAdjust.off('click');
qtyAdjust.on('click', function() {
var el = $(this),
id = el.data('id'),
qtySelector = el.siblings('.qty__num'),
qtyCurrent = parseInt( qtySelector.val() );
// Add or subtract from the current quantity
if (el.hasClass('qty__add')) {
qtyNew = qtyCurrent + 1;
} else {
qtyNew = qtyCurrent - 7;
if (qtyNew < 0) qtyNew = 0;
}
// If it has a data-id, update the cart.
// Otherwise, just update the input's number
if (id) {
updateQuantity(id, qtyNew);
} else {
qtySelector.val(qtyNew);
}
});
// Update quantity based on input on change
var qtyInput = $('.qty__num');
qtyInput.off('change');
qtyInput.on('change', function() {
var el = $(this),
id = el.data('id'),
qty = el.val();
if (id) {
updateQuantity(id, qty);
}
});
// Highlight the text when focused
qtyInput.off('focus');
qtyInput.on('focus', function() {
var el = $(this);
setTimeout(function() {
el.select();
}, 50);
});
function updateQuantity(id, qty) {
var row = $('.shoppinglist__product[data-id="' + id + '"]').addClass('is-loading');
if ( qty == 0 ) {
row.addClass('is-removed').slideUp();
}
// Slight delay to make sure removed animation is done
setTimeout(function() {
Shopify.changeItem(id, qty, adjustCartCallback);
}, 250);
}
// Save note anytime it's changed
var noteArea = $('textarea[name="note"]');
noteArea.off('change');
noteArea.on('change', function() {
var newNote = $(this).val();
// Simply updating the cart note in case they don't click update/checkout
Shopify.updateCartNote(newNote, function(cart) {});
});
// Reset toggle buttons
setToggleButtons();
};
adjustCartCallback = function (cart) {
// Update quantity and price
updateCountPrice(cart);
// Reprint cart
Shopify.getCart(refreshCart);
};
isEmpty = function(el) {
return !$.trim(el.html());
};
log = function (arg) {
if (settings && settings.debug && window.console) {
try {
console.log(arg);
}
catch (e) {}
}
};
module = {
init: init
};
return module;
}(ajaxifyShopify || {}, jQuery));
最佳答案
$.ajax({
type: 'GET',
url: 'http://your-store.myshopify.com/cart.json',
dataType: 'jsonp',
success: function(data) {
var item_count = data['item_count'];
//If there are items in cart
if(item_count > 3) {
$('#add-to-cart').hide();
}
}
});
还有
如果您看到这个 (http://docs.shopify.com/support/your-website/themes/can-i-use-ajax-api) Ajax API,您可以调用 GET/cart.js,您将得到 item_count
作为响应,然后您可以输入 if
block 检查它是否大于 3,然后隐藏按钮。
关于javascript - 如果购物车商品数量为三 - 隐藏添加到购物车 |购物,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27312118/
我们正在寻找一种解决方案,让客户无法将超过三种产品放入购物车。如果您的购物车中有三件商品,整个过程应该通过一条警告消息和一个隐藏的添加到购物车按钮来完成。 问题是,我们使用的是 ajaxify 购物车
我正在为 android 创建一个购物 list 应用程序,我正在使用 MySQL 服务器。 我创建了一个名为“shop_list”的 SQL 表,它的列是“list_id”、“list_name”、
关闭。这个问题需要debugging details .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 5年前关闭。 Improve this question 这是
[1]你好, 我正在尝试创建一个购物 list 应用程序,但我一直在对其进行故障排除,但它仍然无法正常工作。我不知道错误代码是什么??? 这是我在 jsfiddle 中的 html、css 和 jqu
我在一家零售店使用 Shopify,将鼠标悬停在搜索图标上时,搜索栏非常敏感。正如您在 gif 中看到的,当将鼠标从搜索图标向下移动到搜索栏时,搜索栏会很快消失。 搜索栏 gif - http://r
我尝试搜索 MS azure 市场以查找 bing 购物 api 访问,但似乎没有找到,是否有或没有 bing 购物 api 访问? 谢谢,米卡 最佳答案 Bing Shoping API 是通过 s
有一个很好的 helper - shipping_price - 在 liquid 模板中可用(用于订购)。返回总订单运费(希望如此)。我如何通过 API 获得相同的信息? 我是否应该查看订单 ord
我想创建诸如待办事项或购物 list 之类的东西。 我想将数据保存在 sqlite3 数据库中 - 在 Xcode 版本 4.6.2 中这是正确的想法吗? 如果我在列表中创建新条目 - 是否可以选择选
我的最终目标是搜索一个项目(使用代码中的查询)并使用 Google Shopping API - Objective-C 客户端显示来自 JSON 对象的一些信息。 我知道 search API fo
我有一个带有总计按钮的项目列表,但由于某种原因,总计按钮不起作用。我的教授说我们可以在一个 Controller 中放置两个函数。 HTML: Grocery List
我对 Google API 很陌生,我有点迷路了:) 首先我使用了 Google APIs Explorer一切正常,满足我的所有要求。 然后我开始编写一个小的 Python 脚本来通过服务帐户授权和
返回一组购物 list 对象,或者是购物者的,或者是具有“建议的”标志='Y'的 list 当我手动将 token 添加到 $_GET 时,我返回一个空白数组。 [{},{}]但是如果我 var_du
我的目标是 创建一个从 API 中提取食谱的购物 list 。 将成分从一页转移到另一页。 添加超过 1 个时刷新/加载数据的页面。 我遇到的问题是 仅加载一组配料 清除功能将不允许再添加。 食谱页面
我正在通过 javascript/jquery 创建购物 list 应用程序,但在使用复选框来划掉列表上的项目时遇到问题。不过我已经很接近了。当选中某个框时,列表中的所有项目都会被划掉,并且应用程序顶
我在使用 Shopify API 更新现有元字段时遇到困难。每次我收到错误时,都会告诉我该变体已经存在......所以它一定认为我正在尝试创建一个新的变体(而不是更新)。 我认为这可能是“put”和“
我是 Shopify 新手,我正在尝试在本地设置 Shopify 主题套件。 我已经创建了一个私有(private)应用程序并设置了我的商店,但是在尝试使用主题套件访问商店时出现此错误: 错误:[AP
Magento 1.6 于本周初发布,但通过 mage_googleshopping 扩展 (http://www.magentocommerce.com/magento-connect/Magent
Google Home 助理有一项名为“购物 list ”的默认功能,可让您使用 Google 助理保留购物 list 。使用web UI可以创建命名列表、与他人共享、检查项目等。 我搜索此内容未成功
我是一名优秀的程序员,十分优秀!