打开某些网站的时候,页面上的广告会添加一些链接到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);
}
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>
<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>
谢谢提供方案. 另外一种情况是在地址栏输入搜索特定关键字的时候, 就会被强加reading list. 需要通过关闭Safari偏好中, Search里的Preload Top Hit in the background来解决. 我的案例是在默认google搜索时,输入ping就会被强加.