找回密码
 立即注册
快捷导航

[Html/Css/JS] 油猴脚本 - 脚本往页面上添加新元素

[复制链接]
庶民 2023-6-13 13:56:10 | 显示全部楼层
本帖最后由 庶民 于 2023-6-13 14:29 编辑

首先使用 document.createElement 创建好你想插入的元素,例如按钮,就 document.createElement("button"),如果你有很多组件想放进去的话可以用 document.createElement("div"),然后往element里的innerHTML直接写html代码;

然后找到你想插入的位置,使用 append/insertBefore之类的方法插入你的element.

appendappendChildprependinsertBefore,具体方法和区别可以自行百度搜索和查看文档

上面是使用原生javaScript实现的,你也可以使用网页自带的jQuery(如果有的话);

我们还需要监听我们的元素事件,最常用的就是 click点击事件,点了我们的按钮,让我们的脚本做出一些反应.

let btn=document.createElement("button");
btn.innerHTML="按钮文字,其实也可以写html,变成下面的样子(不过谁用按钮来包那么多html标签呢)";//innerText也可以,区别是innerText不会解析html
btn.onclick=function(){
    alert("点击了按钮");
}
document.body.append(btn);

如果是一个div,在里面写html自由发挥,可以使用下面的方式;event详细说明:Event

let div=document.createElement("div");
div.innerHTML='<span id="span-1">span1</span><span class="sp">span class</span>';
div.onclick=function(event){
    if(event.target.id=="span-1"){
        alert("span-1被点击了");
    }else if(event.target.className=="sp"){
        alert("sp这一类被点了");
    }
};
document.body.append(div);

另外再补充一下,上面的onclick可以改写成addEventListener("click"),类似下面这样

div.addEventListener("click", function(ev){
    console.log(ev);
});

主要区别:onclick只能绑定一个function,而addEventListener可以绑定多个,这又涉及了前端的内容,大家可以课后补习一下,可以看一下addEventListener的说明.也还有其它的绑定事件的方法,这里就不一一列举了.

对于监听页面上已经有的按钮,推荐用addEventListener,以防onclick将原来的按钮事件覆盖掉(如果按钮也是用onclick的话),看情况而定.

而且也可以在事件中 return false;使事件不再向上传递.

实战:实现一个b站一键三连的按钮

aid是我们的视频id,csrf的在cookie里面,这里就暂时不细说了,因为我们就是在bilibili的页面上,所以我们不需要使用GM跨域(所以我的grant是none,不需要沙盒环境,另外用unsafeWindow也挺麻烦的),而且也可以直接通过cookie取到csrf,直接用xhr请求接口就行了;代码如下:

// ==UserScript==
// @name         bilibili三连按钮demo
// @namespace    https://A.cn/
// @version      0.1
// @description  给bilibili增加一个真三连按钮
// @author       W
// @match        https://www.bilibili.com/video/*
// @grant        none
// @run-at       document-end
// ==/UserScript==

let triple=document.createElement("button");
triple.innerText="三连";
triple.style.background="#757575";//颜色弄得差不多吧
triple.style.color="#fff";
triple.onclick=function(){
    //三连代码
    let httpRequest = new XMLHttpRequest();
    httpRequest.open('POST', 'https://api.bilibili.com/x/web-interface/archive/like/triple');
    httpRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    httpRequest.withCredentials = true;    //设置跨域发送
    let aid=window.__INITIAL_STATE__.aid;
    let sKey="bili_jct";

    // 取csrf代码来自:https://developer.mozilla.org/zh-CN/docs/Web/API/Document/cookie%E4%B8%80%E4%B8%AA%E5%B0%8F%E6%A1%86%E6%9E%B6%EF%BC%9A%E4%B8%80%E4%B8%AA%E5%AE%8C%E6%95%B4%E6%94%AF%E6%8C%81unicode%E7%9A%84cookie%E8%AF%BB%E5%8F%96%E5%86%99%E5%85%A5%E5%99%A8
    let csrf=decodeURIComponent(document.cookie.replace(new RegExp("(?:(?:^|.*;)\\s*" + encodeURIComponent(sKey).replace(/[-.+*]/g, "\\$&") + "\\s*\\=\\s*([^;]*).*$)|^.*$"), "$1")) || null;

    httpRequest.send('aid='+aid+'&csrf='+csrf);
    httpRequest.onreadystatechange = function () {
        if (httpRequest.readyState == 4 && httpRequest.status == 200) {
            var json = JSON.parse(httpRequest.responseText);
            console.log(json);
            if(json.code==0){
                alert("三连成功!刷新页面可见");
            }else{
                alert("三连失败/(ㄒoㄒ)/~~");
            }
        }
    };
};
let ops=document.querySelector('#arc_toolbar_report .ops');
//插入三连之后好像会重新生成,不添加就不会重新生成,暂时没弄清什么情况,先这样处理了.
//主要作用是监听ops的修改,等它修改完成之后再插入我们的三连按钮,另外注意run-at是document-end,要等待ops生成之后再监听,不然query返回null会报错
//这个事件会多次调用,但是我们insertBefore插入如果元素存在,只是修改而不会新增
ops.addEventListener("DOMNodeInserted", function(event) {
    let share=document.querySelector('.share');
    share.parentElement.insertBefore(triple, share);
});

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

温馨提示

关于 注册码 问题

      由于近期经常大量注册机器人注册发送大量广告,本站开启免费入群领取注册码注册网站账号,注册码在群公告上贴着...

关于 注册码 问题

      由于近期经常大量注册机器人注册发送大量广告,本站开启免费入群领取注册码注册网站账号,注册码在群公告上贴着...

Archiver|手机版|小黑屋|DLSite

GMT+8, 2024-11-23 06:19

Powered by Discuz! X3.5 and PHP8

快速回复 返回顶部 返回列表