2012-11-20 30 views
0

請幫我解決加載異步腳本時檢測到的問題。其實我在我的網站上有一個異步加載的實時聊天按鈕,這個小部件的腳本被混淆了。在腳本加載後,我需要在聊天按鈕上設置一個eventlistener。在聊天按鈕出現之前觸發Window.onload觸發器。請指教。耦合異步腳本

代碼:

_shcp = []; 
_shcp.push({ 
    widget_id: xxxxxx, 
    widget: "Chat", 
    side: "left", 
    position: "center", 
    template: "orange", 
    title: "Live help", 
    text_layout: "trans", 
    track: 1 
}); 
(function() { 
    var hcc = document.createElement("script"); 
    hcc.type = "text/javascript"; 
    hcc.async = true; 
    hcc.src = ("https:" == document.location.protocol ? "https" : "http") + "://widget.siteheart.com/apps/js/sh.js"; 
    var s = document.getElementsByTagName("script")[0]; 
    s.parentNode.insertBefore(hcc, s.nextSibling); 
})(); 
+0

向我們展示加載聊天按鈕的html/javascript代碼。 – Lee

+0

你可以在聊天腳本的底部添加一行,在你的客戶端代碼中調用一些函數嗎? – tjameson

+0

回答

0

最好的辦法是,如果你的聊天按鈕具有可以附加一個回調它加載時的API。這是大多數其他庫如谷歌地圖,YUI和jQuery如何處理元素的動態加載。

但如果沒有,你的下一個最好的辦法是輪詢元素的存在:

setTimeout(function checkChatButton(){ 
    var button = document.getElementById(chat_button_id); 
    if (button) { 
     /* Button is loaded! 
     * 
     * Do what you need to do here 
     */ 
    } 
    else { 
     setTimeout(checkChatButton,500); 
    } 
},500); 
+0

謝謝!正確運作。 –

0

內的底塊,腳本加載塊,監聽器添加到腳本。

hcc.onload = function() { 
    var button = document.getElementById("the_button"); 
    button.onclick = function() { doStuff(); }; 
}; 

設置.onload之前的文件被添加到DOM。
安全的方法是將它放在您爲AJAX調用或圖像加載(在設置src之前)設置偵聽器的地方。
如果你在意記住它,腳本實際上並沒有開始加載,直到你將它們添加到頁面中,而圖像在你設置.src時加載 - 在設置源代碼之前設置你的聽衆,每次都阻止你必須記住這一點。

有更好的,更多的DOM-3.0方法來做到這一點,但這很好,很簡單。

如果您需要支持IE7或更少,你要聽的.onreadystatechange代替:

hcc.onreadystatechange = function() { 
    if (hcc.readyState === "loaded" || hcc.readyState === "complete") { 
     var button = document.getElementById("the_button"); 
     button.onclick = function() { doStuff(); }; 
    } 
} 

這是一個有點醜得把他們兩個一起在頁面上,但它是一個死簡單修復知道您的腳本何時加載並完成運行。

+0

我在底部塊的'hcc.src = ...'之前添加了'hcc.onload = function()',它附帶:'無法設置'null'屬性'onclick'。它執行得太早。 –

+0

好的,如果你的腳本使另一個腳本的同步呼叫,你唯一真正的選擇是設置一個計時器和希望。這是一種醜陋的做法,但它會起作用 - 如果你在那裏加載的腳本完成了所有的工作,那麼回調方法應該起作用。很高興你得到它運行。 – Norguard