2013-07-25 44 views
1

我有一个模式框,我用Jquery打开。当关闭按钮被调用时,模式框被关闭。一切工作正常,但更多的我打开和关闭模式对话框,它需要对模式对话框的时间越长,收:JQuery的动画播放速度较慢每个调用

window.closeModal = function() { 
    modal = $("div.modal-overlay"); 
    windowHeight = $(window).height(); 
    // Until here performance is good 
    modal.animate({top: windowHeight, }, 800, function() { 
     // This is the problem 
     modal.hide(); 
     $("body").css("overflow-y", "scroll"); 
    }); 
} 

我已经把控制台日志的每一行,并立即执行的一切,直到我打modal.animate函数。每次我打开一个模式,然后按下关闭按钮,它需要更多时间,直到modal.animate开始执行。

任何人都可以请一些光。

@EDIT: 我创建了一个显示问题的jsfiddle。

只要按开模态,然后关闭模态。执行此4-5次看到延迟做大

http://jsfiddle.net/CZ54C/

@@编辑:很奇怪的东西发生。

虽然openModal的一次,iframe.load执行#倍模式的开启和关闭...

window.openModal = function (url) { 
    console.log("open start"); 
    modal = $("div.modal-overlay"); 
    modalIframe = $("div.modal-overlay iframe"); 
    windowHeight = $(window).height(); 
    modal.css("bottom", "0"); 
    modalIframe.attr("src", url + "?frame=true"); 
    modalIframe.load(function() { 
     console.log("open load") 
     modalIframe.css('height', windowHeight); 
     modal.show().animate({ 
      top: 0, 
     }, 800, function() { 
      $("body").css("overflow-y", "hidden"); 
     }); 
    }); 
} 
+0

尝试减少持续时间(800〜400)来完成动画快一点.. – web2008

+0

笑@ web2008 - 它需要更长的时间,每次他可以。它不只是太慢! – Archer

+0

@阿彻,正好。这并不是说动画会被堆叠起来,因为在新动画被触发后动画会很长时间。 – Nealv

回答

0

我想我解决了这个问题,执行

看来,通过改变iframe url,“负载处理程序再次连接”。所以每次“负荷运行的时间,它是连接我用这个代码解决它?

modalIframe.one('load',function() {}); 

//Instad of 
modalIframe.load(function() {}); 

这是很好的做法

+0

这对你不起作用,因为'one'函数在调用一次后会移除该句柄。这意味着在您首次单击“打开模式”链接后,处理程序将不会被调用。查看我的答案以获得更好的解决方案 – cfs

+0

它确实工作,虽然 – Nealv

+0

似乎并不适合我;尝试打开,关闭,然后在此示例中使用'one'再次打开模式:http://jsfiddle.net/CZ54C/3/ – cfs

0

的问题是,你正在连接新load处理程序每次打开模态对话框时都会弹出modalIframe,所以如果你第二次点击“打开模式”,加载回调将被执行两次,在下一次点击时会执行三次,依此类推。

解决此问题的最佳方法是将负载事件处理程序移出openModal函数i n要在那里你附上你的点击处理相同的块:

Working Demo

$(function() { 
    var modal = $("div.modal-overlay"), 
     modalIframe = modal.find('iframe'); 

    $("a.open").click(function (e) { 
     e.preventDefault(); 
     var href = $(this).attr("href"); 
     openModal(href); 
    }); 

    $("a.close").click(function (e) { 
     e.preventDefault(); 
     closeModal(); 
    }); 

    //put load handler here 
    modalIframe.load(function() { 
     var windowHeight = $(window).height(); 

     modalIframe.css('height', windowHeight); 
     modal.show().animate({ 
      top: 0, 
     }, 800, function() { 
      $("body").css("overflow-y", "hidden"); 
     }); 
    }); 
}); 

window.openModal = function (url) { 
    $("div.modal-overlay iframe").attr("src", url + "?frame=true"); 
} 

window.closeModal = function() { 
    modal = $("div.modal-overlay"); 
    windowHeight = $(window).height(); 
    modal.animate({ 
     top: windowHeight, 
    }, 800, function() { 
     modal.hide(); 
     $("body").css("overflow-y", "scroll"); 
    }); 
} 
+0

问题是,在我的代码中,负载处理程序allready在页面加载时执行。所以没有点击一个链接,模态被打开。 – Nealv

+0

你是否正在通过调用'openModal'来做到这一点?如果是这样,只要你在加载了'load'处理程序之后调用它就不会有什么区别(即在你的jQuery就绪回调中) – cfs