toughstrong
火狐狸
火狐狸
  • UID16742
  • 注册日期2007-01-19
  • 最后登录2015-03-18
  • 发帖数100
  • 经验29枚
  • 威望0点
  • 贡献值12点
  • 好评度1点
  • 社区居民
  • 忠实会员
阅读:6352回复:11

使用Greasemonkey过滤网页内嵌JS脚本

楼主#
更多 发布于:2011-12-30 12:19
Adblock对于网页内嵌的JS脚本无能为力,例如:
<script language="JavaScript">
<!-- Begin
function popup() {
	window.open('http://www.taobao.com','','');
window.focus();
}
//  End -->
</script>


比较简单的方法就是使用Greasemonkey,安装的方法不详述了,可以参考https://www.firefox.net.cn/dig/toc/,简单的步骤
到Firefox Add-ons官网 https://addons.mozilla.org,搜索Greasemonkey,点击安装。

安装后重启Firefox,点击菜单栏中的“工具”--> "Greasemonkey" --> "New User Script...",创建一个新的GM脚本,在"New User Script..."对话框中:
Name: 给GM脚本取了名字,例如no_popup
Namespace: 无所谓,随便写几个字符串,一般是GM脚本的下载地址
Description: 无所谓,说明一下这个GM脚本的用处
Includes: 指定在哪些网页运行这个GM脚本,可以使用通配符,例如允许所有网页就是*,如果允许sohu.com就是http://*.sohu.com/*
Excludes: 指定不在哪些网页运行这个GM脚本,例如不在sina.com运行就是http://*.sina.com/*

点击OK后,进入GM脚本编辑,很简单只需要写入两行东西
unsafeWindow.popup = function () {
     var sorryMsg = "This souldn't appear because Greasemonkey can divide by zero.";
};

上面2行可以简单的理解为替代网页中原来的popup函数。

那么整个GM脚本看上去是这样的:
// ==UserScript==
// @name           no_popup
// @namespace      localhost
// @description    Replace the popup() function
// @include        *
// @exclude	      http://*.sina.com/*
// ==/UserScript==


unsafeWindow.popup = function () {
     var sorryMsg = "This souldn't appear because Greasemonkey can divide by zero.";
};


这样一些讨厌的网页内嵌JS脚本广告也可以被轻松的过滤。
congxz6688
火狐狸
火狐狸
  • UID14676
  • 注册日期2006-09-23
  • 最后登录2017-03-06
  • 发帖数108
  • 经验12枚
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 社区居民
1楼#
发布于:2011-12-30 12:19
使用document.addEventListener("beforescriptexecute", funtion,flase)可以在脚本执行前检查其内容。
dindog
千年狐狸
千年狐狸
  • UID30818
  • 注册日期2009-10-24
  • 最后登录2023-02-03
  • 发帖数1195
  • 经验59枚
  • 威望0点
  • 贡献值26点
  • 好评度10点
2楼#
发布于:2011-12-30 12:19
popup的话,abp现在可以了。可以参考楼上在mozest写的:

关于ABP新功能——阻止弹窗的试用
https://g.mozest.com/thread-39937-1-1

简单之余,效果相当理想。
以前firefox跳个票的时间现在可以发布几个正式版了-_-
fang5566
管理员
管理员
  • UID3719
  • 注册日期2005-03-07
  • 最后登录2024-04-29
  • 发帖数18483
  • 经验4837枚
  • 威望5点
  • 贡献值4316点
  • 好评度1116点
  • 社区居民
  • 最爱沙发
  • 忠实会员
  • 终身成就
3楼#
发布于:2011-12-30 12:19
dindog:popup的话,abp现在可以了。可以参考楼上在mozest写的:

关于ABP新功能——阻止弹窗的试用
https://g.mozest.com/thread-39937-1-1

简单之余,效果相当理想。
回到原帖


read-42578
效果实际来说并不理想,建议用 adblock plus pop-up addon,现在也加入过滤规则订阅功能。
Firefox More than meets your experience
dindog
千年狐狸
千年狐狸
  • UID30818
  • 注册日期2009-10-24
  • 最后登录2023-02-03
  • 发帖数1195
  • 经验59枚
  • 威望0点
  • 贡献值26点
  • 好评度10点
4楼#
发布于:2011-12-30 12:19
fang5566

read-42578
效果实际来说并不理想,建议用 adblock plus pop-up addon,现在也加入过滤规则订阅功能。
回到原帖

怎么说呢?举个例子?除了会闪一瞬间外(真的是一瞬间,不过也可能同配置有关系,不过我的机器也是中低端了),都可以啊。。。难道是我去的网站不够邪恶?
以前firefox跳个票的时间现在可以发布几个正式版了-_-
fang5566
管理员
管理员
  • UID3719
  • 注册日期2005-03-07
  • 最后登录2024-04-29
  • 发帖数18483
  • 经验4837枚
  • 威望5点
  • 贡献值4316点
  • 好评度1116点
  • 社区居民
  • 最爱沙发
  • 忠实会员
  • 终身成就
5楼#
发布于:2011-12-30 12:19
主要就是一闪,或者一弹后消失,相比之下用ABPPA效果更好一点。不过不介意的话 ABP也已经够用了呵呵。
Firefox More than meets your experience
alanfly
千年狐狸
千年狐狸
  • UID31035
  • 注册日期2009-11-10
  • 最后登录2023-10-31
  • 发帖数2765
  • 经验576枚
  • 威望1点
  • 贡献值128点
  • 好评度99点
  • 社区居民
  • 最爱沙发
  • 忠实会员
6楼#
发布于:2011-12-30 12:19
闪一下总感觉不舒服,期待更完美点。
fang5566
管理员
管理员
  • UID3719
  • 注册日期2005-03-07
  • 最后登录2024-04-29
  • 发帖数18483
  • 经验4837枚
  • 威望5点
  • 贡献值4316点
  • 好评度1116点
  • 社区居民
  • 最爱沙发
  • 忠实会员
  • 终身成就
7楼#
发布于:2011-12-30 12:19
read-42578
帖子里面反映的那个网站就是白光一闪而过。
帖子里面也说明了原理,先是载入about:blank 也就是空白页面(白光来源),然后在发送接收请求之前,用ABP自己的拦截请求功能予以阻止,所以这个弹窗阻止功能还比较初级,利用的是FF自己拦截请求的功能实现,所以会有这个副作用。
更完美的功能不是无法实现,但ABP本身核心必须做出改进。
Firefox More than meets your experience
toughstrong
火狐狸
火狐狸
  • UID16742
  • 注册日期2007-01-19
  • 最后登录2015-03-18
  • 发帖数100
  • 经验29枚
  • 威望0点
  • 贡献值12点
  • 好评度1点
  • 社区居民
  • 忠实会员
8楼#
发布于:2011-12-30 12:19
确实,在ABP中使用
!--- 以cba.com为主域名的所有页面,不得产生弹窗。
about:blank^$popup,domain=cba.com
这条规则很方便。
congxz6688
火狐狸
火狐狸
  • UID14676
  • 注册日期2006-09-23
  • 最后登录2017-03-06
  • 发帖数108
  • 经验12枚
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 社区居民
9楼#
发布于:2011-12-30 12:19
如果只是弹窗,这个脚本更好用:
// ==UserScript==
// @name            blockPopupWindow
// @description     阻止弹窗
// @include         http*
// @author          zbinlin
// @version         0.0.2 
// @run-at          document-start
// ==/UserScript==
 
document.addEventListener("beforescriptexecute", function (e) {
    document.removeEventListener("beforescriptexecute", arguments.callee, false);
    var win = window.wrappedJSObject;
    win.Fopen = win.open;
    win.open = function () {
	var args = Array.slice(arguments);
 	var domains = document.domain.split(".");
 	switch (domains.length){
		case 4:
			domaind=domains[domains.length-3]+"."+domains[domains.length-2]+"."+domains[domains.length-1];
		break;
		case 3:
			domaind=domains[domains.length-2]+"."+domains[domains.length-1];
		break;
		default:
			domaind=document.domain;
	}
	var result = args[0][0] == "\/" || args[0].match(/^(http(s)?:\/\/)?[^/]*/)[0].indexOf(domaind) != -1;
	if (result) {
		return win.Fopen.apply(this, args);
	}
	return null;
    };
}, false);
royallin
非常火狐
非常火狐
  • UID29014
  • 注册日期2009-05-31
  • 最后登录2016-12-07
  • 发帖数668
  • 经验46枚
  • 威望0点
  • 贡献值32点
  • 好评度0点
  • 社区居民
10楼#
发布于:2011-12-30 12:19
标题跟内容有出入,标题应该改成弹窗。。
现在还没有很好阻挡小窗口的办法。
白左
千年狐狸
千年狐狸
  • UID34985
  • 注册日期2010-12-29
  • 最后登录2023-11-13
  • 发帖数2039
  • 经验655枚
  • 威望0点
  • 贡献值364点
  • 好评度69点
  • 社区居民
  • 忠实会员
11楼#
发布于:2011-12-30 12:19
能挡所有<script>标签吗……
-いたんですか? -ええ、ずっと
游客

返回顶部