淘宝天猫商品选项计算单价

点击sku后自动计算单价,并填充到sku中

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name        淘宝天猫商品选项计算单价
// @namespace   leizingyiu.net
// @version     2022.09.27.1
// @description 点击sku后自动计算单价,并填充到sku中
// @icon        https://img.alicdn.com/favicon.ico
// @author      Leizingyiu
// @include     *://item.taobao.com/*
// @include     *://detail.tmall.com/*
// @run-at      document-idle
// @grant       none
// @license     GNU AGPLv3
// ==/UserScript==



/* setting */
var specialPriceSelector = ['#J_PromoPriceNum.tb-rmb-num'
    , '#J_PromoPrice.tm-promo-cur > dd > div.tm-promo-price > span.tm-price'].join(','),
    // 淘宝优惠价: #J_PromoPriceNum.tb-rmb-num
    // tm 优惠价: #J_PromoPrice.tm-promo-cur > dd > div.tm-promo-price > span.tm-price

    originalPriceSelector = [' #J_StrPrice > em.tb-rmb-num ',
        ' #J_StrPriceModBox > dd > span.tm-price'].join(' , '),

    // 淘宝原价:  #J_StrPrice > em.tb-rmb-num
    // tm 原价: #J_StrPriceModBox > dd > span.tm-price

    skuSelector = '.tb-prop dd ul li a',

    words = "包 条 个 袋 杯 枚 颗 罐 公斤 斤 两 盒 桶"
        .split(/\s{1,}/)
        .filter((a) => Boolean(a)),
    wordsReg = new RegExp(
        "\\d[\\d\\.]*s*(" +
        (words.map((word) => `(${word})`).join("|") + ")\\s*(\\*\\d{1,})*"), 'g'
    ),
    textReplaceReg = /(\([^\)]*\))|(\[[^\]]*\])|(「[^」]*」)|(([^)]*))/g,
    priceReg = /\d[\d.]*\s*(?=元)/,
    gramReg =
        /\d[\d.]*\s*(([千克]{1,})|(((kg)|(KG)|(Kg)|(g)|(G)){1,}))\s*(\*\d{1,})*/,
    volReg = /\d[\d.]*\s*(([毫升]{1,})|((L)|(ml)|(ML){1,}))\s*(\*\d{1,})*/;



loadingWaitTime = 1000;
activateGapTime = 500;

/* style */
let style = document.createElement('style');
style.innerText = `
.tb-prop li a:after , #detail .tb-key .tb-prop li:after {
    content: attr(price);
    display:content;
    white-space: break-spaces;
    line-height: 1.5em;
    word-break: break-word;


    }
.tb-prop li a , #detail .tb-key .tb-prop li {white-space:break-all;}
`;
document.body.appendChild(style);

/* main function */
function fn() {
    let that = this;
    setTimeout(
        function () {

            let priceBox = document.querySelector(specialPriceSelector) ? document.querySelector(specialPriceSelector) : document.querySelector(originalPriceSelector);
            if (!priceBox) { console.error('很抱歉,找不到价格。请反馈本页面链接,谢谢。') }
            let price = priceBox.innerText;


            let unitprice = unitPrice(that.innerText, price);
            that.setAttribute('price', '¥' + price + ' | ' + unitprice);
            // that.removeEventListener('click', fn);
        }, loadingWaitTime
    );
}

/* addEventListener */
[...document.querySelectorAll(skuSelector)].map(li => {
    console.log(li);
    li.addEventListener('click', fn);
});

// /* activate */
// [...document.querySelectorAll(skuSelector)].map((li, idx) => {
//     setTimeout(
//         () => {
//             li.click()
//         },
//         idx * loadingWaitTime + activateGapTime
//     );
// });





function unitPrice(text, price) {
    text = text.replace(textReplaceReg, "") || '',
        price = price || 0;
    if (text == '') { return false; }

    var gram = text.match(gramReg),
        vol = text.match(volReg);



    var otherUnit = text.match(wordsReg);
    var unit = "",
        num = 0,
        priceText = "",
        priceKg,
        priceL,
        priceU;
    if (price == null || (gram == null && vol == null && otherUnit == null)) {
        priceText = "--";
    } else {
        price = Number(price);


        if (gram != null) {
            gram = Number(
                eval(gram[0].replace(/[克gG]/g, "").replace(/[kK千]/, "*1000"))
            );
            priceKg = (price / gram) * 1000;
            priceText += priceKg.toFixed(2) + "/kg";
        }
        if (vol != null) {
            vol = Number(
                eval(vol[0].replace(/[升lL]/g, "").replace(/[毫mM]/, "/1000"))
            );
            priceL = price / vol;
            priceText = (gram != null ? " | " : "") + priceL.toFixed(2) + "/L";
        }

        console.log(price, text, gram, vol, priceText, otherUnit, wordsReg);

        if (otherUnit != null) {

            otherUnit.map(un => {
                num = Number(un.match(/\d*/));
                unit = un.replace(/\d*/, "");
                priceU = price / num;
                priceText += (priceText == '' ? '' : " | ") + priceU.toFixed(2) + "/" + unit;
                if (unit == "斤") {
                    priceKg = (priceU * 2).toFixed(2)
                    priceText += " | " + priceKg + "/kg";
                }
                if (unit == "两") {
                    priceKg = (priceU * 20).toFixed(2);
                    priceText += " | " + priceKg + "/kg";
                }
            });
        }


        if (priceText == "") {
            priceText += "___";
        }
    }
    return priceText;
}