簡體   English   中英

后續腳本加載是否可以刪除早期腳本中已經加載的函數?

[英]Is it possible for a subsequent script load to remove an already-loaded function in an earlier script?

在內容非常相似的兩個頁面之間,我有一個令人費解的區別。 兩個頁面都加載相同的腳本集:

<script type="text/javascript" src="scripts/modernizr.min.js"></script>
<script type="text/javascript" src="scripts/jquery.min.js?v=1.8.3"></script>
<script type="text/javascript" src="scripts/jquery.colorbox.min.js"></script>
<script type="text/javascript" src="scripts/jquery.tools.min.js"></script>
<script type="text/javascript" src="scripts/URI.js"></script>

然后他們有這個$(document).ready()

    $(document).ready(function () {
        $(".profileImage").tooltip({
            position: 'top right',
            relative: true,
            offset: [50, 0]
        }).dynamic();
    });

在一頁上,這可以正常工作。 在另一頁上,事件觸發后,我會得到以下信息:

未捕獲的TypeError:$(...)。tooltip不是函數

在有效的頁面上,我已經能夠確定(通過暫停並進入) .tooltip()jquery.tools.min.js一部分

編輯/更新3 (刪除了1和2,因為它們可能會誤導人)

這兩個頁面都來自應用程序的不同部分,該部分實現了類似於在線論壇的內容

在一切正常的頁面上,僅是來自論壇用戶的消息以及他們的頭像。 在無效的頁面上,該頁面還包含以javascript和html5編寫的統計數據/圖形繪制設備

我注意到,通過在每一頁的相同點暫停document.ready在調試器,該網頁上的作品,jQuery是1.8.3版本,並全部由jQuery的工具方法可用於通話

在不起作用的頁面上,jQuery版本為1.9.1

我的推測是,包括統計信息/條形圖繪制設備在內的頁面早先已用jquery1.9.1 + NO_TOOLS完全替換了頁面中早先加載的jquery1.8.3 + jquery-tools庫,因此選擇器仍然有效(jquery的工作)但.tooltip()函數(jquery-tools作業)現在不存在

我不是很確定該怎么做-擁有自己的jquery設置的頁面,然后在頁面上包含還使用並加載jquery(不同版本)等的其他東西的正常解決方案是什么?

jQuery.fn.tooltip = nulljQuery.fn.tooltip = undefined ,甚至delete jQuery.fn.tooltip將刪除以下演示中已降級的功能:

 <!DOCTYPE html> <html lang="en"> <head> <title>Reduxtagram</title> </head> <body> <h1>messages</h1> <div id="messages-placeholder"></div> <h1>Errors</h1> <div id="errors-placeholder"></div> <script> function html(id, inner){ var el = document.getElementById(id); el.innerHTML += inner + " ------------------- "; } function logError(error){ html("errors-placeholder", error); } function logMsg(msg){ html("messages-placeholder", msg); } var myNamespace= {}; myNamespace.myFunctionToNull = function(){ logMsg("myFunctionToNull was called"); }; myNamespace.myFunctionToUndefined = function(){ logMsg("myFunctionToUndefined was called"); }; myNamespace.myFunctionToDelete = function(){ logMsg("myFunctionToDelete was called"); }; myNamespace.myFunctionToNull(); myNamespace.myFunctionToUndefined(); myNamespace.myFunctionToDelete(); myNamespace.myFunctionToNull = null; myNamespace.myFunctionToUndefined = undefined; delete myNamespace.myFunctionToDelete; try{ myNamespace.myFunctionToNull(); } catch(e) { logError(e); } try{ myNamespace.myFunctionToUndefined(); } catch(e) { logError(e); } try{ myNamespace.myFunctionToDelete(); } catch(e) { logError(e); } </script> </body> </html> 

您應該找到腳本的哪一部分刪除了tooltip功能並進行了更正。

您也可以嘗試對腳本重新排序,例如,將<script type="text/javascript" src="scripts/jquery.tools.min.js"></script>放在最后一個位置。

如果重新加載jQuery ,它將替換$別名和jQuery名稱空間,因此jQuery.fn.tooltip將不再存在。

您應該嘗試在重新加載jQuery 1.9.1之后重新加載jQuery.toolbox

您可以這樣動態地執行此操作( https://stackoverflow.com/a/950146/2776550 ):

function loadScript(url, callback)
{
    // Adding the script tag to the head as suggested before
    var head = document.getElementsByTagName('head')[0];
    var script = document.createElement('script');
    script.type = 'text/javascript';
    script.src = url;

    // Then bind the event to the callback function.
    // There are several events for cross browser compatibility.
    script.onreadystatechange = callback;
    script.onload = callback;

    // Fire the loading
    head.appendChild(script);
}

var myPrettyCode = function() {

   // Here, do what ever you want
};

loadScript("my_lovely_script.js", myPrettyCode);

盡管如此,您應該努力在應用程序中只有一個副本和jQuery版本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM