瑞星卡卡最近讓我比較煩。
為了提醒淘寶買家在購買自動發貨商品時避免被騙,運營希望使用者在進入自動發貨商品購買頁時,必須先閱讀以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>
當然,最好的辦法是說服使用者取消對網站的廣告屏蔽,可是,何時才會有一個善良的互連網呢?