// ==UserScript==
// @name 浴火凤凰京东购物助手
// @name:en JD.com Shopping Assistant
// @name:zh-CN 浴火凤凰京东购物助手
// @namespace https://github.com/kingphoenix2000/tampermonkey_scripts
// @supportURL https://github.com/kingphoenix2000/tampermonkey_scripts
// @version 0.1.3
// @author 浴火凤凰(QQ:307053741,油猴脚本讨论QQ群:194885662)
// @description 在京东商城的商品搜索结果页面商品列表顶部生成一个筛选按钮,点击按钮会生成一系列筛选条件,可以按照店铺、商品标签、商品内容包含的关键字、商品价格、商品评价数等等类别进行筛选。作者:浴火凤凰(QQ:307053741,油猴脚本讨论QQ群:194885662)
// @description:en Generate a filter button at the top of the goods list on the goods search results page of JD.com. Clicking the button will generate a series of filter conditions, so goods can be filtered according to the categories of shop name, goods label, keywords, goods price, goods comments, etc.作者:浴火凤凰(QQ:307053741,油猴脚本讨论QQ群:194885662)
// @description:zh-CN 在京东商城的商品搜索结果页面商品列表顶部生成一个筛选按钮,点击按钮会生成一系列筛选条件,可以按照店铺、商品标签、商品内容包含的关键字、商品价格、商品评价数等等类别进行筛选。作者:浴火凤凰(QQ:307053741,油猴脚本讨论QQ群:194885662)
// @homepage https://blog.csdn.net/kingwolf_javascript/
// @include https://search.jd.com/*
// @include https://list.jd.com/search*
// @include https://list.jd.com/list.html?*
// @grant none
// ==/UserScript==
(function () {
'use strict';
function setJDHelper() {
function addDiv(div) {
document.querySelector("#ecommerce_filter").appendChild(div);
}
let arr = document.querySelectorAll("#J_goodsList > ul > li.gl-item");
//结合Ctrl删除项目
for (let i = 0; i < arr.length; i++) {
// arr[i].removeEventListener("click");
arr[i].addEventListener("click", function (e) {
if (e.ctrlKey === true) {
e.preventDefault();
this.remove();
return false;
}
return true;
}, true);
}
function getShopList() {
let shopListWrapper = {};
let shopListObj = {};
let shopNameTimes = {};//统计每个店铺出现的次数
let shopNodes = document.querySelectorAll("#J_goodsList > ul > li> div.gl-i-wrap div.p-shop > span.J_im_icon > a");
for (let i = 0; i < shopNodes.length; i++) {
const shopNode = shopNodes[i];
shopListObj[shopNode.innerText] = shopNode.href;
if (!shopNameTimes[shopNode.innerText]) {
shopNameTimes[shopNode.innerText] = 1;
}
else {
shopNameTimes[shopNode.innerText]++;
}
}
shopListWrapper.shopNameTimes = shopNameTimes;
shopListWrapper.shopListObj = shopListObj;
// console.log(shopListWrapper);
return shopListWrapper;
}
function getTagList() {
let tagListWrapper = {};
let tagListObj = {};
let tagNameTimes = {};//统计每个店铺出现的次数
let tagNodes = document.querySelectorAll("#J_goodsList > ul > li> div.gl-i-wrap div.p-icons > i");
for (let i = 0; i < tagNodes.length; i++) {
const tagNode = tagNodes[i];
tagListObj[tagNode.innerText] = tagNode.dataset.tips;
if (!tagNameTimes[tagNode.innerText]) {
tagNameTimes[tagNode.innerText] = 1;
}
else {
tagNameTimes[tagNode.innerText]++;
}
}
tagListWrapper.tagNameTimes = tagNameTimes;
tagListWrapper.tagListObj = tagListObj;
console.log(tagListWrapper);
return tagListWrapper;
}
let operationTypeDiv = document.createElement("div");
let operationType = "shopName";
function setTypeSelection(object) {
let select = document.createElement("select");
select.innerHTML = '';
select.style.cssText = "width: 250px;height: 23px;";
for (const key in object) {
if (object.hasOwnProperty(key)) {
const value = object[key];
select.innerHTML += `<option value="${key}">${value}</option>`;
}
}
select.onchange = function () {
// console.log(this.value);
operationType = this.value;
lastViewDiv.style.display = "none";
lastViewDiv = document.getElementById(operationType + "_div");
lastViewDiv.style.display = "block";
}
operationTypeDiv.appendChild(select);
addDiv(operationTypeDiv);
}
function setShowAllBtn() {
let input = document.createElement("input");
input.type = "checkbox";
input.id = "filterType";
operationTypeDiv.appendChild(input);
let label = document.createElement("label");
label.innerText = "在原来过滤结果基础上进行再次过滤";
label.htmlFor = "filterType";
operationTypeDiv.appendChild(label);
let button = document.createElement("input");
button.type = "button";
button.value = "显示全部商品";
button.style.cssText = "margin-left:15px;";
button.onclick = function () {
let items = document.querySelectorAll("#J_goodsList > ul > li.gl-item");
let len = items.length;
for (let i = 0; i < len; i++) {
let li = items[i];
li.style.display = "list-item";
}
}
operationTypeDiv.appendChild(button);
}
function setShowBtn() {
let button = document.createElement("input");
button.type = "button";
button.value = "只显示";
button.style.cssText = "margin-left:15px;";
button.onclick = function () {
switch (operationType) {
case "shopName":
handleShopFilter("list-item", "none");
break;
case "tagName":
handleTagFilter("list-item", "none");
break;
case "price":
handlePriceFilter("list-item", "none");
break;
case "comment":
handleCommentFilter("list-item", "none");
break;
case "allkeyword":
handleAllkeywordFilter("list-item", "none");
break;
case "anykeyword":
handleAnykeywordFilter("list-item", "none");
break;
default:
break;
}
}
operationTypeDiv.appendChild(button);
}
function setHideBtn() {
let button = document.createElement("input");
button.type = "button";
button.value = "只隐藏";
button.style.cssText = "margin-left:15px;";
button.onclick = function () {
switch (operationType) {
case "shopName":
handleShopFilter("none", "list-item");
break;
case "tagName":
handleTagFilter("none", "list-item");
break;
case "price":
handlePriceFilter("none", "list-item");
break;
case "comment":
handleCommentFilter("none", "list-item");
break;
case "allkeyword":
handleAllkeywordFilter("none", "list-item");
break;
case "anykeyword":
handleAnykeywordFilter("none", "list-item");
break;
default:
break;
}
}
operationTypeDiv.appendChild(button);
}
function setShopFilter() {
let shopListWrapper = getShopList();
let shopListObj = shopListWrapper.shopListObj;
let shopNameTimes = shopListWrapper.shopNameTimes;
let div1 = document.createElement("h3");
div1.innerHTML = "筛选规则:多选情况下,只要包含勾选的多个店铺名字其中之一即被视为符合筛选结果。单选不受影响。";
div1.style.cssText = "margin:5px;color:red;";
let div2 = document.createElement("div");
div2.innerHTML = '';
div2.id = 'shopName_div';
let keys = Object.keys(shopListObj);
let len = keys.length;
for (let i = 0; i < len; i++) {
const key = keys[i];
div2.innerHTML += `<input type="checkbox" name="shoplist" value="${key}" id="${'shoplist_' + i}"/><label for="${'shoplist_' + i}">${key + '(' + shopNameTimes[key] + ')'
}</label > `;
}
div2.insertBefore(div1, div2.firstChild);
addDiv(div2);
}
function setTagFilter() {
let tagListWrapper = getTagList();
let tagListObj = tagListWrapper.tagListObj;
let tagNameTimes = tagListWrapper.tagNameTimes;
let div1 = document.createElement("h3");
div1.innerHTML = "筛选规则:多选情况下,单个商品必须同时包含勾选的多个标签名字才被视为符合筛选结果。单选不受影响。";
div1.style.cssText = "margin:5px;color:red;";
let div2 = document.createElement("div");
div2.innerHTML = '';
div2.id = 'tagName_div';
div2.style.cssText = "display:none;"
let keys = Object.keys(tagListObj);
let len = keys.length;
for (let i = 0; i < len; i++) {
const key = keys[i];
div2.innerHTML += `<input type="checkbox" name="taglist" value="${key}" id="${'taglist_' + i}"/><label for="${'taglist_' + i}">${key + '(' + tagNameTimes[key] + ')'
}</label > `;
}
div2.insertBefore(div1, div2.firstChild);
addDiv(div2);
}
function setPriceFilter() {
let div1 = document.createElement("h3");
div1.innerHTML = "筛选规则:例子:3xxx表示3000多,35xx表示3500多,5xx表示500多,56x表示560多。";
div1.style.cssText = "margin:5px;color:red;";
let div2 = document.createElement("div");
div2.innerHTML = '<input type="text" placeholder="请输入价格" value="" style="width:100px;height:23px;" />元';
div2.id = 'price_div';
div2.style.cssText = "display:none;"
div2.insertBefore(div1, div2.firstChild);
addDiv(div2);
}
function setCommentFilter() {
let div1 = document.createElement("h3");
div1.innerHTML = "筛选规则:例子:3xx表示300多,35x表示350多,5xx表示500多,56x表示560多。";
div1.style.cssText = "margin:5px;color:red;";
let div2 = document.createElement("div");
div2.innerHTML = '<input type="text" placeholder="请输入评价数" value="" style="width:100px;height:23px;" />万+条评价';
div2.id = 'comment_div';
div2.style.cssText = "display:none;"
div2.insertBefore(div1, div2.firstChild);
addDiv(div2);
}
function setAllkeywordFilter() {
let div1 = document.createElement("h3");
div1.innerHTML = "筛选规则:最多支持输入5个关键字,以空格隔开。商品必须同时包含输入的所有关键字才算符合筛选结果,单个关键字不受影响。";
div1.style.cssText = "margin:5px;color:red;";
let div2 = document.createElement("div");
div2.innerHTML = '<input type="text" placeholder="请输入多个关键字,以空格隔开" value="" style="width:300px;height:23px;" />';
div2.id = 'allkeyword_div';
div2.style.cssText = "display:none;"
div2.insertBefore(div1, div2.firstChild);
addDiv(div2);
}
function setAnykeywordFilter() {
let div1 = document.createElement("h3");
div1.innerHTML = "筛选规则:最多支持输入5个关键字,以空格隔开。商品包含输入的任何一个关键字就算符合筛选结果,单个关键字不受影响。";
div1.style.cssText = "margin:5px;color:red;";
let div2 = document.createElement("div");
div2.innerHTML = '<input type="text" placeholder="请输入多个关键字,以空格隔开" value="" style="width:300px;height:23px;" />';
div2.id = 'anykeyword_div';
div2.style.cssText = "display:none;"
div2.insertBefore(div1, div2.firstChild);
addDiv(div2);
}
function handleShopFilter(display1, display2) {
let items = document.querySelectorAll("#J_goodsList > ul > li.gl-item");
let len = items.length;
let shoplist = document.getElementsByName("shoplist");
let len2 = shoplist.length;
let shopNames = [];
for (let i = 0; i < len2; i++) {
const shop = shoplist[i];
if (shop.checked) { shopNames.push(shop.value); }
}
// console.log("选择的店铺列表", shopNames);
let checked = document.querySelector("#filterType").checked;
for (let i = 0; i < len; i++) {
let li = items[i];
let shopNode = li.querySelector("div.p-shop > span > a");
//判断店铺名字是否相等
if (shopNode) {
let text = shopNode.innerText;
if (shopNames.includes(text)) {
if (display1 == "list-item") {
if (!checked) { li.style.display = display1; }
}
else {
li.style.display = display1;
}
}
else {
if (display2 == "list-item") {
if (!checked) { li.style.display = display2; }
}
else {
li.style.display = display2;
}
}
}
}
}
function handleTagFilter(display1, display2) {
let items = document.querySelectorAll("#J_goodsList > ul > li.gl-item");
let len = items.length;
let taglist = document.getElementsByName("taglist");
let len2 = taglist.length;
let tagNames = [];
for (let i = 0; i < len2; i++) {
const tag = taglist[i];
if (tag.checked) { tagNames.push(tag.value.replace(/\(\d+\)/, "")); }
}
// console.log("选择的标签列表", tagNames);
let validNodes = [];
let invalidNodes = [];
for (let i = 0; i < len; i++) {
let li = items[i];
let tagNode = li.querySelector("div.p-icons");
//判断店铺名字是否相等
if (tagNode) {
let text = tagNode.innerText;
let b = false;//没找到
for (let i = 0; i < tagNames.length; i++) {
const tag = tagNames[i];
if (!text.includes(tag)) { b = true; break; }
}
if (b == true) { invalidNodes.push(li); }
else { validNodes.push(li); }
}
}
let checked = document.querySelector("#filterType").checked;
for (let i = 0; i < validNodes.length; i++) {
const li = validNodes[i];
if (display1 == "list-item") {
if (!checked) { li.style.display = display1; }
}
else {
li.style.display = display1;
}
}
for (let i = 0; i < invalidNodes.length; i++) {
const li = invalidNodes[i];
if (display2 == "list-item") {
if (!checked) { li.style.display = display2; }
}
else {
li.style.display = display2;
}
}
}
function handlePriceFilter(display1, display2) {
let text = document.querySelector("#price_div > input").value.toLowerCase().trim();
text = text.replace(/x/g, '\\d');
let reg = new RegExp('^' + text + '\\.', 'i');
// console.log(text);
let items = document.querySelectorAll("#J_goodsList > ul > li.gl-item");
let len = items.length;
let validNodes = [];
let invalidNodes = [];
for (let i = 0; i < len; i++) {
let li = items[i];
let priceNode = li.querySelector("div.p-price > strong > i");
//判断店铺名字是否相等
if (priceNode) {
let price = priceNode.innerText;
if (reg.test(price)) { validNodes.push(li); }
else { invalidNodes.push(li); }
}
}
let checked = document.querySelector("#filterType").checked;
for (let i = 0; i < validNodes.length; i++) {
const li = validNodes[i];
if (display1 == "list-item") {
if (!checked) { li.style.display = display1; }
}
else {
li.style.display = display1;
}
}
for (let i = 0; i < invalidNodes.length; i++) {
const li = invalidNodes[i];
if (display2 == "list-item") {
if (!checked) { li.style.display = display2; }
}
else {
li.style.display = display2;
}
}
}
function handleCommentFilter(display1, display2) {
let text = document.querySelector("#comment_div > input").value.toLowerCase().trim();
text = text.replace(/x/g, '\\d');
let reg = new RegExp('^' + text + '(\\.\\d)?万+', 'i');
// console.log(text);
let items = document.querySelectorAll("#J_goodsList > ul > li.gl-item");
let len = items.length;
let validNodes = [];
let invalidNodes = [];
for (let i = 0; i < len; i++) {
let li = items[i];
let priceNode = li.querySelector("div.p-commit > strong > a");
//判断店铺名字是否相等
if (priceNode) {
let price = priceNode.innerText;
if (reg.test(price)) { validNodes.push(li); }
else { invalidNodes.push(li); }
}
}
let checked = document.querySelector("#filterType").checked;
for (let i = 0; i < validNodes.length; i++) {
const li = validNodes[i];
if (display1 == "list-item") {
if (!checked) { li.style.display = display1; }
}
else {
li.style.display = display1;
}
}
for (let i = 0; i < invalidNodes.length; i++) {
const li = invalidNodes[i];
if (display2 == "list-item") {
if (!checked) { li.style.display = display2; }
}
else {
li.style.display = display2;
}
}
}
function handleAllkeywordFilter(display1, display2) {
let text = document.querySelector("#allkeyword_div > input").value.toLowerCase().trim();
let keywords = text.split(/\s+/);
let items = document.querySelectorAll("#J_goodsList > ul > li.gl-item");
let len = items.length;
let validNodes = [];
let invalidNodes = [];
for (let i = 0; i < len; i++) {
let li = items[i];
let priceNode = li.querySelector("div.p-name");
//判断店铺名字是否相等
if (priceNode) {
let text = priceNode.innerText.toLowerCase().trim();
let b = false;//没找到
let len = keywords.length;
if (len > 5) { len = 5; }
for (let i = 0; i < len; i++) {
const keyword = keywords[i];
if (!text.includes(keyword)) { b = true; break; }
}
if (b == true) { invalidNodes.push(li); }
else { validNodes.push(li); }
}
}
let checked = document.querySelector("#filterType").checked;
for (let i = 0; i < validNodes.length; i++) {
const li = validNodes[i];
if (display1 == "list-item") {
if (!checked) { li.style.display = display1; }
}
else {
li.style.display = display1;
}
}
for (let i = 0; i < invalidNodes.length; i++) {
const li = invalidNodes[i];
if (display2 == "list-item") {
if (!checked) { li.style.display = display2; }
}
else {
li.style.display = display2;
}
}
}
function handleAnykeywordFilter(display1, display2) {
let text = document.querySelector("#anykeyword_div > input").value.toLowerCase().trim();
let keywords = text.split(/\s+/);
let items = document.querySelectorAll("#J_goodsList > ul > li.gl-item");
let len = items.length;
let validNodes = [];
let invalidNodes = [];
for (let i = 0; i < len; i++) {
let li = items[i];
let priceNode = li.querySelector("div.p-name");
//判断店铺名字是否相等
if (priceNode) {
let text = priceNode.innerText.toLowerCase().trim();
let b = false;//没找到
let len = keywords.length;
if (len > 5) { len = 5; }
for (let i = 0; i < len; i++) {
const keyword = keywords[i];
if (text.includes(keyword)) { b = true; break; }
}
if (b == true) { validNodes.push(li); }
else { invalidNodes.push(li); }
}
}
let checked = document.querySelector("#filterType").checked;
for (let i = 0; i < validNodes.length; i++) {
const li = validNodes[i];
if (display1 == "list-item") {
if (!checked) { li.style.display = display1; }
}
else {
li.style.display = display1;
}
}
for (let i = 0; i < invalidNodes.length; i++) {
const li = invalidNodes[i];
if (display2 == "list-item") {
if (!checked) { li.style.display = display2; }
}
else {
li.style.display = display2;
}
}
}
let obj = {
shopName: "1.按照店铺进行筛选",
tagName: "2.按照商品标签筛选",
allkeyword: "3.按照商品同时包含所有关键字筛选",
anykeyword: "4.按照商品包含任何一个关键字筛选",
price: "5.按照商品价格筛选",
comment: "6.按照商品评价数筛选",
};
setTypeSelection(obj);
setShowAllBtn();
setShowBtn();
setHideBtn();
setShopFilter();
setTagFilter();
setPriceFilter();
setCommentFilter();
setAllkeywordFilter();
setAnykeywordFilter();
let lastViewDiv = document.getElementById("shopName_div");
}
if (location.href.toLowerCase().includes("https://search.jd.com/")
|| location.href.toLowerCase().includes("https://list.jd.com/")) {
let div = document.createElement("div");
div.id = "ecommerce_filter_wrapper";
let ecommerce_filter = document.createElement("div");
ecommerce_filter.id = "ecommerce_filter";
ecommerce_filter.style.cssText = "margin-top: 10px;";
let button1 = document.createElement("input");
button1.type = "button";
button1.value = "重新生成筛选系统";
button1.onclick = function () {
let items = document.querySelectorAll("#J_goodsList > ul > li.gl-item");
if (items.length < 60) { alert("请先使用鼠标滚动到页面底部\n等待内容全部加载完毕,然后再点击本按钮!"); return; }
document.querySelector("#ecommerce_filter").innerHTML = "";
setJDHelper();
}
let span = document.createElement("span");
span.innerHTML = '<a style="color:red;font-size: 16px;" href="https://greasyfork.org/zh-CN/users/289205-%E6%B5%B4%E7%81%AB%E5%87%A4%E5%87%B0" target="_blank">★★★京东购物助手,作者:浴火凤凰(QQ:307053741)★★★专业接单Chrome浏览器扩展开发定制、油猴脚本开发定制,欢迎来聊★★★</a>';
div.appendChild(button1);
div.appendChild(span);
div.appendChild(ecommerce_filter);
document.querySelector("#J_filter").appendChild(div);
}
// Your code here...
})();