如何开发一个用户脚本系列(3)——脚本一:百度首页和搜索页面添加 Google 搜索框

在本系列的前两篇文章中,我们对用户脚本以及开发脚本前应该掌握的基础知识进行了介绍。从这篇文章开始,将以已发布可用的脚本为基础,进行脚本真实开发过程的讲解。在正式开始之前,先说一下我认为开发脚本应该遵循的两个准则:

  • 功能实现。当你决定要开发一个脚本的时候,你肯定清楚你的脚本要实现什么功能,只有你的脚本实现了你所描述的功能,才会有更多的人安装使用,才会有更多的人给你好评;
  • 样式实现。什么叫样式实现?就是你在目标网站中添加的元素,要尽量与原网站的配色,样式相一致。这一项是非必须的,但我认为是非常重要的。你想想,如果原网站整体是蓝色,而你添加的按钮是红色,那该有多突兀,有多丑,虽然你的按钮确实突出了,但别人一看就是山寨,看着会很不舒服。而如果你的按钮也用它网站的颜色,这样就会跟原网站已有的元素契合,整体特别自然,做到以假乱真的效果。你的脚本让别人用的舒服,别人才更愿意给你好评。

需求分析

今天讲解的脚本是 百度首页和搜索页面添加 Google 搜索框。我们平时在用百度搜索的时候,有些问题的搜索结果是不尽人意的,这时候我们需要再去 Google 搜索同样的问题,看一下 Google 有没有我们想要的结果。那么我们就需要在新的 tab 页打开 Google 搜索,输入同样的问题,然后搜索。这个过程略显繁琐,如果我们可以直接在百度搜索页面添加一个按钮,当我们觉得百度搜索结果不满意时,我们点击一下这个按钮,就可以自动打开 Google 搜索,将我们的搜索内容带过来,直接搜索展示结果,岂不是很方便?

功能实现

根据上面的需求分析,我们知道我们的脚本要运行的网站是百度的首页和搜索页面,然后观察可知,百度首页的 URL 形式为: https://www.baidu.com/,搜索页面的URL 形式为: https://www.baidu.com/s?wd=xxx,其中 wd 表示我们的搜索内容,每次搜索问号前面的部分都是不变的,所以我们 @match 可以这样写:

// @match        *://www.baidu.com/
// @match        *://www.baidu.com/s?*

关于协议头,需要说明的是,如果你写 http,那么只能匹配 http 开头的网站,如果你写 https,那么只能匹配 https 开头的网站,有些网站不管你用 http 还是 https,都可以访问,那么你可以写 http*,但这样 Violentmonkey 和 Greasemonkey 匹配不了,脚本用不了,所以最简单的方法就是直接写 *,这样简单方便。
我们对比一下使用脚本前和使用脚本后的效果:





可以看到,我们希望将添加的按钮叫 Google,跟在百度搜索按钮的后面,按钮使用的字体大小,字体颜色,背景色,都跟百度搜索按钮一致。

    var baiduBtn = document.getElementById("su"); // 获取百度搜索按钮
    baiduBtn.style.width = "80px"; //将百度搜索按钮的宽度设为 80 px
    baiduBtn.value = "百度"; //将百度搜索按钮的文字设为百度
    var googleBtn = document.createElement('span'); // 创建 Google 搜索按钮
    googleBtn.className = baiduBtn.parentNode.className; // 将 Google 搜索按钮和百度搜索按钮的 class 名称设置为相同,目的是使用百度搜索按钮已有的部分样式
    googleBtn.style = "width:80px;margin:0px 0px 0px 2px";
    googleBtn.innerHTML = "<input type='button' id='google' value='Google' class='btn bg s_btn' style='width:80px;'>";
    var form = document.getElementsByClassName("fm")[0]; // 获取百度搜索按钮的父元素
    form.appendChild(googleBtn); // 将 Google 按钮作为一个子元素添加到百度搜索按钮的父元素里面

上面的代码已经实现了向页面中添加一个 Google 搜索按钮,样式和百度搜索按钮一致,下面要实现点击该按钮打开 Google 进行搜索的功能。

    googleBtn.addEventListener('click', function () {
        var input = document.getElementById("kw"); // 获取百度输入框
        var keyword = input.value.replace(/(^\s*)|(\s*$)/g, ""); // 获取搜索内容(去空格)
        if (keyword != "") { // 如果搜索内容不为空,就调用 googleSearch() 方法进行搜索,需要传入的参数是搜索内容
            googleSearch(keyword);
        }
    });
    function googleSearch(keyword){ // Google 搜索方法
        var link = "https://www.google.com/search?q=" + encodeURIComponent(keyword); // 拼接好 Google 搜索的链接
        window.open(link); //新窗口打开链接
    }

在 Google 搜索方法中,需要先拿到 Google 搜索时的 URL,通过观察得知,Google 搜索时的 URL 形式为: https://www.google.com/search?q= xxx,其中 q 表示搜索内容,所以我们只需要将我们获取到的百度搜索输入框中的内容拼接到链接后面就可以了。为了避免搜索有些特殊字符时出现问题,需要使用 encodeURIComponent() 方法对搜索内容进行编码。然后使用 window 对象的 open() 方法打开最终的链接就可以了。当然你也可以使用脚本管理器提供的 GM_openInTab() 方法打开链接。然后我们看看效果,发现在搜索页面按钮已经可以正常使用了,但是在百度首页,按钮位置出现了偏差,所以我们还需要对首页的样式做一些改变。

    document.getElementById("form").style.width = "705px";
    document.getElementsByClassName("s_btn_wr")[0].style.width = "80px";

至此,我们就完成了这个脚本的开发,我们选择 文件 下面的 保存到磁盘,将脚本保存成一个以 .user.js 结尾的文件。


然后我们打开 GreasyFork,发布我们的脚本。我们点击选择文件,从磁盘上选择我们刚才保存的 js 文件。然后填写脚本介绍,并上传截图,最后发布脚本。

总结

本文对脚本 百度首页和搜索页面添加 Google 搜索框 的开发过程进行了介绍,如果还有疑问,可以留言,下一篇文章将对 脚本 一个返回顶部和到达底部的按钮 的开发过程进行介绍。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,133评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,682评论 3 390
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,784评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,508评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,603评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,607评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,604评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,359评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,805评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,121评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,280评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,959评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,588评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,206评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,442评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,193评论 2 367
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,144评论 2 352

推荐阅读更多精彩内容

  • 用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你...
    hw1212阅读 12,710评论 2 59
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,014评论 25 707
  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明先生_X自主阅读 15,979评论 3 119
  • .同理心—— 生活中处处都需要同理心,真的很重要,相互理解对方,站在对方的角度去考虑问题,有时候会让事情变的更简单...
    小坤橙伽班阅读 220评论 1 2
  • 今天在吃晚饭的时候,妈妈给我们炸了一点鸡柳。我趁妈妈不注意的时候,偷吃了一个。这时妈妈走过来对我说:“别吃...
    书虫枣枣阅读 252评论 0 1