0

我有来自 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 is not a function - 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 没有执行!怎么会这样?

基本上我尝试了 2 个解决方案——它们都应该在 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 is not a function

第二种解决方案

<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>

仍然存在相同的错误。

请给我一些关于如何解决问题的见解。

4

2 回答 2

1

您可以创建 jQuery 的别名并在脚本中使用。下面的示例代码我取自jquery 官网。希望这能解决您的问题。

var j = jQuery.noConflict();

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

// Do something with another library's $()
$( "content" ).style.display = "none";
于 2014-07-17T13:24:23.077 回答
0

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

(开始个人意见)我不建议简单地将 jQuery 分配给另一个短别名。每个人都想使用的这些 JavaScript 别名就像非常短的、糟糕的变量名。大多数开发人员建议在大多数情况下避免使用像“x”和“y”这样的变量名,尤其是当变量的作用域非常大的时候。对 jQuery 使用 '$' 或 'j' 会使您的源代码更短,但这真的那么重要。在生产中使用之前,只需通过最小化程序运行代码。(结束个人意见)

于 2014-11-23T01:02:42.453 回答