瑞星卡卡最近让我比较烦。
为了提醒淘宝买家在购买自动发货商品时避免被骗,运营希望用户在进入自动发货商品购买页时,必须先阅读以LightBox形式弹出的防骗提示并点击确定按钮后方才进行购买。如图:
防骗提示层默认居中,如果买家在访问此页面时,改变浏览器窗口的大小,那么防骗提示层会重新计算位置以保持居中。可是安装了瑞星卡卡的IE用户改变浏览器窗口时,提示层的内容突然消失了,而半透明遮蔽层依然存在,因为买家必须点击了[确定]按钮,遮蔽层才会消失。这样一来买家就只能面对着灰蒙蒙的浏览器窗口手足无措。客服和运营马上就会有人来兴师问罪。
经过测试研究,瑞星卡卡果然是沿循事不过三的传统关卡原则。估计它的侦测原理就是——只要页面元素的top, left 样式属性变化了三次以上,就会被其认为是浮动广告继而歼之。
在自动发货商品的购买页上,我注册了window.onresize事件来进行防骗提示层的定位控制。 当买家改变浏览器窗口大小时,防骗提示层样式的top,left属性就会被多次计算并设定。 于是就中了瑞星卡卡的埋伏。提示层的内容就会被清除。[确定]按钮也就被清除了,买家无法点击[确定],遮蔽层不会消失,也就无法继续购买。
我的解决有二:
第一注册ESC键盘事件,即便提示内容被瑞星卡卡清除,只要买家按下ESC键时,会取消提示。遮蔽层也会消失。
显然这个方法于事无补。
第二就是编写额外的JavaScript检测浮动层的内容是否发生变化。瑞星卡卡会把其视为浮动广告层的innerHTML替换为:
<img s rc=”file:///C:/Program&20Files/Resing/AntiSpyware/Floating.gif” />
我的方法就是在每次定位浮动层后执行一个方法检测层内容中的某个元素是否还存在,如果不存在了,则说明内容被卡了。于是就执行补救的措施。伪码如下:
<id=”FloatLayer”>
<div id=”InnerObject”>xxx</div>
</div>
<script type=”text/javascript”>
function setPosition() {
FloatLayer.style.top = y;
FloatLayer.style.left = x;
setTimeout(checkKK, 100);
}
function checkKK() {
if ( ! InnerObject exists )
fixUp();
}
</script>
当然,最好的办法是说服用户取消对站点的广告屏蔽,可是,何时才会有一个善良的互联网呢?