-
-
Save ChrisMBarr/3230548 to your computer and use it in GitHub Desktop.
var list = $$("#item-page-wrapper .list-items table tbody .lineItemMainInfo .lineItemPart strong"); | |
var total=0; | |
for(i=0; i<list.length;i++){ | |
total += parseFloat(list[i].innerText.replace("$","")); | |
} | |
alert(list.length+" items for a total of: $"+total.toFixed(2)); |
Updated to work on amazon.co.uk, with '£' rather than dollars:
var list = $$("span.a-size-base.a-color-price");
var total=0;
var numHidden = 0;
var temp=0;
for(i=0; i<list.length;i++){
temp = parseFloat(list[i].innerText.replace("£",""));
numHidden += isNaN(temp);
total += isNaN(temp) ? 0 : temp;
}
alert(list.length+" items for a total of: £"+total.toFixed(2));
I think I'll throw my contribution in here. I've written a function that is currency agnostic, supports quantities, and has an option for suffixed currency symbols.
I've tested on amazon.co.uk and amazon.com. Unfortunately for wishlists with > 1 page this is still not sufficient. (Should be possible to XHR the next page and run the same fn though.
/**
* calculate the total cost of Amazon wishlist items.
* @param {Bool} doAlert if true an alert message will be shown with the total.
* (false by default)
* @param {Bool} suffixCurrencySymbol true if the currency symbol
* occurs after the value. e.g. 5.50$ vs $5.50
* @param {Bool} useLowerInRange if true the lower price in a range
* e.g. $5.99 - $8.99 will be used. (higher by default)
* @return {String} the total cost to two decimal places
*/
function amazonWishListTotalCost(doAlert, suffixCurrencySymbol, useLowerInRange) {
var totalPrice = 0
, currencySymbol = ''
, itemPrices = document.querySelectorAll('[id*=itemPrice_]')
, itemMultipliers = document.querySelectorAll('[id*="itemRequested_"]')
, currentPrice, currentMultiplier, i
for (i = 0; i < itemPrices.length; i += 1) {
currentPrice = itemPrices[i].innerText
if (~currentPrice.indexOf('-')) {
currentPrice = currentPrice.split('-') [useLowerInRange? 0 : 1]
}
if (!currencySymbol) {
currencySymbol = suffixCurrencySymbol? currentPrice.charAt(currentPrice.length - 1)
: currentPrice.charAt(0)
}
currentPrice = ''.slice.apply(currentPrice, suffixCurrencySymbol ? [0,-1] : [1])
currentMultiplier = itemMultipliers[i] ? itemMultipliers[i].innerHTML : '1'
totalPrice += parseFloat(currentPrice) * parseInt(currentMultiplier, 10)
}
totalPrice = totalPrice.toFixed(2)
if (doAlert) alert(totalPrice)
return currencySymbol + totalPrice
}
A small improvement over the previous one. This one works with Firefox (uses textContent instead of innerText), has a few customizable variables at the top (could be converted to parameters), and allows currencies of more than one character. It's currently customized for amazon.es.
/**
* calculate the total cost of Amazon wishlist items.
* @param {Bool} doAlert if true an alert message will be shown with the total.
* (false by default)
* @param {Bool} suffixCurrencySymbol true if the currency symbol
* occurs after the value. e.g. 5.50$ vs $5.50
* @param {Bool} useLowerInRange if true the lower price in a range
* e.g. $5.99 - $8.99 will be used. (higher by default)
* @return {String} the total cost to two decimal places
*/
function amazonWishListTotalCost(doAlert, suffixCurrencySymbol, useLowerInRange) {
var currencySymbol = 'EUR '; // edit as needed
var thousandsSeparator = '.'; // edit as needed
var decimalSeparator = ','; // edit as needed
var totalPrice = 0;
var itemPrices = document.querySelectorAll('[id*=itemPrice_]');
var itemMultipliers = document.querySelectorAll('[id*="itemRequested_"]');
for (var i = 0; i < itemPrices.length; i += 1) {
var currentPrice = itemPrices[i].textContent;
if (~currentPrice.indexOf('-')) {
currentPrice = currentPrice.split('-') [useLowerInRange? 0 : 1];
}
// Replace special characters to match parseFloat() format and trim spaces at both ends
currentPrice = currentPrice.replace(thousandsSeparator, '').replace(decimalSeparator, '.').trim();
if (!currencySymbol) {
currencySymbol = suffixCurrencySymbol? currentPrice.charAt(currentPrice.length - 1)
: currentPrice.charAt(0);
}
currentPrice = ''.slice.apply(currentPrice, suffixCurrencySymbol ? [0,-currencySymbol.length] : [currencySymbol.length]);
var currentMultiplier = itemMultipliers[i] ? itemMultipliers[i].innerHTML : '1';
totalPrice += parseFloat(currentPrice) * parseInt(currentMultiplier, 10);
}
totalPrice = totalPrice.toFixed(2);
if (doAlert) alert(totalPrice);
return currencySymbol + totalPrice;
}
Made it a bookmarklet:
javascript: (function(){
var list = document.querySelectorAll('span.a-color-price.a-size-base');
var total=0;
for(i=0; i<list.length;i++){
total += parseFloat(list[i].innerText.replace("$",""));
}
alert(list.length+" items for a total of: $"+total.toFixed(2));
}() );
Fixed it to work when any items are unavailable:
var list = $$("span.a-size-base.a-color-price");
var total=0;
for(i=0; i<list.length;i++){
var n = parseFloat(list[i].innerText.replace("$","").replace(",",""));
if(n === Number(n)) total += parseFloat(n);
}
alert(list.length+" items for a total of: $"+total.toFixed(2));
For amazon.in, the following works for me:
var list = $$('.price-section');
var total=0;
for(i=0; i<list.length;i++){
total += (parseFloat(list[i].innerText.replace(',','')));
}
alert(list.length+" items for a total of: Rs. "+total.toFixed(2));
Here's my $0.05
var list = $$('.a-price'); var total=0; for(i=0; i<list.length;i++){ total += parseFloat(list[i].innerText.split("\n")[0].substring(1).replace(',','')); } "Total: $" + Math.ceil(total);
Paste that into the console with the relevant whishlist visible on Amazon.com and it will give you the total (rounded up to nearest dollar)
CAVEAT
If you don't scroll to the bottom before running it, you'll only get whatever is visible on screen due to dynamic loading amazon now uses.
amazon.es
var list = $$(".a-offscreen");
var total=0;
var numHidden = 0;
var temp=0;
for(i=0; i<list.length;i++){
temp = parseFloat(list[i].innerText.replace(" €","").replace(',','.'));
numHidden += isNaN(temp);
total += isNaN(temp) ? 0 : temp;
}
console.log(list.length - numHidden +" items for a total of: "+total.toFixed(2) + "€ less " + numHidden + " Hidden Items");
amazon br
var list = $$('.a-price'); var total=0;
for (var i = 0; i < list.length; i++) {
total += parseFloat(list[i].innerText.split("R$")[1].replace(',','.')) ;
}
console.log("Total = " + total);
You can use the data-price
attribute on the li
. Tested on amazon com.
$$("li[data-price]").reduce((amount, li) => amount + parseFloat(li.getAttribute('data-price'), 0), 0.0)
This version takes into account elements without a price (such as items not available)
$$("li[data-price]").reduce((amount, li) => amount + Math.max(0, parseFloat(li.dataset['price'])), 0.0)
Latest Version:
$$('.a-price').map(_ => _.firstChild.innerText.replace('$', '')).map(_ => parseFloat(_)).reduce((a, v) => a + v)
Let's not forget to support items costing over 999 ;)