您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Shows Total Price on Aliexpress
- // ==UserScript==
- // @name Ali Total Price
- // @author AndShy
- // @description Shows Total Price on Aliexpress
- // @version 2.14
- // @license GPL-3.0
- // @namespace https://github.com/AndShy
- // @homepageURL https://github.com/AndShy/Ali-Total-Price
- // @match *://*.aliexpress.com/*
- // @grant none
- // ==/UserScript==
- (function() {
- 'use strict';
- var pathRegExp1 = /\/item\//i
- var pathRegExp2 = /\/product\//i
- var pathRegExp3 = /\/w\//i;
- var pathRegExp4 = /\/af\//i;
- var pathRegExp5 = /\/wholesale/i;
- var pN = window.location.pathname;
- var currency;
- switch(true){
- case pathRegExp1.test(pN):
- case pathRegExp2.test(pN):
- itemPageObserver();
- break;
- case pathRegExp3.test(pN):
- case pathRegExp4.test(pN):
- case pathRegExp5.test(pN):
- searchPageObserver();
- break;
- default:
- return;
- }
- function searchPageObserver() {
- const searchObserverConf = {childList: true, subtree: true};
- var searchObserver = new MutationObserver(LazyLoadOnSearch);
- var timer1 = setInterval(function() {
- currency = document.querySelector('#switcher-info > span.currency');
- if (currency) {
- if (currency.innerText.length == 3) {
- currency = currency.innerText;
- clearInterval(timer1);
- var listItems = document.querySelector('ul.list-items');
- if (listItems) {searchObserver.observe (listItems,searchObserverConf)};
- LazyLoadOnSearch();
- }
- }
- },100)
- }
- function itemPageObserver() {
- const itemObserverConf1 = {attributes: true, attributeFilter: ['value'], childList: false, subtree: false};
- const itemObserverConf2 = {attributes: true, childList: false, subtree: true, characterData: true};
- const itemObserverConf3 = {attributes: true, childList: true, subtree: true, characterData: true};
- var priceEl = document.querySelector('span.uniform-banner-box-price');
- if (!priceEl) priceEl = document.querySelector('div.product-price');
- var quantInpEl = document.querySelector('span.next-input.next-medium.next-input-group-auto-width > input');
- var shippingEl = document.querySelector('div.product-dynamic-shipping > div > div.dynamic-shipping');
- var itemObserver = new MutationObserver(refreshItemValues);
- var timer1 = setInterval(function() {
- currency = document.querySelector('#switcher-info > span.currency');
- if (currency) {
- if (currency.innerText.length == 3) {
- currency = currency.innerText;
- clearInterval(timer1);
- itemInsertHTML();
- if (quantInpEl) itemObserver.observe(quantInpEl, itemObserverConf1);
- if (priceEl) itemObserver.observe(priceEl, itemObserverConf2);
- if (shippingEl) itemObserver.observe(shippingEl, itemObserverConf3);
- refreshItemValues();
- }
- }
- },100)
- }
- function itemInsertHTML() {
- var lotEl = document.querySelector('div.product-price-current.lot');
- var productInfo = document.querySelector('div.product-info');
- if (productInfo){
- var totPrice = document.createElement('div');
- totPrice.innerHTML =
- "<div class='bold' title='1 pcs/lot price = (base price * quantity + shipping cost)/quantity' style='font-size:14px; background-color:#f0f0f0'>" +
- "<span>One piece/lot price: </span><span id='pcs_prc' style='color:blue;'>---</span></div>" +
- "<div class='bold' style='font-size:24px'><span>Total Price: </span><span id='ttl_prc' style='color:red'>---</span></div>";
- productInfo.insertBefore(totPrice, productInfo.querySelector('div.product-action'));
- if (lotEl) {
- var lot_html =
- "<span class='bold' title='price for 1pcs from lot' style='font-size:14px; color:black'> 1pcs: " +
- "<span id='lot_pcs_prc' style='color:green;'>---</span></span>";
- /*var lot_html =
- "<table cellspacing='0' cellpadding='0' style='margin-left: 0;border-collapse: collapse;color:black;font-size: 10px;display: inline;' class='bold'>" +
- "<tbody><tr align='center'><td>lot price</td><td rowspan='3'> = </td><td rowspan='3' id='lot_pcs_prc' style='font-size: 14px;'>test3</td>" +
- "</tr><tr align='center'><td><tt>——————</tt></td></tr><tr align='center'><td>lot pcs</td></tr></tbody></table>";*/
- lotEl.insertAdjacentHTML('beforeend', lot_html);
- }
- }
- }
- function refreshItemValues() {
- var myPcsPrcEl = document.getElementById('pcs_prc');
- var myTtlPrcEl = document.getElementById('ttl_prc');
- var myLotPcsPrcEl = document.getElementById('lot_pcs_prc');
- var lotEl = document.querySelector('span.product-price-piece');
- var shCostEl = document.querySelector("div.product-dynamic-shipping > div > div > div > span > span > strong")
- var quantInpEl = document.querySelector('span.next-input.next-medium.next-input-group-auto-width > input');
- var itemPriceEl = document.querySelector('div.product-price-current > span.product-price-value');
- if (!itemPriceEl) {
- itemPriceEl = document.querySelector('div > span.oyuLA');
- if (!itemPriceEl) {itemPriceEl = document.querySelector('span.uniform-banner-box-price')}
- }
- if (!!itemPriceEl && !!shCostEl && !!quantInpEl) {
- if (!itemPriceEl.innerText.includes(' - ')) {
- var itemPriceValue, shCostValue, tmp;
- itemPriceValue = strToCurrency(itemPriceEl.innerText.split(' /')[0]);
- shCostValue = strToCurrency(shCostEl.innerText);
- tmp = (+itemPriceValue * +quantInpEl.value) + +shCostValue;
- myTtlPrcEl.innerText = calcTotalPrice(tmp, 2);
- myPcsPrcEl.innerText = calcTotalPrice(tmp/+quantInpEl.value, 2);
- if (myLotPcsPrcEl) {
- myLotPcsPrcEl.innerText = calcTotalPrice(+itemPriceValue/+lotEl.innerText.match(/\d+/), 5);
- }
- }
- else {
- myPcsPrcEl.innerText = '---';
- myTtlPrcEl.innerText = '---';
- if (myLotPcsPrcEl) myLotPcsPrcEl.innerText = '---';
- }
- }
- else {
- myPcsPrcEl.innerText = '---';
- myTtlPrcEl.innerText = '---';
- if (myLotPcsPrcEl) myLotPcsPrcEl.innerText = '---';
- }
- }
- function priceFromEl (el) {
- if (el) {
- if (el.innerText) {
- strToCurrency(el.innerText);
- }
- }
- }
- function LazyLoadOnSearch() {
- var prodList = document.querySelectorAll('div.product-info > div.hover-help > div.item-shipping-wrap');
- var prodGallery = document.querySelectorAll('div.right-zone > div.item-shipping-wrap');
- for (var i = 0, max_i = prodList.length; i < max_i; i++) {
- if (prodList[i].dataset.edited != 'True') {
- var packagingEl;
- var ttlPriceList = document.createElement('div');
- ttlPriceList.style = 'padding-bottom: 5px';
- prodList[i].parentNode.insertBefore(ttlPriceList, prodList[i].nextElementSibling);
- ttlPriceList.innerHTML =
- "<span class='item-shipping-wrap' style='font-size:12px; font-weight:bold'>Total Price: </span>" +
- "<span class='item-shipping-wrap' style='font-size:12px; color:red; font-weight:bold'>" + SearchPageTotalPrice(ttlPriceList) + "</span>";
- packagingEl = ttlPriceList.parentNode.querySelector('div.item-price-wrap > div.item-price-row.packaging-sale');
- if (packagingEl) {
- packagingEl.style = 'display: block';
- packagingEl.parentNode.parentNode.parentNode.parentNode.parentNode.classList.remove('packaging_sale');
- }
- prodList[i].dataset.edited = 'True';
- }
- }
- for (var j = 0, max_j = prodGallery.length; j < max_j; j++) {
- if (prodGallery[j].dataset.edited != 'True') {
- var ttlPriceGallery = document.createElement('div');
- ttlPriceGallery.style = 'padding-bottom: 5px';
- prodGallery[j].parentNode.insertBefore(ttlPriceGallery, prodGallery[j].nextElementSibling);
- ttlPriceGallery.innerHTML =
- "<span class='item-shipping-wrap' style='font-size:12px; font-weight:bold'>Total Price: </span>" +
- "<span class='item-shipping-wrap' style='font-size:12px; color:red; font-weight:bold'>" + SearchPageTotalPrice(ttlPriceGallery) + "</span>";
- prodGallery[j].dataset.edited = 'True';
- }
- }
- }
- function SearchPageTotalPrice (myEl) {
- if (myEl.parentNode.querySelector('span.price-current') && myEl.parentNode.querySelector('span.shipping-value')){
- var itemPriceEl = myEl.parentNode.querySelector('div.item-price-wrap > div > span.price-current');
- var shCostEl = myEl.parentNode.querySelector('div.item-shipping-wrap > span.shipping-value');
- var itemPriceValue = [], shCostValue;
- shCostValue = strToCurrency(shCostEl.innerText);
- if (itemPriceEl.innerText.includes(' - ')) {
- itemPriceValue = itemPriceEl.innerText.split(' - ');
- itemPriceValue[0] = strToCurrency(itemPriceValue[0]);
- itemPriceValue[1] = strToCurrency(itemPriceValue[1]);
- return (calcTotalPrice(+itemPriceValue[0] + +shCostValue, 2) + ' - ' + calcTotalPrice(+itemPriceValue[1] + +shCostValue, 2));
- }
- else {
- itemPriceValue[0] = strToCurrency(itemPriceEl.innerText);
- return (calcTotalPrice(+itemPriceValue[0] + +shCostValue, 2));
- }
- }
- }
- function strToCurrency (str) {
- var currencyRegExp = /^\D*?([\d\s\,\.]*?)(?:[\.\,](\d{2}))?\D*$/;
- var tmp = [];
- if (!str.match(/\d/)) return 0;
- //if (str.match(/[a-zA-Z]{4,}/)) return 0;
- tmp = currencyRegExp.exec(str);
- tmp[1] = tmp[1].replace(/\D+/g,'');
- return (tmp[1] + '.' + (tmp[2]?tmp[2]:'00'));
- }
- function calcTotalPrice(value, decDigits) {
- return new Intl.NumberFormat('us-US', {style: 'currency', currency: currency, minimumFractionDigits: decDigits, maximumFractionDigits: decDigits}).format(value);
- }
- })();