[英]Show a div during function call jquery
我想在checkCoupon
触发时显示 #LoadingDiv,并在它完成时让它消失,以显示 function 正在进行中。 checkCoupon由单击按钮触发(未显示)。
我尝试了多种方法,包括创建另一个 function 以包含在onclick
事件中,我将其放在 ajax 调用的不同部分,并尝试以不同方式更改 CSS。 它仍然无法正常工作。
知道如何获得此功能并在通话开始时正确显示吗?
function checkCoupon() { var coupon = document.getElementById('couponCode').value; var coupon_v = false; $('#LoadingDiv').css('display', 'block'); $.ajax({ type: 'post', url: 'coupon.php', async: false, data: { 'coupon': coupon }, success: function(data) { if (data;= "empty") { coupon_v = data; } } }) }
<div id="LoadingDiv" style="display:none;">One Moment Please...<br /> <img src="images/progressbar.gif" class="displayed" alt="" /> </div>
您可以隐藏 ajax complete
函数上的 div,该函数在请求完成时调用(在执行成功或错误回调之后):
complete: function(){
$('#LoadingDiv').hide();
}
您可以使用 jQuery 的beforeSend
和complete
方法来处理调用前后的状态:
function checkCoupon() { var coupon = document.querySelector('#couponCode').value; var coupon_v = false; let $loading = $('#LoadingDiv'); $.ajax({ type: 'post', url: '.', //coupon.php async: false, data: { 'coupon': coupon }, beforeSend: function() { $loading.removeClass('hide') }, success: function(data) { if (data != "empty") { coupon_v = data; } }, complete: function() { // timeout only used for demo effect window.setTimeout(function() { $loading.addClass('hide') }, 1500) } }) }
.hide { display: none; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <div id="LoadingDiv" class="hide">One Moment Please...<br /> <img src="images/progressbar.gif" class="displayed" alt="" /> </div> <input type="hidden" id="couponCode" value="3" /> <button onclick="checkCoupon()">Click</button>
我遇到过同样的问题。 我知道现在这是一个较老的问题,但显然仍然与我遇到同样的难题有关。
我会调用showLoadingOverlay()
方法,这将使加载 div 可见,然后运行我想运行的 function,然后隐藏加载叠加层,但叠加层永远不会显示。 我终于发现问题是我在显示加载覆盖后执行的 function 发生得太快,它会暂停显示覆盖的过程直到它完成,然后覆盖上的隐藏 function 被调用得太快当显示方法能够恢复时。 这就是为什么看起来什么都没有发生的原因。
因此,您需要延迟您尝试调用的 function(我使用了setTimeout()
方法)。 setTimeout()
方法中的 400 是在执行processFunction
方法之前将延迟 400 毫秒。 这是实现目标的通用方法:
Javascript:
/******************************************************************************************
* Toggle loading overlay.
* ***************************************************************************************/
/**
* Toggle the loading overlay in order to prevent the user from performing any actions.
* The processFunction must call the endLoadOverlay method once it is finished.
* @param {any} processFunction The process to perform while the loading screen is active.
* This method must call the endLoadOverlay method once it is done.
*/
function startLoadOverlay(processFunction) {
$('#overlay').css('display', '');
setTimeout(processFunction, 400);
}
/**
* Ends the loading overlay.
* */
function endLoadOverlay() {
$('#overlay').css('display', 'none');
}
/******************************************************************************************
* End of toggle loading overlay.
* ***************************************************************************************/
然后,当您调用 startLoadOverlay() 方法时,将您想要完成的方法传递给它。 在我的示例中,我有一个按钮单击事件调用覆盖方法:
HTML:
<button id="btnDoAction" type="button" onclick="startLoadOverlay(myFunctionToAccomplish);">Accomplish Something</button>
请记住, myFunctionToAccomplish()
是我希望在叠加层可见时执行的方法。 注意:传递给 startLoadOverlay() 方法的方法必须在完成处理后调用endLoadOverlay()
方法,以便隐藏加载覆盖。 所以:
Javascript
function myFunctionToAccomplish() {
// Perform functionality.
//TODO: Add whatever functionality here.
// Once I'm done I need to call the endLoadOverlay() method in order to hide the loading overlay.
endLoadOverlay();
}
如果您对我的$('#overlay')
元素感到好奇。 思路基本出自这里: https://www.w3schools.com/howto/howto_css_overlay.asp
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.