2012-07-05 70 views
0

我正在使用闪存保存方法的jquery webcam plugin。我想在用户点击保存后设置一条消息,以便他们知道它正在保存。我的代码是这样的:jQuery - 防止进一步的代码执行,直到显示html后

$('#savepicmessage').html("Saving picture, please wait"); 
webcam.capture(); 
webcam.save('/savephoto.php'); 

问题是只有在保存图片后才显示“保存图片”消息。有没有办法阻止执行.html(“保存图片,请稍候”)调用后的代码,以便在消息显示之前不会执行该代码?

我可以用setTimeout实现它,并捕获并保存从那里调用的函数,但这不够可靠。

我看着.when和deferred.then,但似乎没有工作。

+0

我必须承认在这一个完全神秘化。 .html()不是一个动画调用,不应该被定时器启动。通过此代码的单个线程在调用这两个函数之前应完全完成对DOM的更改。这个问题在多个浏览器中是否一致?此外,如果您使用Firebug或其等价物在webcam.capture()处设置断点,HTML是否会在此时更新? – 2012-07-05 20:33:59

+0

它发生在Firefox,铁和IE(也许别人,这就是我所尝试的)。如果我在firebug中设置了一个断点,那么在脚本被断点停止之前HTML会显示更新。 – 2012-07-05 21:06:32

回答

0

一般来说,我使用promise和诸如$ .when()的东西来协调异步事件,如AJAX调用或动画。但事实上,这种行为几乎就像它是异步的,这对我来说太神奇了。

但是,我有一个建议。你可以在第一次调用之后循环使用$('#savepicmessage')。html()来设置它并测试返回的内容吗?也许一旦返回的值与您尝试设置的值相匹配,那么您可能会遇到网络摄像头功能,并且在调用网络摄像头之前用户将看到您的消息。

+0

这不是理想的解决方案,但我认为这是最好的解决方法。谢谢! – 2012-08-28 20:05:20

0

根据你的插件的文档,你会结构的插件像这样的装载:

$("#camera").webcam({ 
    width: 320, 
    height: 240, 
    mode: "callback", 
    swffile: "/download/jscam_canvas_only.swf", 
    onTick: function() {}, 
    onSave: function() { 

     $('#savepicmessage').html("Saving picture, please wait"); 

    }, 
    onCapture: function() {}, 
    debug: function() {}, 
    onLoad: function() {} 
}); 

以前没有使用这个插件,所以不知道你会做这onSave,onTick,onCaptureonLoad,但如果你显示你的初始化代码,会更有帮助。

+0

我没有使用回调方法,我使用保存方法,所以它不像这样构造。这个问题不是特定于网络摄像头插件,它是一个更通用的jquery问题,关于如何阻止下一件事发生,直到.html完成它的工作。 – 2012-07-05 20:50:51

+0

我没有看到'.html()'有一个回调的目的,因为它发生得太快了。下一个最好的事情,如果不是插件使用'setTimeout()' – 2012-07-05 21:27:47