backbone.js 带有Jquery Click事件的Phonegap iOS

eqqqjvef  于 2022-11-10  发布在  jQuery
关注(0)|答案(1)|浏览(125)

我正在使用backbone来创建我所有的视图。我的一些视图是相当资源密集型的,需要一段时间才能加载到模板中。所以当点击某行时,我想首先显示一个加载覆盖,并在呈现视图时删除它。

$('.class').live('click', function(){
    $("#loading").fadeIn(); 
    // this changes the url and then the view is called.
});

但问题是,加载but只在视图呈现后出现。为什么会这样?这里的事件模式是什么?就像当你点击链接时,它会先加载url,然后只加载click回调中的内容,因为看起来是这样的。即使这样,它也会做同样的事情:

$('.content a').click(function () {
     var f = $(this);
     $("#loading").show();
     Backbone.history.navigate(f.attr("href"), true);
     return false;
 });
nlejzf6q

nlejzf6q1#

这是事件的可能顺序:
1.点击发生。
1.调用$("#loading").fadeIn();
1.您更改了URL,路由器即被激活。
1.视图即被激活并开始渲染。
1.视图完成渲染。
1.浏览器再次获得控制权,并开始清除工作积压,特别是,浏览器最终从1到达fadeIn
例如,看看像这样简单的东西会做什么:

$('button').click(function() {
    $('div').after('<p>Loading...</p>');
    for(var i = 0; i < 10000; ++i)
        $('div').text(i);
});​

演示:http://jsfiddle.net/ambiguous/sEvv5/
你可能需要根据你的电脑的速度来调整10000。
您需要做的是在打开#loading和开始渲染昂贵视图之间将控制权交还给浏览器。例如:

$('button').click(function() {
    $('div').after('<p>Loading...</p>');
    setTimeout(function() {
        for(var i = 0; i < 10000; ++i)
            $('div').text(i);
    }, 0);
});​

演示:http://jsfiddle.net/ambiguous/qd9Ly/
在您的情况下,请尝试将// this changes the url and then the view is called.部分放入setTimeout

相关问题