2016-03-17 86 views
3

我使用的是第三方腳本(DTM的Adobe,標記管理的目的是有用的)我的網頁上,並導致以下問題:避免第三方腳本的window.location.reload()

我注意到我的頁面在第一次被完全加載(在下一次加載時,它不再發生)時被重新加載,責備在這個函數上,出現在由DTM標籤加載的一個腳本中我的HTML。

function Ne(Oe, Gc, nc, Ic) { 
     if (Oe.targetJSLoaded) { 
      return; 
     } 
     Ic.setCookie(Gc, true, nc); 
     window.location.reload(); //in the first page load, this line is always executed 
    } 

很難弄清楚腳本發生了什麼,一旦它有超過5000行並且被混淆了。

我需要防止window.location.reload()被執行,但我有以下問題:

  1. 一旦第三方加載腳本(script標籤指向它在加載了一堆其他腳本的URL頁面加載),我無法手動編輯它。
  2. 我不能讓用戶通過F5手動重新加載頁面。

我試着用下面的jQuery代碼的東西,但它不工作:

$(window).bind("beforeunload",function(e){ 
     e.preventDefault(); 
}); 

有沒有一種形式,以防止程序上的重載,考慮所描述的情況呢?

回答

1

的關鍵是Oe.targetJSLoaded。找出Oe是。嘗試從Ne函數開始繼續調用堆棧。

例如,從港貨運的代碼與你相似:

TNT.a.ge = function (he, ie, Tb, nc, Ub) { 
    if (!ie.targetJSLoaded) { 
     Ub.setCookie(Tb, true, nc); 
     he.location.reload(); 
    } 
}; 

在你的功能和港口貨運的功能,我們希望targetJSLoadedtrue

環顧四周,我們發現TNT.a.geTNT.a.je,這是由一個匿名函數調用像所謂:

TNT.a.je(window, document, b, H, Ub); 

TNT.a.je,我們推斷,ie.targetJSLoadedwindow._AT.targetJSLoaded

定義屬性來覆蓋window._AT.targetJSLoadedtrue

function overrideTargetJsLoaded(_AT) { 
    Object.defineProperty(_AT, "targetJSLoaded", { 
     value: true, 
     enumerable: true, 
     configurable: true 
    }); 
    return _AT; 
} 

function override_AT() { 
    let _AT = overrideTargetJsLoaded({}); 
    Object.defineProperty(window, "_AT", { 
     get: function get_AT() { 
      return _AT; 
     }, 
     set: function set_AT(object) { 
      _AT = overrideTargetJsLoaded(object); 
     }, 
     enumerable: true, 
     configurable: true 
    }); 
} 

現在,你需要重寫targetJSLoaded在執行任何其他腳本之前,所以你把這個腳本,它調用override_AT功能,其他一切網頁上的腳本。

2

不幸的是,您唯一的解決方案是修改腳本,然後替換DTM標籤,使其指向您自己的版本(可能在過程中將其破壞),或者停止使用Adobe DTM。任何需要重新加載頁面的跟蹤都不是很好設計。

+0

謝謝@shelvacu,我會記住這一點! –

0

只要您不需要以編程方式在其他地方重新加載頁面,您可以嘗試覆蓋該功能。

window.location.reload = function(){}

+0

謝謝傑克!一個問題:這會導致表單提交出現問題嗎? –

+0

我不這麼認爲,除非你的提交回調調用了location.reload()。 – Jake

+0

我試過了,面臨另一個問題。動態加載的腳本正在我的自定義js之前加載。換句話說,當我重載'window.location.reload'時,頁面已經被重載。該死的! –