使用requirejs优化器加载jquery.mobile.iscrollview

时间:2013-01-30 17:19:01

标签: jquery jquery-mobile requirejs iscroll

我有一个使用jquery,jquery mobile和requireJS(2.0)的工作项目。现在我遇到了将jquery.mobile.iscrollview集成到requireJS世界的问题。

我的requirejs配置如下所示:

(function (require) {
    "use strict";
    require.config({
        paths:{
            'angular':'../external-libs/angular-1.0.3',
            'jquery':'../external-libs/jquery-1.7.2',
            'jquery.mobile':'../external-libs/jquery.mobile-1.2.0',
            'adapter': '../external-libs/jquery-mobile-angular-adapter-1.2.0',
            'moment': '../external-libs/moment-1.6.2.min',
            'iscroll': '../external-libs/iscroll',
            'iscrollview': '../external-libs/jquery.mobile.iscrollview'
        },
        shim:{
            'angular':{ deps:['jquery'], exports:'angular' },
            'iscroll':{ deps:['jquery'], exports:'iscroll' },
            'iscrollview':{ deps:['jquery.mobile', 'iscroll'], exports:'iscrollview' }
        }
    });

    require([
        "jquery",
        "jquery.mobile",
        "adapter",
        "moment",
        "iscroll",
        "iscrollview",
        "myApp"
    ], function () {
    //
    });
  }(require));

这很有效,只要requireJS优化器没有运行生产模式,只有一个大的JS文件应该提供给客户端。即使将优化器设置为不优化任何内容(优化:无),因此它只能将所有js文件合并在一起,但它无法正常工作。

加载网站时出现错误消息

  

未捕获的TypeError:无法读取属性'ignoreContentEnabled'的   未定义

它发生在文件“jquery.mobile.iscrollview.js”中,从代码中可以明显看出,在解析文件时$ .mobile对象尚未可用,因为只有在jquery准备好之后才会创建事件(我认为)。

知道怎么解决这个问题吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

现在通过将jquery.mobile.iscrollview转换为AMD模块来自行解决。像这样:

 define(function () {


    function iScrollView($) {
        //here comes the iscrollview code, but without event handler to pagecreate
    }

    jQuery(document).bind("pagecreate", function (e) {
        "use strict";
        iScrollView(jQuery); //this is doing the init stuff that normally happens
                             //when script is loaded, lines after this are the 
                             //original event handler

        var elements = jQuery(e.target).find(":jqmData(iscroll)");
        elements.iscrollview();
    });

    return iScrollView;

});

答案 1 :(得分:0)

这里的问题是加载与运行jQuery核心的时间。 (这就是为什么我个人更喜欢CurlJS。从来没有时间问题)

但是,如果配置系统的严格性让你失望,请掌握控制并明确声明命令:

require.config({
    paths:{
        'angular':'../external-libs/angular-1.0.3',
        'jquery':'../external-libs/jquery-1.7.2',
        'jquery.mobile':'../external-libs/jquery.mobile-1.2.0',
        'adapter': '../external-libs/jquery-mobile-angular-adapter-1.2.0',
        'moment': '../external-libs/moment-1.6.2.min',
        'iscroll': '../external-libs/iscroll',
        'iscrollview': '../external-libs/jquery.mobile.iscrollview'
    }
});

require(["jquery"], function($){
    require(["angular", "jquery.mobile"], function(angular){
        require(["adapter","iscroll"], function(){
            require(["myApp","moment","iscrollview"], function(myApp){
                // do something with
                myApp, $, angular
            })
        })
    })
})

我不知道'时刻'是的,所以把它放在最后,因为,根据你的垫片结构,它不依赖于任何东西。