制作油猴Tampermonkey脚本需要哪些知识
之前有篇文章讲述了如何使用油猴来编写浏览器脚本,以及用油猴编写脚本相对于Chrome插件有什么优势:强大的油猴Tampermonkey:简单的脚本制作。
因为之前的文章中只讲解了油猴脚本怎么编写,但是没有细说油猴脚本如何编写,以及编写油猴脚本需要哪些知识与技能点。
所以这篇文章就着重讲解一下油猴脚本涉及了哪些知识:
1. HTML,CSS
将HTML
和CSS
放在一起是因为在油猴脚本的编写中,这两项技术并不是太能派的上用场,除非你的脚本需要大量的交互,否则就不会编写很多HTML
和CSS
。
就好比上图来说,你需要做出这种按钮、图片集成框时才需要使用到HTML
和CSS
。
如果有这方面的需求,那么就必须要学会HTML
和CSS
基础,至于Vue
,如果有兴趣的话也可以学习,当你需要编写界面的时候Vue
会提供很多便利。
2. JavaScript
重点!一个油猴脚本本质上就是一个JavaScript
文件,如果连JavaScript
不会使用,那根本无从下手。
因为上一篇文件是直接放出了脚本代码,但是没有讲解脚本代码的含义,所以本篇文章就着重讲解一下我之前的代码做了什么,下面贴上上次的代码:
// ==UserScript==// @name B站图片爬取// @namespace http://tampermonkey.net/// @version 0.1// @description try to take over the world!// @author You// @match https://www.bilibili.com/*// @grant none// @resource customCSS https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css// @require https://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.slim.min.js// @require https://cdn.jsdelivr.net/npm/vue// ==/UserScript==
(function () { "use strict"; $("head").append($(`<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css">`)); var divApp = $( `<div style="position:fixed; z-index:1000;top: 80vh;left: 5vw" id="myPlan"> <div v-if="showMassage" style="position: fixed;z-index: -1;width: 100vw;height: 100vh;top: 0;right:0;background-color:rgba(0,0,0,0.5);"></div> <button class="btn btn-primary" @click="showM">提取图片</button> <div v-if="showMassage" class="container" style="position:fixed;background-color:rgba(0,0,0,0.5);;display: flex;flex-wrap: wrap;overflow: auto;width: 600px;height: 500px;top: 50%;left: 50%;transform: translate(-50%, -50%);"> <div v-for="(image,index) in images" :key="index">
<a :href="image.src" target="frame1"><img :src="image.src" class="rounded float-left" style="min-width: 100px;margin: 10px;height: 80px" alt=""></a></div></li></div></div></div>` ); $("#app").append(divApp);
/*Vue操作*/ var app = new Vue({ el: "#myPlan", data: { showMassage: false, images: [] }, methods: { showM() { this.showMassage = !this.showMassage; this.images = $("img"); } } });
})();
2.1 (function(){})()
(function(){})
在JavaScript
的代码中经常出现,其实本质上是声明了一个匿名函数,然后对它进行调用。
// 普通的函数声明function a(){}
// 匿名函数let a = function(){}
// 调用函数a();
// (function(){})() 就相当于是声明了一个匿名函数,并且调用// 等价于上面的先声明 function a(){} 再调用 a()
2.2 jQuery
曾经风光无限的JavaScript
库,它简化了HTML
与JavaScript
之间的操作。
近些年来越来越少的开发者会用到它,因为现在几乎都是使用的Vue
和React
前端框架,这些前端框架提出了一个概念叫做虚拟DOM,通过虚拟DOM
技术,我们在实际的开发中减少了大量的DOM
操作,自然就不需要使用简化DOM
操作的jQuery
。
由于jQuery
过去的风光,所以现在很多前端项目依然还在使用jQuery
进行维护,同时由于编写油猴脚本需要大量操作DOM
,所以如果需要编写油猴脚本,还是要学一学jQuery
。
那么说了这么多,通过下面的例子我们来看看jQuery
到底起了什么作用:
比如我们要通过ID
获取到一个DOM
元素,使用原生JavaScript
进行获取就是document.getElementById("app");
,而通过jQuery
获取就可以简化为$("#app")
。
通过上面的例子可以看到jQuery
在操作DOM
元素时大大的简化了代码量。
当然jQuery
的作用不仅仅是这些,至于进一步的用法,可以参考一下网上jQuery
的教程。
2.3 引入BootStrap
2.3.1 BootStrap是什么
Bootstrap是一组用于网站和网络应用程序开发的开源前端框架,包括HTML、CSS及JavaScript的框架,提供字体排印、窗体、按钮、导航及其他各种组件及Javascript扩展,旨在使动态网页和Web应用的开发更加容易。 Bootstrap是GitHub上面被标记为“Starred”次数排名第四多的项目。
简单的说就是一个提供大量样式的玩意,大大简化你的前端开发工作量,直接帮你实现了很多常用样式和组件,直接拿去用就行了。
但是我觉得自己用的油猴脚本样式能看就行了…用BootStrap
做样式其实是为了给别人看。
2.3.2 引入
因为我发现油猴脚本好像无法引入CSS文件,也可能是我没有找对方法,我试了几个方法后发现只有直接向head
中进行添加DOM
的方式成功了,即下面的代码:
$("head").append($(`<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css">`));
通过这段代码,我们就相当于给网页的<head>
标签中添加了:
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css">
2.4 Vue
我编写的那个脚本中还使用到了Vue
,至于Vue
的作用是让我可以更方便的制作出交互页面,即图片集中在一起显示的界面就是使用Vue
来做的。
这点其实使用jQuery
也能够实现同样的效果,但是我对于jQuery
的了解也仅仅是停留在能用的地步。
3. 最后
这里再给上一个旋转网页图片的油猴脚本,总所周知,在看贴吧或者各种网页的时候,有人发的图片可能是颠倒的,这个时候就需要旋转才方便观看,但是手机端可以将手机旋转, 电脑端总不能把电脑屏幕整个旋转吧。
所以就写了一个旋转图片的脚本,虽然使用过程可能会产生BUG,但是大体功能是实现了。
3.1 最后效果
代码如下:
// ==UserScript==// @name 旋转图片// @namespace http://tampermonkey.net/// @version 0.1// @description try to take over the world!// @author You// @include *// @grant none// @require https://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.slim.min.js// ==/UserScript==
(function () { 'use strict'; $('head').append($(` <!-- CSS部分 --> <style> .ha-image { position: relative; } .ha-button { display: none; top: 0; left: 0; position: absolute; z-index: 1; } .ha-image:hover>.ha-button { display: inline-block; } </style>`)); /* 给图片增加一个父元素,方便操作 */ let divApp = $(` <div class="ha-image"></div> `); /* 按钮部分 */ let rotateButton = $(` <div class="ha-button"> <button class="leftRotate90">旋转90度</button> <button class="rightRotate180">旋转180度</button> <button class="rightRotate270">旋转270度</button> <button class="reset">还原</button> </div> `); let images = $('img'); images.wrap(divApp); $('.ha-image').append(rotateButton); $('.leftRotate90').click(function () { let image = $(this).parent().parent().children('img'); image.css('transform', 'rotate(90deg)'); return false; //阻止事件冒泡 }); $('.rightRotate180').click(function () { let image = $(this).parent().parent().children('img'); image.css('transform', 'rotate(180deg)'); return false; }); $('.rightRotate270').click(function () { let image = $(this).parent().parent().children('img'); image.css('transform', 'rotate(270deg)'); return false; }); $('.reset').click(function () { let image = $(this).parent().parent().children('img'); image.css('transform', 'rotate(0)'); return false; });})();