paul_guo
小狐狸
小狐狸
  • UID45016
  • 注册日期2014-03-13
  • 最后登录2024-04-11
  • 发帖数44
  • 经验52枚
  • 威望0点
  • 贡献值46点
  • 好评度1点
阅读:1710回复:5

想问一下怎么把一个油猴脚本打包成扩展呢?

楼主#
更多 发布于:2020-11-17 10:34
我有一个油猴脚本,将页面的attribute修改编辑,如果用油猴脚本管理器加载就会只加载一次,而chrome系的浏览器可以直接拖进去当扩展用,会一直加载修正
taoww
非常火狐
非常火狐
  • UID39284
  • 注册日期2013-03-18
  • 最后登录2024-04-15
  • 发帖数625
  • 经验571枚
  • 威望0点
  • 贡献值110点
  • 好评度99点
1楼#
发布于:2020-11-18 20:15
没看太明白。“会一直加载修正”是什么意思?
paul_guo
小狐狸
小狐狸
  • UID45016
  • 注册日期2014-03-13
  • 最后登录2024-04-11
  • 发帖数44
  • 经验52枚
  • 威望0点
  • 贡献值46点
  • 好评度1点
2楼#
发布于:2020-11-19 12:25
taoww:没看太明白。“会一直加载修正”是什么意思?回到原帖
就是会一直执行这个脚本中替换attribute的命令,典型就是同样类似的命令,adguard就会一直对每个元素执行,而ubo就只会加载一次,体现在贴吧上就是UBO对链接的修改无效了
taoww
非常火狐
非常火狐
  • UID39284
  • 注册日期2013-03-18
  • 最后登录2024-04-15
  • 发帖数625
  • 经验571枚
  • 威望0点
  • 贡献值110点
  • 好评度99点
3楼#
发布于:2020-11-20 10:08
说明你的代码写得不严谨,没有考虑到页面DOMContentLoaded/load事件后再动态增改的内容。
严谨点就用Mutation Observer API监听页面变化,想偷点懒就用setTimeout/setInterval反复执行
paul_guo
小狐狸
小狐狸
  • UID45016
  • 注册日期2014-03-13
  • 最后登录2024-04-11
  • 发帖数44
  • 经验52枚
  • 威望0点
  • 贡献值46点
  • 好评度1点
4楼#
发布于:2020-11-20 11:33
taoww:说明你的代码写得不严谨,没有考虑到页面DOMContentLoaded/load事件后再动态增改的内容。
严谨点就用Mutation Observer API监听页面变化,想偷点懒就用setTimeout/setInterval反复执行
回到原帖
其实这脚本也不是我写的,我只是看明白了他在做什么。。。
我曾经尝试过让这个脚本拖到最后运行,但感觉效果也不太行,您提到那个API我百度了一下用法,看的不是很懂
// ==UserScript==
// @name           Link Target 'blank' to removal
// @namespace      armeagle.nl
// @include        *
// @exclude        http://webmail.cpanel.your-webhost.nl/*
// @exclude        *armeagle.nl*
// @version 0.0.1.20140705065616
// @description Remove target blank from all links
// ==/UserScript==
 
if (window.top == window) {
    var ahrefs = document.querySelectorAll('a[target]');
    for ( a_ind = 0; a_ind < ahrefs.length; a_ind++ ) {
        var a = ahrefs[a_ind];
        a.removeAttribute('target');
    }
 
    // remove base target tag
    var bases = document.querySelectorAll("base[target]");
    for (ind = 0; ind < bases.length; ind++) {
        var base = bases[ind];
        base.removeAttribute('target');
    }
}






这脚本是这样的如果要用那个API,是在IF函数之前再嵌套IF吗
taoww
非常火狐
非常火狐
  • UID39284
  • 注册日期2013-03-18
  • 最后登录2024-04-15
  • 发帖数625
  • 经验571枚
  • 威望0点
  • 贡献值110点
  • 好评度99点
5楼#
发布于:2020-11-23 10:56
因为你的脚本头部中没有写@run-at,用的是默认值document-end,也就是在页面加载完但外部资源没有加载完时运行。而chrome系自带的脚本管理器,我记得是在页面上所有资源加载完毕后运行,差不多等效于document-idle。你可以先加个 @run-at document-idle 看看效果。

如果还不行,就用setTimeout再加上点延时,比如下面这样等个2000毫秒再执行
// ==UserScript==
// @name           Link Target 'blank' to removal
// @namespace      armeagle.nl
// @include        *
// @exclude        http://webmail.cpanel.your-webhost.nl/*
// @exclude        *armeagle.nl*
// @version 0.0.1.20140705065616
// @description Remove target blank from all links
// @run-at document-idle
// ==/UserScript==
         
if (window.top == window) {
    setTimeout(function() {
        var ahrefs = document.querySelectorAll('a[target]');
        for ( a_ind = 0; a_ind < ahrefs.length; a_ind++ ) {
            var a = ahrefs[a_ind];
            a.removeAttribute('target');
        }
         
        // remove base target tag
        var bases = document.querySelectorAll("base[target]");
        for (ind = 0; ind < bases.length; ind++) {
            var base = bases[ind];
            base.removeAttribute('target');
        }
    }, 2000);
}
把setTimeout换成setInterval就是每隔2000毫秒执行一次,简单应付一下一般的ajax异步加载也够用了
游客

返回顶部