document-end 并非真正意义上的完全载入页面吧?
firefox吧
全部回复
仅看楼主
level 15
kidzgy 楼主
什么是完全载入页面呢?
当你打开页面时,如果标签页还没显示网站图标,还在显示滚动动画载入的时候,就说明还没完全载入页面。
在GM脚本上,@run-at document-end,是表示在页面完全载入之后才载入脚本的吧。
可是在实际操作中,GM载入脚本,并不是完全载入页面之后才加载脚本。一般来说,GM不是样式,不是即时的,有延迟,多数说法都是加载页面后加载脚本。
打个比方:https://userscripts.org/scripts/source/156627 这是个网易右侧显示评论的脚本。
脚本里是设置有延迟的。如果把脚本中的延迟加载脚本去掉,在代码头加上一句://@run-at document-end
,右侧评论通常不会被加载成功。
倘若不去掉延迟,按原来的脚本载入,如果网速流畅,是可以加载成功的。
但是,你用迅雷下载某个东西,把网速拉得干干净净,留一点点带宽,网易新闻缓慢地打开,如果超过延时还没成功加载完页面,则,右侧也不会显示。
问题是:如果@run-at document-end也不能算完全载入页面后才再载入脚本,那么有什么办法,就算把网速拉掉(网速不至于被拉得10分钟也打开不了页面),不设置延迟,也依然能打开新闻右侧评论,只不过是没那么快而已。有这样的完美办法没有呢? @noe132 @SOS团员 @YUIの唯爱 @雨滴在心头 @半壶浊酒一壶愁
2013年05月02日 12点05分 1
level 15
kidzgy 楼主
2013年05月02日 13点05分 2
吧务
level 15
路过
——我以前是用360的,突然对火狐来了兴趣,听说火狐可以用什么油狒狒,可是我在设置选项里面找了两年,硬是没有找到这个选项,why?
2013年05月02日 13点05分 3
level 8
直接监听window的load事件。或者延时加载,或者循环定时检测,检测到内容则加载脚本。
2013年05月02日 13点05分 4
level 8
事件监听,不用元数据
好像这个元数据还是从chrome引入的吧
2013年05月02日 13点05分 5
level 14
//@run-at document-end
是在html文件加载完(即html文档下载并加载完毕,不包括多媒体内容,不包括脚本)运行脚本
如果这个脚本需要在别的脚本基础上完成,那么这样就不成功
2013年05月02日 14点05分 7
我就猜到了
2013年05月03日 05点05分
level 11
有些东西是页面完全加载后再由页面内的JS运行调用出来的,所以window.onload也没用,只能自己想办法去监测你需要的东西有没有加载出来。有两个办法:
1. 监听DOMNodeInserted,如果你要的东西加载出来了就开始工作。
2. 简单但是执行效率不高的办法,页面加载后用个函数每隔500ms调用一次,检测你要的东西出来了没,如果出来了就开始工作。
3. 最复杂但是最高级的办法:找到网站代码里相关函数给它下个钩子。
——我喂自己袋盐,
壮哉我大OP!
>>Opera/9.80 (Windows NT 6.1; Edition IBIS) Presto/2.12.388 Version/12.15
2013年05月02日 14点05分 8
数死早。
2013年05月02日 14点05分
回复 寂寞的原子 :[拍砖]这个就有点棘手了..我还是菜B一个啊[泪]
2013年05月02日 14点05分
回复 kidzgy : 新手可以用第2个办法,虽然不太好但是操作很简单。
2013年05月02日 14点05分
回复 寂寞的原子 :可不可以给个相关的代码例句?
2013年05月02日 15点05分
level 11
引用 @kidzgy (8楼之楼中楼)
回复 寂寞的原子 :可不可以给个相关的代码例句?
————————————————————————————————
function initTieba(){
var c=document.querySelector('#com_userbar>ul');
if(!c) return setTimeout(initTieba,1000);
// 如果贴吧顶上的那个条条出来了就开始干活
// ....
}
initTieba();
——我喂自己袋盐,
壮哉我大OP!
>>Opera/9.80 (Windows NT 6.1; Edition IBIS) Presto/2.12.388 Version/12.15
2013年05月02日 15点05分 9
[揉脸]我自己要执行的命令加在哪个位置上啊?
2013年05月02日 15点05分
回复 kidzgy :写在// ....后面啊我这个是监测#com_userbar>ul的,你要根据需要自己修改的啊。。。
2013年05月02日 22点05分
回复 寂寞的原子 :[真棒]测试成功!
2013年05月03日 02点05分
回复 寂寞的原子 :刚才我改了其他脚本是可以,可是改回1楼的网易右侧显示评论页的话,就不行了,那个加在哪里都好像没有效果啊,恳请大神指点迷津![狂哭]
2013年05月03日 02点05分
level 13

window.addEventListener('DOMContentLoaded',function(){
alert('用这个吧!!!')
});
2013年05月03日 00点05分 10
[88]这个貌似不行~没有上楼的那么好用
2013年05月03日 02点05分
level 11
引用 @寂寞的原子 (9楼之楼中楼)
回复 kidzgy : 我看了一下你的代码,似乎就是等那个js-tielink的链接出来?
————————————————————————————————
那就这样吧:
var c=document.querySelector('.js-tielink');
if(!c||c.href[0]=='#') return setTimeout...
——我喂自己袋盐,
壮哉我大OP!
>>Opera/9.80 (Windows NT 6.1; Edition IBIS) Presto/2.12.388 Version/12.15
2013年05月03日 10点05分 11
[88]又没有生效哦[赖皮]
2013年05月03日 11点05分
回复 kidzgy :好吧,我搞错了。。if(!c||/^#/.test(c.getAttribute('href'))) return setTimeout(onload,1000);
2013年05月03日 11点05分
你自己测试呗,我只是提供方法啊,还要我来测试我表示身心疲惫啊。。。
2013年05月03日 11点05分
回复 寂寞的原子 :[真棒]巨神!(!c||/^#/.test(c.getAttribute('href'))) 能不能当作如果不能截取到元素的话,就中止命令,直到截取到元素才执行脚本的万能语句?
2013年05月03日 12点05分
level 11
我发现,4楼其实已经说过这种方法了:循环定时检测,检测到内容则加载脚本。
——我喂自己袋盐,
壮哉我大OP!
>>Opera/9.80 (Windows NT 6.1; Edition IBIS) Presto/2.12.388 Version/12.15
2013年05月03日 10点05分 12
window.addEventListener( 'load', function () { 是这样的语句么[揉脸]可我不会写
2013年05月03日 11点05分
回复 kidzgy : 不是。。就是我说的这种方法,我的意思是4楼已经提过了
2013年05月03日 11点05分
1