Newegg.com: Show the Hidden Prices

Never be annoyed with hidden prices on newegg.com again :)

当前为 2014-05-25 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name           Newegg.com: Show the Hidden Prices
// @description    Never be annoyed with hidden prices on newegg.com again :)
// @version        3.3.1
// @include        http://www.newegg.tld/*
// @namespace https://greasyfork.org/users/2178
// ==/UserScript==
/* Script badly broken, working of fix this contains what I have so far, better than nothing, the old awesome version is commended out if you want to work on fixing it
function getURL(findMe,txt){
	if(txt){
		txt=txt.slice(1);
		txt=txt.slice(txt.indexOf(findMe+'='));
		var l=txt.indexOf('&');
		if(l!=-1){
			return txt.slice(findMe.length+1,l);
		}
		else{
			return txt.slice(findMe.length+1);
		}
	}
	return null;
}*/
function addCommas(nStr){// http://www.mredkj.com/javascript/nfbasic.html
	nStr += '';
	x = nStr.split('.');
	x1 = x[0];
	x2 = x.length > 1 ? '.' + x[1] : '';
	var rgx = /(\d+)(\d{3})/;
	while (rgx.test(x1)) {
		x1 = x1.replace(rgx, '$1' + ',' + '$2');
	}
	return x1 + x2;
}/*
function roundNumber(num, dec){// http://forums.devarticles.com/showpost.php?p=71368&postcount=2
	return Math.round(num*Math.pow(10,dec))/Math.pow(10,dec);
}
function comboPriceInCart(e,combo){
	GM_xmlhttpRequest({
		method: "GET",
		url: 'http://www.newegg.com/Product/MappingPrice.aspx?ComboID='+combo,
		onload: function(r){
			var save=r.responseText;
			save=save.substr(save.indexOf('<dd class="rebate">You Save: ')+29);
			save=save.substr(0,save.indexOf('</dd>'));
			e.parentNode.previousElementSibling.textContent='Discount: '+save;
			var price=r.responseText;
			price=price.substr(price.indexOf('<h3 class="zmp">')+16);
			price=price.slice(0,price.indexOf('</h3>')).replace(/[(\t\r\n\ ]/g,'');
			e.parentNode.innerHTML='<strong>Combo Price: '+price+'</strong>';
		}
	});
}
function comboPriceFinder(ele){
	if(document.evaluate("//table[@class='comboOverview']/tbody/tr/td[@class='price']/em",document,null,9,null).singleNodeValue){
		setTimeout(function(){
			comboPriceFinder(ele);
		},2000);
	}
	else{
		var prices=document.evaluate("//table[@class='comboOverview']/tbody/tr/td[@class='price']",document,null,6,null);
		var is=0;
		for(var i=prices.snapshotLength-1;i>-1;i--){
			is+=Number(prices.snapshotItem(i).textContent.replace(/[( \n\r\t\$,]/g,''));
		}
		insertComboPageHTML(roundNumber(is,2).toString(),ele);
	}
}
function fetchPrice(ITEM,ele,bool,comboList){
	if(bool){
		GM_xmlhttpRequest({
			method: "GET",
			url: 'http://www.newegg.com/Common/Ajax/RelationItemInfo.aspx?item='+ITEM+'&type=Newegg&_='+(new Date().getTime().toString().substring(0,10)),
			onload: function(price){
				price=price.responseText;
				price=price.substr(price.indexOf(ITEM+'$')+ITEM.length+1);
				price=price.slice(0,price.indexOf('">')).replace(/[(\n\r\t \$,]/g,'');
				if(Number(price)==price){
					if(comboList){
						ele.innerHTML='$'+addCommas(price);
					}
					else{
						insertProductPageHTML(ele,price.split('.'));
					}
				}
				else{
					GM_log('No price for '+ITEM+' advailable');
				}
			}
		});
	}
	else{
		if(ITEM.indexOf('Combo')!=-1){
			ITEM='ComboID='+ITEM;
		}
		else{
			ITEM='Item='+ITEM;
		}
		GM_xmlhttpRequest({// price in cart
			method: "GET",
			url: 'http://www.newegg.com/Product/MappingPrice.aspx?'+ITEM,
			onload: function(price){
				price=price.responseText;
				price=price.substr(price.indexOf('<h3 class="zmp">')+16);
				price=price.slice(0,price.indexOf('</h3>')).replace(/[(\t\r\n\$, ]/g,'');
				if(comboList){
					ele.innerHTML='$'+addCommas(price);
				}
				else{
					insertComboPageHTML(price,ele);
				}
			}
		});
	}
}
function insertComboPageHTML(is,ele){
		var tmp=document.getElementById('singleFinalPrice').nextElementSibling.cloneNode(true);
		insertProductPageHTML(ele,is.split('.'));
		ele.appendChild(tmp);
		tmp=tmp.innerHTML;
		var save=Number(tmp.replace(/,/g,'').substr(tmp.indexOf('$')+1));
		var was=addCommas(roundNumber(Number(is)+save,2));
		ele.previousElementSibling.innerHTML='<span class="label">Was: </span><span>$'+was+'</span>';
		var comboFoot=document.evaluate("//tfoot/tr[@class='grand_total']/td[@class='price']",document,null,9,null).singleNodeValue;
		comboFoot.innerHTML='$'+addCommas(is.indexOf('.')==-1?is+'.00':is);
		comboFoot=comboFoot.parentNode.parentNode;
		tmp=document.createElement('tr');
		tmp.innerHTML='<td colspan="2">Combo Discounts:</td><td class="price">-$'+addCommas(save.toString().indexOf('.')==-1?save+'.00':save)+'</td>';     
		comboFoot.insertBefore(tmp,comboFoot.childNodes[0]);
		tmp=document.createElement('tr');
		tmp.innerHTML='<td colspan="2">Combined Total:</td><td class="price">$'+(was.indexOf('.')==-1?was+'.00':was)+'</td>';
		comboFoot.insertBefore(tmp,comboFoot.childNodes[0]);
}
function insertProductPageHTML(ele,item){
	var html='',ele2=ele.parentNode.childNodes[0];
	if(ele2.className=='original'){
		var p=Number(ele2.childNodes[1].textContent.substr(1).replace(/,/g,''))-Number(item[0].replace(/,/g,'')+'.'+item[1]);
		p=addCommas(roundNumber(p,2));
		html='<div class="original"><span class="label">Save: </span>$'+(p.indexOf('.')==-1?p+'.00':p)+'</div>';
	}
	ele.innerHTML='<div id="singleFinalPrice" class="current"><span class="label">Now: </span><span>$</span>'+addCommas(item[0])+'<sup>.'+item[1]+'</sup></div>'+html;
}
function showPrice(target){
	var price,eles=document.evaluate('//ul/li[@class="'+target+'"]',document,null,6,null);
	for(var i=eles.snapshotLength-1;i>-1;i--){
		price=eles.snapshotItem(i).parentNode;
		price=price.nextElementSibling.value.substr(1).split('.');
		eles.snapshotItem(i).innerHTML='<span class="label">Now: </span>$<strong>'+price[0]+'</strong><sup>.'+price[1]+'</sup>';
		eles.snapshotItem(i).className='priceFinal';
	}
}
function showPriceLoop(){// Timed loop is used cause DOMSubtreeModified will fire hundreds of times a second which is hell on slow systems
	showPrice('priceMAP');
	setTimeout(function(){
		showPriceLoop();
	},3250);
}
showPrice('priceRange');
showPriceLoop();

var Item=getURL('Item',location.search),ele;
if(!Item)
	Item=getURL('ItemList',location.search);
if(Item){// Product Pages
	setTimeout(function(){
		ele=document.evaluate("//div[@class='wrapper']/a[@class='blkLink map']/em",document,null,9,null).singleNodeValue;
		if(ele){// Normal Item
			try{// Check page for price
				insertProductPageHTML(ele.parentNode.parentNode,document.evaluate("//div[starts-with(@rel,'"+Item+"')]",document,null,9,null).singleNodeValue.getAttribute('rel').split('$')[1].split('.'));
			}
			catch(e){// Price did not load on page in time or will not be loading; Now getting price my self
				fetchPrice(Item,ele.parentNode.parentNode,ele.textContent=="Click for Details",false);
			}
		}
		else{// Combo Item
			ele=document.evaluate("//div[@id='singleFinalPrice']/h3/a/em",document,null,9,null).singleNodeValue;
			var products=document.evaluate("//tr/td[@class='price']/em/../../td[@class='desc']/a",document,null,6,null);
			var prices=document.evaluate("//tr/td[@class='price']/em/..",document,null,6,null);
			if(ele.textContent=='See price in cart'){// Slightly Hidden
				fetchPrice(Item,ele.parentNode.parentNode.parentNode.parentNode,false,false);
				for(var i=products.snapshotLength-1;i>-1;i--){
					var id=products.snapshotItem(i).href;
					fetchPrice(getURL('Item',id.substr(id.indexOf('?'))),prices.snapshotItem(i),false,true);
				}
				var prices=document.evaluate("//tr/td[@class='price']",document,null,6,null);
			}
			else{// Very Hidden
				setTimeout(function(){
					comboPriceFinder(ele.parentNode.parentNode.parentNode.parentNode);
				},3000);
				for(var i=products.snapshotLength-1;i>-1;i--){
					var id=products.snapshotItem(i).href;
					fetchPrice(getURL('Item',id.substr(id.indexOf('?'))),prices.snapshotItem(i),true,true);
				}
			}
		}
	},2550);
}
else{
	var eles=document.evaluate("//ul[@class='comboPrice map']/li[@class='comboFinal']/a[@class='priceAction']",document,null,6,null);
	for(var i=eles.snapshotLength-1;i>-1;i--){
		ele=eles.snapshotItem(i);
		if(ele.textContent=='See price in cart'){
			var combo=ele.getAttribute('onclick');
			combo=combo.slice(combo.indexOf('ComboID=')+8,combo.indexOf("','"));
			comboPriceInCart(ele,combo);
		}
		else{
			var url=ele.parentNode.nextElementSibling.getElementsByTagName('a')[0].href;
			ele.removeAttribute('onclick');
			ele.href="/Product/ComboDealDetails.aspx?ItemList="+url.substr(url.lastIndexOf('=')+1);
			ele.textContent='Click for Price';
			ele.removeAttribute('title');
		}
	}
}*/
function showPrice(){
	var paths=Array("//div[@class='itemCell']/div[@class='itemAction']/ul/li[@class='price-map']/a/../../li[@class='price-current ']",
	"//div/div[@class='wrap_inner']/div[@class='wrap_pitch']/ul/li[@class='price-map']/a/../../li[@class='price-current ']",
	"//div[@class='infoSideSell']/ul/li[@class='price-map']/*/../../li[@class='price-current ']");
	for(var x=0,stp=paths.length;x<stp;x++){
		eles=document.evaluate(paths[x],document,null,6,null);
		for(var i=eles.snapshotLength-1;i>-1;i--){
			ele=eles.snapshotItem(i);
			price=ele.parentNode.parentNode.getElementsByTagName('input')[0].value;
			GM_log(price+" == "+Number(price));
			if(!isNaN(price))
				price="$"+price;
			price=price.split(".");
			ele.innerHTML="<strong>"+price[0]+"</strong><sup>."+price[1]+"</sup>";
			ele.className+="patched";
		}
	}
}
function showPriceLoop(){// Timed loop is used cause DOMSubtreeModified will fire hundreds of times a second which is hell on slow systems
	showPrice();
	setTimeout(function(){
		showPriceLoop();
	},3250);
}

GM_addStyle("#singleFinalPrice,.is-map .price-current.patched{display:block!important;}.is-map .price-map{display:none!important;}");
var ele=document.evaluate("//li[@class='price-map']/a/../../li[@id='singleFinalPrice']",document,null,9,null).singleNodeValue,eles,price;
if(ele){
	price=ele.getAttribute('content').split(".");
	ele.innerHTML="$<strong>"+addCommas(price[0])+"</strong><sup>."+price[1]+"</sup>";
}
showPriceLoop();