2014-02-20 55 views
0

症狀

如果我在根目錄中有jQuery jir文件在子目錄中說jQuery是未定義的。從另一個目錄加載jQuery

如果我在子目錄中有jQuery - 根目錄中的js文件說jQuery是未定義的。

如果我在兩個地方都有相同的jQuery庫 - 一切正常。

可能的解決方案

假設我將jQuery保留在子目錄中。比我想我必須「通知」jQuery路徑的根目錄中的js文件。這裏有一個根目錄的js文件:

/** 
* select a different prefix for underscore 
*/ 
$u = _.noConflict(); 

/** 
* make the code below compatible with browsers without 
* an installed firebug like debugger 
if (!window.console || !console.firebug) { 
    var names = ["log", "debug", "info", "warn", "error", "assert", "dir", 
    "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace", 
    "profile", "profileEnd"]; 
    window.console = {}; 
    for (var i = 0; i < names.length; ++i) 
    window.console[names[i]] = function() {}; 
} 
*/ 

/** 
* small helper function to urldecode strings 
*/ 
jQuery.urldecode = function(x) { 
    return decodeURIComponent(x).replace(/\+/g, ' '); 
}; 

/** 
* small helper function to urlencode strings 
*/ 
jQuery.urlencode = encodeURIComponent; 

/** 
* This function returns the parsed url parameters of the 
* current request. Multiple values per key are supported, 
* it will always return arrays of strings for the value parts. 
*/ 
jQuery.getQueryParameters = function(s) { 
    if (typeof s == 'undefined') 
    s = document.location.search; 
    var parts = s.substr(s.indexOf('?') + 1).split('&'); 
    var result = {}; 
    for (var i = 0; i < parts.length; i++) { 
    var tmp = parts[i].split('=', 2); 
    var key = jQuery.urldecode(tmp[0]); 
    var value = jQuery.urldecode(tmp[1]); 
    if (key in result) 
     result[key].push(value); 
    else 
     result[key] = [value]; 
    } 
    return result; 
}; 

/** 
* highlight a given string on a jquery object by wrapping it in 
* span elements with the given class name. 
*/ 
jQuery.fn.highlightText = function(text, className) { 
    function highlight(node) { 
    if (node.nodeType == 3) { 
     var val = node.nodeValue; 
     var pos = val.toLowerCase().indexOf(text); 
     if (pos >= 0 && !jQuery(node.parentNode).hasClass(className)) { 
     var span = document.createElement("span"); 
     span.className = className; 
     span.appendChild(document.createTextNode(val.substr(pos, text.length))); 
     node.parentNode.insertBefore(span, node.parentNode.insertBefore(
      document.createTextNode(val.substr(pos + text.length)), 
      node.nextSibling)); 
     node.nodeValue = val.substr(0, pos); 
     } 
    } 
    else if (!jQuery(node).is("button, select, textarea")) { 
     jQuery.each(node.childNodes, function() { 
     highlight(this); 
     }); 
    } 
    } 
    return this.each(function() { 
    highlight(this); 
    }); 
}; 

/** 
* Small JavaScript module for the documentation. 
*/ 
var Documentation = { 

    init : function() { 
    this.fixFirefoxAnchorBug(); 
    this.highlightSearchWords(); 
    this.initIndexTable(); 
    }, 

    /** 
    * i18n support 
    */ 
    TRANSLATIONS : {}, 
    PLURAL_EXPR : function(n) { return n == 1 ? 0 : 1; }, 
    LOCALE : 'unknown', 

    // gettext and ngettext don't access this so that the functions 
    // can safely bound to a different name (_ = Documentation.gettext) 
    gettext : function(string) { 
    var translated = Documentation.TRANSLATIONS[string]; 
    if (typeof translated == 'undefined') 
     return string; 
    return (typeof translated == 'string') ? translated : translated[0]; 
    }, 

    ngettext : function(singular, plural, n) { 
    var translated = Documentation.TRANSLATIONS[singular]; 
    if (typeof translated == 'undefined') 
     return (n == 1) ? singular : plural; 
    return translated[Documentation.PLURALEXPR(n)]; 
    }, 

    addTranslations : function(catalog) { 
    for (var key in catalog.messages) 
     this.TRANSLATIONS[key] = catalog.messages[key]; 
    this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')'); 
    this.LOCALE = catalog.locale; 
    }, 

    /** 
    * add context elements like header anchor links 
    */ 
    addContextElements : function() { 
    $('div[id] > :header:first').each(function() { 
     $('<a class="headerlink">\u00B6</a>'). 
     attr('href', '#' + this.id). 
     attr('title', _('Permalink to this headline')). 
     appendTo(this); 
    }); 
    $('dt[id]').each(function() { 
     $('<a class="headerlink">\u00B6</a>'). 
     attr('href', '#' + this.id). 
     attr('title', _('Permalink to this definition')). 
     appendTo(this); 
    }); 
    }, 

    /** 
    * workaround a firefox stupidity 
    */ 
    fixFirefoxAnchorBug : function() { 
    if (document.location.hash && $.browser.mozilla) 
     window.setTimeout(function() { 
     document.location.href += ''; 
     }, 10); 
    }, 

    /** 
    * highlight the search words provided in the url in the text 
    */ 
    highlightSearchWords : function() { 
    var params = $.getQueryParameters(); 
    var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : []; 
    if (terms.length) { 
     var body = $('div.body'); 
     window.setTimeout(function() { 
     $.each(terms, function() { 
      body.highlightText(this.toLowerCase(), 'highlighted'); 
     }); 
     }, 10); 
     $('<p class="highlight-link"><a href="javascript:Documentation.' + 
     'hideSearchWords()">' + _('Hide Search Matches') + '</a></p>') 
      .appendTo($('#searchbox')); 
    } 
    }, 

    /** 
    * init the domain index toggle buttons 
    */ 
    initIndexTable : function() { 
    var togglers = $('img.toggler').click(function() { 
     var src = $(this).attr('src'); 
     var idnum = $(this).attr('id').substr(7); 
     $('tr.cg-' + idnum).toggle(); 
     if (src.substr(-9) == 'minus.png') 
     $(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); 
     else 
     $(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); 
    }).css('display', ''); 
    if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) { 
     togglers.click(); 
    } 
    }, 

    /** 
    * helper function to hide the search marks again 
    */ 
    hideSearchWords : function() { 
    $('#searchbox .highlight-link').fadeOut(300); 
    $('span.highlighted').removeClass('highlighted'); 
    }, 

    /** 
    * make the url absolute 
    */ 
    makeURL : function(relativeURL) { 
    return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL; 
    }, 

    /** 
    * get the current relative url 
    */ 
    getCurrentURL : function() { 
    var path = document.location.pathname; 
    var parts = path.split(/\//); 
    $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() { 
     if (this == '..') 
     parts.pop(); 
    }); 
    var url = parts.join('/'); 
    return path.substring(url.lastIndexOf('/') + 1, path.length - 1); 
    } 
}; 

// quick alias for translations 
_ = Documentation.gettext; 

$(document).ready(function() { 
    Documentation.init(); 
}); 

這很奇怪:我在這個腳本中沒有看到任何路徑規範。但是 - 見的症狀...

編輯

這裏的JS腳本是如何加載

<!-- <script type="text/javascript" src="_static/jquery.js"></script> --> 
<script type="text/javascript" src="_static/js/jquery-1.9.1.min.js"></script> 
<script type="text/javascript" src="_static/js/jquery-fix.js"></script> 
<script type="text/javascript" src="_static/underscore.js"></script> 
<script type="text/javascript" src="_static/doctools.js"></script> 
<script type="text/javascript" src="_static/bootstrap-3.0.0/js/bootstrap.min.js"></script> 
<script type="text/javascript" src="_static/bootstrap-sphinx.js"></script> 

_static/jquery.js_static/js/jquery-1.9.1.min.js副本。當第一行被評論doctools.js抱怨,當第二行被評論 - jquery-fix.js抱怨。 jquery-fix.js是單行:

var $jqTheme = jQuery.noConflict(true); 

截圖

當第一行表示:

enter image description here

當第二行表示:

enter image description here

+1

當你在JS中包含腳本時,它們是全局的,除非你使用模塊加載器或將其全局空間污染恢復到原始狀態。我完全不理解你的問題。 –

+0

@BenjaminGruenbaum:我也沒有。但症狀是可重現的。 – Adobe

+0

請複製並顯示給我們。有很多網站可以用來做到這一點 - 最簡單的一個IMO是http://jsfiddle.net,確保包含最少量的代碼來重現問題。 –

回答

0

雷莫在jquery-fix.js.noConflict(true)解決了它。現在一切都如預期的那樣工作:沒有什麼取決於文件存儲的位置。

相關問題