禁止广告加到Safari的Reading List

打开某些网站的时候,页面上的广告会添加一些链接到Safari的Reading List中,然后参考了这个知乎页面的代码,其实就是模拟鼠标点击,十分常见的广告弹出方式,不过问题来了!学挖掘机哪家强?

这些广告弹出的JS代码是针对Windows的,在Win下绝大多数浏览器里,对于按住Shift键+鼠标点击一个URL的处理,是在新窗口中打开。而OS X中,Safari对这一事件的处理则是添加到Reading List!

已经编译好的Safari扩展在这里

我个人认为,这个应该不是特意针对 Safari的Reading List设计的,但是它的确达到了一石二鸟的效果。

不管怎么说,先看看代码吧。
(以下代码片段来自刚才的知乎页面。)

a.hrefopen = function(a) {
    //容错代码, 不用管
    try{
        //下面三行代码是创建一个超链接, 指向一个URL: a.
        var c = document.createElement("a");
        c.setAttribute("href", a);
        c.setAttribute("style", "display:none;");
        //下面三行代码是模拟鼠标去点击上面创建的超链接
        var b = document.createEvent("MouseEvents");
        b.initMouseEvent("click", false, false, window, 0, 0, 0, 0, 0, false, false, true, false, 0, null);
        c.dispatchEvent(b);
        return true;
    //容错代码, 不用管
    }catch(q){return false;}
}

我们直接Hook掉鼠标事件吧,正常的网站都不太可能会模拟用户操作。

那么就是这一句,

var foo = document.createEvent("MouseEvents");

我们先把原函数保存下来,

var _createEvent = document.createEvent;

接着判断一下是不是创建的鼠标事件,如果是的话,就返回null;其他则调用原函数。

document.createEvent = function(s) {
    if(s =="MouseEvents"){
        console.log("This website tries to simulate mouse events!");
        return null;
    }
    else return _createEvent(s);
}

最后把这一段Hook的JS写成Safari扩展就行。

<!DOCTYPE html>
<script>
safari.application.addEventListener("activate", activateHandler, true);
function activateHandler(event){
    var _createEvent = document.createEvent;
    document.createEvent = function(s) {
        if(s == "MouseEvents"){
            console.log("This website tries to simulate mouse events!");
            return null;
        }
        else return _createEvent(s);
    }
}
</script>
 

One thought on “禁止广告加到Safari的Reading List”

  1. 谢谢提供方案. 另外一种情况是在地址栏输入搜索特定关键字的时候, 就会被强加reading list. 需要通过关闭Safari偏好中, Search里的Preload Top Hit in the background来解决. 我的案例是在默认google搜索时,输入ping就会被强加.

Leave a Reply

Your email address will not be published. Required fields are marked *

8 − 4 =