Greasy Fork is available in English.

baidu search result handler

脚本的目的是使百度搜索结果页更人性化,更方便

// ==UserScript==
// @name           baidu search result handler
// @description    脚本的目的是使百度搜索结果页更人性化,更方便
//                 功能描述:
//                 1、去掉百度推荐和广告
//                 2、添加左右键快捷翻页(1.2版本以后去除)
//                 3、结果列表隔行换色、点击选择高亮、鼠标滑过高亮
//                 4、结果页预览
//                 5、结果可选择关闭
//                 6、ajax自动载入下一页
//                 7、相关搜索固定到底部
//                 8、添加返回顶部
//                 9、添加每页结果个数选项
//                 10、google和360搜索直接跳转
//                 11、搜索框复制到底部随页面滚动,方便后续搜索(应使用的人要求,去掉底部固定搜索框)
//                 12、百度结构变化,修改对应代码
// @namespace      http://www.shizuwu.cn
// @auth           break
// @version        2.0
// @license        Public Domain
// @include        http://www.baidu.com/s*
// @require 	   http://code.jquery.com/jquery-1.8.0.min.js
// ==/UserScript==
// UPDATES
// -------
// 2.0 2013.10.09 百度界面结构变化,修改对应的代码
// 1.9 2013.04.23 应使用的人要求,去掉底部固定搜索框
// 1.8 2013.04.15 搜索框复制到底部随页面滚动,方便后续搜索(应使用的人要求,去掉底部固定搜索框)
// 1.7 2013.01.15 jquery 升级后,有的属性和方法去除了,做出相应修改
// 1.6 2012.12.28 百度页面结构调整,修改对应的html标签
// 1.5 2012.12.23 加入google搜索链接,和360搜索链接
//                调整部分功能
// 1.4 2012.09.11 加入设置每页显示结果个数的按钮
// 1.3 2012.08.17 加入作者相关信息
//                返回顶部按钮功能转移
// 1.2 2012.08.17 去掉左右键翻页、去掉分页列表
//                添加ajax自动载入下一页的功能
//                底部无用信息去除,“相关搜索”固定到底部
//                底部添加"返回顶部"按钮
// 1.1 2012.08.16 添加"结果可选择关闭"功能
//                修改预览框效果
//                添加importJS功能
(function() {
	var prevT;

	$.extend({
		//获取网页url的参数
		getVar: function(name, url) {
			var vars = [],
				hash;
			if ("undefined" == typeof url || url == "") {
				var url = window.location.href;
			}
			var hashes = url.slice(url.indexOf('?') + 1).split('&');
			for (var i = 0; i < hashes.length; i++) {
				hash = hashes[i].split('=');
				vars.push(hash[0]);
				vars[hash[0]] = hash[1];
			}
			if (typeof name != 'undefined') {
				return typeof vars[name] != 'undefined' ? vars[name] : 0;
			} else {
				return vars;
			}
		},
		//插入样式
		insertCss: function(cssText) {
			var cssNode = $.createElm('style', $("head").get(0));
			cssNode.type = 'text/css';
			cssNode.innerHTML = cssText;
		},
		//插入JS
		insertJS: function(jsText) {
			var jsNode = $.createElm('script', $("head").get(0));
			jsNode.innerHTML = jsText;
		},
		//导入JS
		importJS: function(jsFile) {
			var jsNode = $.createElm('script', $("head").get(0));
			jsNode.src = jsFile;
		},
		//创建元素
		createElm: function(tagname, destin) {
			var theElem = destin.appendChild(document.createElement(tagname));
			return theElem;
		},
		//获取屏幕分辨率
		sc: function() {
			return screen.width;
		},
		cookie: function(name, value, options) {
		    if (typeof value != 'undefined') { // name and value given, set cookie
		        options = options || {};
		        if (value === null) {
		            value = '';
		            options = $.extend({}, options); // clone object since it's unexpected behavior if the expired property were changed
		            options.expires = -1;
		        }
		        var expires = '';
		        if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) {
		            var date;
		            if (typeof options.expires == 'number') {
		                date = new Date();
		                date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));
		            } else {
		                date = options.expires;
		            }
		            expires = '; expires=' + date.toUTCString(); // use expires attribute, max-age is not supported by IE
		        }
		        // NOTE Needed to parenthesize options.path and options.domain
		        // in the following expressions, otherwise they evaluate to undefined
		        // in the packed version for some reason...
		        var path = options.path ? '; path=' + (options.path) : '';
		        var domain = options.domain ? '; domain=' + (options.domain) : '';
		        var secure = options.secure ? '; secure' : '';
		        document.cookie = [name, '=', value, expires, path, domain, secure].join('');
		    } else { // only name given, get cookie
		        var cookieValue = null;
		        if (document.cookie && document.cookie != '') {
		            var cookies = document.cookie.split(';');
		            for (var i = 0; i < cookies.length; i++) {
		                var cookie = jQuery.trim(cookies[i]);
		                // Does this cookie string begin with the name we want?
		                if (cookie.substring(0, name.length + 1) == (name + '=')) {
		                    cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
		                    break;
		                }
		            }
		        }
		        return cookieValue;
		    }
		},
		google: function(kw) {
			window.open('http://www.google.com.hk/search?hl=zh-CN&q='+kw);
		},
		so: function(kw) {
			window.open('http://www.so.com/s?q='+kw);
		}
	});

	$.fn.GLO = {
		"pn": 0,
		"loading": 0,
		"totalNum":10,
		"pageSize":10,
		"nomore": 0,
		"otherSearchEngine":'<div class="button_wrap ose so"><a class="slidebttn" title="360搜索">SO</a></div><div class="button_wrap ose google"><a class="slidebttn" title="google搜索">G</a></div>',
		"sizes": '<div class="size_wrap"><div class="size"><span>100</span><span>50</span><span>20</span><span>10</span></div><div><span id="cs" title="切换每页结果数">10</span></div>',
		"AUTH": '<div class="button_wrap"><div class="buttons"><a href="http://www.shizuwu.cn/about" target="_blank">关于作者</a><a href="http://www.shizuwu.cn/hire" target="_blank">找我帮忙</a></div><a id="slidebttn" title="点我返回顶部" class="slidebttn">ME</a></div>',
		"authCss": '.button_wrap{position:fixed;z-index:36;width:165px;height:30px;bottom:10px;right:170px;overflow:hidden; font-size:12px;}.buttons{width:30px;height:30px;border-radius:30px;background-color:#000;color:#fff;top:0px;right:0px;position:absolute;line-height:30px;text-align:left}div.buttons a{color:#fff;display:none; margin:0px 10px; text-decoration:none;}.buttons a.holder{display:inline-block;width:30px;height:30px;margin:0px;background-color:#fff;border-radius:30px;color:#000;line-height:30px;text-align:center;cursor:pointer}.slidebttn{width:28px;height:28px;background-color:#000;border-radius:28px;color:#fff;position:absolute;top:1px;right:1px;text-transform:uppercase;line-height:30px;text-align:center;cursor:pointer}.so{right:90px; z-index:34;}.so a.slidebttn{background-color:#3ba80d;}.google{right:50px; z-index:33;}.google a.slidebttn{background-color:#1285fb;}',
		"sizeCss": '.size_wrap,#cs{position:fixed;z-index:35;width:30px;height:30px;bottom:10px;right:130px;overflow:hidden; font-size:12px;}.size_wrap{bottom:40px;height:0px;}.size span,#cs{display:block;cursor:pointer;border-radius:30px; height:30px; width:30px;background-color:#000; color:#fff; text-align:center; line-height:30px;float:right;}'
	};

	$.fn.extend({
		/**
		 * table 的相关操作
		 *  隔行换色
		 *  鼠标滑过变色
		 *  鼠标点击高亮单行
		 *  鼠标滑过出现预览按钮
		 */
		activeTable: function(opts) {
			defCss = '#container{margin-bottom:110px;}#container table{padding:5px; width:36em; position:relative;}table.gtr{background-color:#e1e6f6;-webkit-transition:all .2s ease-out;-webkit-transform:translate(0px, 0px);-moz-transition:all .2s ease-out;-moz-transform:translate(0px, 0px);border-radius: 10px;}table.hover{background-color:#fefdbb;box-shadow: 3px 3px 2px #e6e6e6;border-radius: 10px;}table.selectedTr{-webkit-transition:all .2s ease-out;-webkit-transform:translate(10px, 0px);-moz-transition:all .2s ease-out;-moz-transform:translate(10px, 0px);background-color:#fefdcb;box-shadow: 3px 3px 2px #e6e6e6;border-radius: 10px; border:1px solid #eead0e}#rs{width:100%;position: fixed; bottom:0px; border-top:1px solid #ccc; background:#fff;z-index:30;margin:0px}.fav{position: fixed;display: none;bottom: 10px;right: 40px;width: 30px;height: 30px;line-height: 30px;-webkit-border-radius: 30px;-mozborder-radius: 30px;border-radius: 30px;background: black;color: white;text-align: center;font-size: 12px;cursor: pointer;z-index:31;}.fav{display:block;}.redTip{color:red;}';
			prevCss = 'td.prev{width:2.3em}.vspiic{background: url("http://hiphotos.baidu.com/shizuwu/pic/item/807473d9f2d3572c1ec1d7458a13632763d0c3a9.jpg") scroll no-repeat;background-position: -20px 0px;height: 13px;width: 20px; cursor:pointer; margin-left:5px; display:none; position:absolute; bottom:5px;}.vspiic:hover{background-position: 0px 0px;}#prev{position:absolute; display:none; top:0; z-index:999999;border-radius: 10px; box-shadow: 3px 3px 2px #e6e6e6; padding:5px; border: 1px solid #ccc; background:#fff;}.preview-close{float:right; font-size:26px;text-decoration:none; color:#000;}.preview-close:hover{-webkit-transform: rotate(180deg);-webkit-transition: -webkit-transform 0.3s ease 0s;-moz-transform: rotate(180deg);-moz-transition: -moz-transform 0.3s ease 0s;}.prev .preview-close{position:absolute; top:5px; margin-left:5px; color:#ccc;}.preview-arrow{position: absolute;left: -6px;top: 289px; font:13px/1.231 Arial,sans-serif;}.preview-arrow em {color: #999;left: -1px;}.preview-arrow span {color: #fff;}.preview-arrow em, .preview-arrow span {overflow: hidden;position: absolute;height: 25px;width: 20px;}';

			prevBtn = '<div class="vspiic" title="预览(点击在新窗口查看)"></div>';
			closeTBtn = '<a href="javascript:void(0);" onclick="toggleTable(this);" class="preview-close" title="关闭">×</a>';
			closeBtn = '<a href="javascript:void(0);" onclick="this.parentNode.style.display=\'none\'" class="preview-close" title="关闭">×</a>';
			loadingImg = 'http://hiphotos.baidu.com/shizuwu/pic/item/5baca2de9c82d1584e73e028800a19d8be3e42df.jpg';
			ifrHtml = '<div id="prev">' + '<iframe id="prevIfr" style="overflow:hidden" scrolling="auto" height="450px"' + 'frameborder="0" src=""></iframe>' + '</div>';

			toggleTable = 'function toggleTable(obj) {$(obj).parents("table").hide().next().remove();}';

			opts = $.extend({
				"hc": "hover",
				"sc": "selectedTr",
				"oc": "gtr",
				"cssText": ''
			}, opts);


			/**
			 *整个结果列表的table重新定义(第一次载入时)
			 */
			//样式调整
			if ($.fn.GLO['pn'] == 0) {
				$.insertCss(defCss + prevCss + opts.cssText);
				$.insertJS(toggleTable);

				if(!$.browser.mozilla) {
					$.importJS('http://code.jquery.com/jquery-1.8.0.min.js');
				}

				//添加预览按钮已经iframe
				$(this).after(ifrHtml);

				$(".vspiic").live("mouseover mouseout click", function(e) {
					_this = $(this);
					clearTimeout(prevT);
					if (e.type == 'mouseover') {
						$("#prevIfr").attr("src", "").prevAll().remove();
						$("#prev").hide().show().css({
							"width": ((1 - 640 / $.sc()) * 100) + "%",
							"left": ($(this).offset().left + 35),
							"top": ($(document).scrollTop() + 85)
						}).prepend($(this).parent().prev().find("h3 a").clone().css({
							"float": "left"
						})).prepend("<img src='" + loadingImg + "' style='position:absolute; left:" + $("#prev").width() / 2 + "px; top:40px;' />").prepend(closeBtn).prepend('<div class="preview-arrow" id="prv-arr"><em>◆</em><span>◆</span></div>').find("#prv-arr").css({
							'top': _this.offset().top - $(document).scrollTop() - 85
						});
						var iicTop = _this.offset().top - $(document).scrollTop() - 85;
						if (iicTop < 85) {
							$("#prev").css({
								"top": _this.offset().top - 20
							});
							$("#prv-arr").css({
								"top": 20
							});
						}

						$("#prevIfr").attr("src", $(this).parent().prev().find("a:eq(0)").attr("href")).css({
							"width": $("#prev").width()
						}).load(function() {
							$("#prev").find("img").remove();
						});

					} else if (e.type == 'mouseout') {
						prevT = setTimeout('$("#prev").hide();$("#prevIfr").attr("src", "").prevAll().remove();', 200);
					} else if (e.type == 'click') {
						window.open($(this).parent().prev().find("h3.t a").attr("href"));
					}
				});

				$("#prev").live("mouseover mouseout", function(e) {
					clearTimeout(prevT);
					if (e.type == 'mouseout') {
						prevT = setTimeout('$("#prev").hide();$("#prevIfr").attr("src", "").prevAll().remove();', 0);
					}
				});
				

			}

			$(this).each(function() {
				$(this).find("table.result[rel!=loaded] > tbody > tr > td.c-default").each(function() {
					if ($(this).find("td.prev").size() == 0) {
						$(this).after('<td class="prev">' + closeTBtn + prevBtn + '</td>');
					}
				})
			});

			$(this).children("table:even").addClass(opts.oc);
			$("#page").remove();

			//单个table监听
			$(this).children("table").hover(function(e) {
				$(this).addClass(opts.hc).find(".vspiic").show();
			}, function(e) {
				$(this).removeClass(opts.hc).find(".vspiic").hide();
			})
			$(this).children("table").unbind("click").bind("click", function(e) {
				$(this).hasClass(opts.sc) ? $(this).removeClass(opts.sc) : $(this).addClass(opts.sc);
			});

		},
		loadContent: function(opts) {
			var defaults = {
				'container': $("body"),
				'contentPage': null,
				'contentData': {},
				'beforeLoad': null,
				'afterLoad': null,
				'scrollTarget': null,
				'heightOffset': 0
			};
			opts = $.extend(defaults, opts);
			var target = opts.scrollTarget;
			var mayLoadContent = $(target).scrollTop() + opts.heightOffset >= $(document).height() - $(target).height();
			if (mayLoadContent && $.fn.GLO['loading'] == 0) {
				if (($.fn.GLO['pn'] >= ($.fn.GLO['totalNum'] - $.fn.GLO['pageSize'])) ) {
					if($.fn.GLO['nomore'] == 0) {
						_this.append('<div id="nomore" class="redTip">亲~,没有更多结果了</div>');
						$.fn.setGLO({
							"nomore": 1
						});
					}
				} else {
					_this = $(this);
					if (opts.beforeLoad != null) {
						opts.beforeLoad();
					}
					_this.children("table").attr('rel', 'loaded');

					$.ajax({
						type: 'GET',
						url: opts.contentPage,
						data: opts.contentData,
						success: function(data) {
							console.log($.fn.GLO['pn']);
							_data = $(data).find("#container #content_left");
							$(_data).removeAds($.fn.GLO['pn']);
							var objectsRendered = $(_data).children("table");
							_this.append($(_data).children("table"));
							if (opts.afterLoad != null) {
								opts.afterLoad(objectsRendered);
							}
						},
						dataType: 'html'
					});
				}
			}

		},
		fadeInWithDelay: function() {
			var delay = 0;
			return this.each(function() {
				$(this).delay(delay).animate({
					opacity: 1
				}, 200);
				delay += 100;
			});
		},
		removeAds: function(pn) {
			$("#" + (parseInt(pn) + 1), $(this)).prevAll().not('p').remove();
			$("#content_right").remove();
			$(".EC_mr15", $(this)).remove();
		},
		setGLO: function(defGLO) {
			$.extend($.fn.GLO, defGLO);
		}
	});

	$(function() {
		//获取总共的搜索结果数
		numText = $("#page .nums").text().replace(/[^0-9]/ig, "");
		$.fn.setGLO({
			"totalNum": numText > 740 ? 740 : numText
		});
		$("#container #content_left").activeTable({});
		$(window).scroll(function(event) {
			$('#container #content_left').loadContent({
				'contentPage': 'http://www.baidu.com/s?wd=' + $.getVar("wd") + '&pn=' + (parseInt($.fn.GLO['pn']) + parseInt($.fn.GLO['pageSize'])) + '&tn=baiduhome_pg&ie=utf-8&usm=2',
				'contentData': {},
				'scrollTarget': $(window),
				'heightOffset': 10,
				'beforeLoad': function() {
					$("#loading").remove();
					$('#container #content_left').append('<div id="loading">正在载入....<img src="' + loadingImg + '" /></div>');
					$.fn.setGLO({
						"pn": parseInt($.fn.GLO['pn']) + parseInt($.fn.GLO['pageSize']),
						"loading": 1
					});
				},
				'afterLoad': function(elementsLoaded) {
					$('#loading').fadeOut();
					$(elementsLoaded).fadeInWithDelay().after("<br>").first().before("<div class='redTip'><b>۞下面是第" + ($.fn.GLO['pn'] / $.fn.GLO['pageSize'] + 1) + "页</b></div>");
					$("#container #content_left").activeTable({});
					$.fn.setGLO({
						"loading": 0
					});
				}
			});

		});

		//搜索框常在
		//$("#rs").prepend($("form.fm").clone().css({margin:'0px 25px 5px'}));

		//去掉底部无用代码
		$("#search, #foot").remove();

		//底部“关于作者”
		var ot;
		$("#container #content_left").append($.fn.GLO.AUTH);
		$.insertCss($.fn.GLO.authCss);

		$("#container #content_left").append($.fn.GLO.sizes);
		$.insertCss($.fn.GLO.sizeCss);

		//google、360搜索
		var kw = $.getVar("wd");
		$("#container #content_left").append($.fn.GLO.otherSearchEngine);
		$(".so").live("click", function() {
			$.so(kw);
		});
		$(".google").live("click", function() {
			$.google(kw);
		});

		$("#container #content_left").before("<p style='margin:0px 0px 8px 20px'><span class='nums'>百度为您找到相关结果<b>"+numText+"</b>个</span></p>")

		//每页显示个数
		$(".size span").click(function() {
			changeSize($(this).html());
		});
		$(".size_wrap").hover(function(){
			$(this).stop().animate({height:'120px'}, 500);
		},
		function(){
			$(this).stop().animate({height:'0px'}, 500);
		})
		

        $('#slidebttn').hover(
			function () {
				clearTimeout(ot);
				var $this 		= $(this);
				var $slidelem 	= $this.prev();
				$slidelem.stop().animate({'width':'165px'},300);
				$slidelem.find('a').stop(true,true).fadeIn();
				$this.css({"background":'#fff', "color":'#000'});
			},
			function (e) {
				ot = setTimeout(outHandler, 250);
			}
		).click(function() {
			$('body,html').animate({
				scrollTop: 0
			}, 400);
		});
		$(".buttons").hover(function() {
			clearTimeout(ot);
		}, function() {
			ot = setTimeout(outHandler, 250);
		})

        function outHandler() {
        	var $this 		= $('#slidebttn');
			var $slidelem 	= $this.prev();
			$slidelem.stop().animate({'width':'30px'},200);
			$slidelem.find('a').stop(true,true).fadeOut();
			$this.css({"background":'#000', "color":'#fff'});
        }
		if(/:NR=(\d{1,})/.test($.cookie("BAIDUID"))) {
			var cs = $.cookie("BAIDUID").replace(/(.*):NR=(\d{1,})(.*)/, '$2')
			$.fn.GLO['pageSize'] = parseInt(cs);
			$("#cs").html(cs);
		} else {
			$("#cs").html("10");
		}
		
		
	});
	
	/*设置每页结果数*/
	function setPageSize(size) {
		$.cookie("BAIDUID", $.cookie("BAIDUID").replace(/:NR=(\d{1,})/, '')+ ':NR='+size,{expire:7,'path':'/', 'domain':'.baidu.com'});
	}

	function changeSize(size) {
		setPageSize(size);
		location.reload();
	}

	
	//去掉百度推荐和广告
	
	$.fn.setGLO({
		"pn": parseInt($.getVar("pn"))
	});
	$("#container #content_left").removeAds($.fn.GLO['pn']);


})();