Garmin prototype.js与本地jquery文件冲突

时间:2014-07-17 13:01:08

标签: javascript jquery garmin

我有来自Garmin的prototype.js与我的jquery.frm.js冲突,如下面的代码片段所示。

<script src="/public/js/jquery-ui-1.8.16.custom.min.js"></script>
<script type="text/javascript" src="/public/js/jquery.frm.js"></script>
<script type="text/javascript" src="http://developer.garmin.com/web/communicator-api/prototype/prototype.js"></script>

它会抛出错误'Uncaught TypeError:undefined不是函数--jquery.frm.js 这是一小段jquery.frm.js代码(因为它太长了!)

var FRAMEWORK_PREFIX = "erpFrm";
(function( $ ){

$.frm = {
    priorityAccepted : new Array(0,1,2,3,4,5,6,7,8,9),
    initFunctions : new Array(),
    _isLoading : false,

    /*
     *   Pagination Variables
     */
    currentPage : 0,
    itemsPerPage: 100,
    paginationOffset: 3,
    /*
     * Use to define fast ffward
     */
    pace: 6,
    options: {},
    show: true,




    /**
     * Init function to run page is loaded
     * @returns {undefined}
     */
    init : function() {
        for(var i=0; i < this.initFunctions.length; i++) {
            this.initFunctions[i].callback();
        }
        return this;

    } ....
})( jQuery );

$(document).ready(function() {
    try {
        $.frm.init(); 
    } catch (e) {
        console.log(e.message);
        $.frm.showPopup(e.message);
    }

});

实际上document.ready没有执行!怎么会这样?

基本上我尝试了两个解决方案 - 它们都应该在jquery.frm.js中加载脚本和代码,这就是为什么我在函数内部调用脚本或在noConflict之后

第一个解决方案

<script>
    (function($) {
        $.getScript('/public/js/jquery.frm.js').done(function(script, textStatus) {
           console.log(textStatus);
        }).fail(function(jqxhr, settings, exception) {
           console.log(exception);
        });
    })(jQuery);
</script>

此代码仍将返回相同的错误 - undefined不是函数

第二个解决方案

<script>
    jQuery.noConflict();
    jQuery(document).ready(function($){
        $.getScript('/public/js/jquery.frm.js').done(function(script, textStatus) {
            console.log(textStatus);
        }).fail(function(jqxhr, settings, exception) {
            console.log(exception);
        });
    });
</script>

仍然存在同样的错误。

请告诉我一些如何解决问题的见解。

2 个答案:

答案 0 :(得分:1)

您可以创建jQuery的别名并在脚本中使用。下面的示例代码来自jquery official website。希望这可以解决你的问题。

var j = jQuery.noConflict();

// Do something with jQuery
j( "div p" ).hide();

// Do something with another library's $()
$( "content" ).style.display = "none";

答案 1 :(得分:0)

在脚本代码的顶部,使用jQuery.noConflict()释放$以供其他脚本使用,在本例中为prototype.js代码。有关详细信息,请参阅jQuery noConflict文档:http://api.jquery.com/jquery.noconflict/

(开始个人意见)我不建议简单地将jQuery分配给另一个短别名。每个人都想使用的这些JavaScript别名就像真正简短的变量名。大多数开发人员建议在大多数情况下避免使用变量名称,如'x'和'y',特别是如果变量具有非常大的范围。对jQuery使用'$'或'j'会缩短你的源代码,但这真的很重要。在生产中使用它之前,只需通过最小化器运行代码。 (最终个人意见)