后续脚本加载是否有可能删除早期脚本中已加载的函数?

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();
    });

在一页上,这工作正常。在另一页上,事件一发生,我就得到以下信息:

Uncaught TypeError: $(...).tooltip is not a function

在有效的页面上,我已经能够确定(通过暂停和进入).tooltip()jquery.tools.min.js

的一部分

Edit/Update3(删除了 1 和 2,因为它们可能具有误导性)

这两个页面都来自实现类似在线论坛的应用程序的不同部分

在一切正常的页面上,只有来自论坛用户的消息和他们的头像。在不起作用的页面上,该页面还包括一​​个用 javascript 和 html5

编写的 statistics/graph 绘图设备

我注意到,通过在调试器中每个页面的 document.ready 中的相同点暂停,在工作页面上,jQuery 是版本 1.8.3 和所有方法jquery-工具可调用

页面显示不对,jQuery版本为1.9.1

我的推测是,包括 statistics/bar 图形绘制设备已经完全替换了页面中较早加载的 jquery1.8.3+jquery-tools 库,jquery1.9.1+NO_TOOLS,因此选择器仍然有效(jquery 的工作)但 .tooltip() 功能(jquery-工具工作)现在的原因缺席

虽然我不太确定该怎么做 - 拥有一个具有自己的 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

您可以像这样动态地执行此操作 ():

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 的副本和版本。