javascript - setTimeout 不适用于 onclick

标签 javascript jquery css

我有以下内容:

onclick="setTimeout(overlayDisplayButton, 3000)" 

它似乎不起作用,我正在开始学习 javascript/jquery,所以很可能我的做法有问题。

我最初尝试使用回调,以便在检索到结果时叠加层会消失,但我不完全理解它是如何工作的,所以同时想,有一个延迟来显示结果。

以下是我正在使用的脚本:

<script>
 $(document).ready(function(){

   $('#zip').on("input",function(){
       $('#city option[value=""]').prop('selected',true);

   })

    $('#city').on("change",function(){
       $('#zip').val("");
    })
})

function displayOverlay(text) {
    $("<table id='overlay'><tbody><tr><td>" + text + "</td></tr></tbody></table>").css({
        "position": "fixed",
        "top": "0px",
        "left": "0px",
        "width": "100%",
        "height": "100%",
        "background-color": "rgba(0,0,0,.6)",
        "z-index": "10000",
        "vertical-align": "middle",
        "text-align": "center",
        "color": "#fff",
        "font-size": "40px",
        "font-weight": "bold",
        "cursor": "wait",
        "overflow-y":"hidden"
    }).appendTo("body");
}

function removeOverlay() {
    $("#overlay").remove();
}

$(function overlayDisplayButton() {
    $(".btn").click(function () {
        if ($("#overlay").length > 0) {
            removeOverlay();
        } else {
            displayOverlay("Loading...");
        }
    });
});
</script>

下面是我正在使用的调用 setTimeout 的表单:

    <div class="panel panel-default">
    <div class="panel-body">
<!---   <div id="loader" style="position: fixed; top:0; left:0; width:100%; height: 100%; background: url('loader.gif') center center #efefef"></div><!--Progress bar--->
        <form name="providerSearch" ng-submit="SearchProvider(searchParam);" novalidate="" role="form">
            <div class="form-group"><input class="form-control" id="physiciansfirstname" ng-model="searchParam.FirstName" placeholder="First name:" type="text" /></div>

            <div class="form-group"><input class="form-control" id="physicianslastname" ng-model="searchParam.LastName" placeholder="Last name:" type="text" /></div>

            <div class="form-group"><select class="form-control" id="providerSpecialty" ng-model="searchParam.Specialty"><option disabled="disabled" selected="selected" value="">Specialty</option>
            <option value=""></option><option>Family practice</option><option>General practice</option><option>Internal medicine</option><option>Pediatrics</option> </select></div>

            <div class="form-group">
             <SELECT name="proCity" class="form-control" id="city" placeholder="City" ng-model="searchParam.City">
                       <option disabled="disabled" selected="selected" value="">City</option> 
                          <option value=""></option>
                          <cfoutput query="cityFind">
                           <option value=#city#>#city#</option>
                        </cfoutput> 
                      </select>

            <!---<select class="form-control" id="city" ng-model="searchParam.City"><option disabled="disabled" selected="selected" value="">City</option><option ng-repeat="c in Cities">{{c.City}}</option> </select>---->
            </div>

            <div class="row">
                <div class="col-xs-6 no-right-padding paddingLanguage">
                    <div class="form-group widthLanguage">


                    <select name="language" class="form-control" ng-model="searchParam.Language">
                        <option disabled="disabled" selected="selected" value="">Language</option>
                        <option value=""></option>
                     <cfoutput query="Languages">
                          <option value=#Language#>#Language#</option>
                        </cfoutput> 
                      </select>



                      <!---<select name="language" class="form-control widthLanguage" id="language" ng-model="searchParam.Language">
                        <option disabled="disabled" selected="selected" value="">Language</option>
                        <option ng-repeat="l in Languages">{{l.Lang}}</option>
                      </select>--->
                    </div>
                </div>

                <div class="col-xs-6 no-left-padding">
                    <div class="form-group"><select class="form-control" name="gender" ng-model="searchParam.Gender">
                    <option disabled="disabled" selected="selected" value="">Gender</option>
                    <option value=""></option>
                    <option>Male</option><option>Female</option> </select></div>
                </div>
            </div>

            <hr class="hrDoctor" />
            <div style="margin-top:-10px; margin-bottom:10px; text-align:center; font-size:8pt! important">* or Search by Zip code radius *</div>

            <div class="row">
                <div class="col-xs-7 no-right-padding">
                    <div class="form-group">
                        <div class="input-group"><select class="form-control" name="distance" ng-model="searchParam.distance"><option selected="selected">5</option><option selected="selected">10</option><option selected="selected">15</option><option selected="selected">20</option> </select>

                            <div class="input-group-addon">mi</div>
                        </div>
                    </div>
                </div>

                <div class="col-xs-5 no-left-padding widthZip">
                    <div class="form-group"><input allow-pattern="[\d\-]" class="form-control" id="zip" maxlength="5" ng-model="searchParam.Zip" placeholder="Zip code" type="text" data-default=""/></div>
                </div>
            </div>

            <div class="form-group"><input class="btn btn-warning btn-block ignore" ng-click="gotoElement('SearchResultsAnchor');" onclick="setTimeout(overlayDisplayButton(), 3000)" type="submit" value="Search" /></div>
            <!---<div class="form-group buttonWidth resetButton"><input class="btn btn-primary btn-block" type="reset" value="Reset"  onClick="window.location.reload()"/></div>--->
        </form>
    <!---</div><!---Progress bar--->--->
    </div>
</div>

所以我想如果我执行 onclick 并将其设置为等于 setTimeout(...),它将持续 3 秒然后让用户看到结果。

然而,事实并非如此,也没有看出问题所在。

最佳答案

您当前的 HTML 与您复制的不完全相同:

<... onclick="setTimeout(overlayDisplayButton(), 3000)" ...>

错误是您正在调用 overlayDisplayButton,而不是将其作为参数传递。

在 javascript 中,函数也是setTimeout 函数需要一个函数作为第一个参数,因此您应该像这样传递它:

<... onclick="setTimeout(overlayDisplayButton, 3000)" ...>

除此之外,@Mike C 指出的是正确的:overlayDisplayButton 只是向按钮添加事件处理程序。也许您想做的是:

function overlayDisplayButton() {
    if ($("#overlay").length > 0) {
        removeOverlay();
    } else {
        displayOverlay("Loading...");
    }
}

关于javascript - setTimeout 不适用于 onclick,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39047327/

相关文章:

javascript - 单击它时如何更新 JointJS 中链接的标签?

javascript - 哇 slider 和 fancybox(灯箱)不能一起工作

javascript - 原始输入的初始状态

javascript - AngularJS - 未选中单选按钮

jquery - Chrome 20.x 问题(bug?)通过 jQuery 定期应用/删除类

html - Bootstrap容器间距

CSS 文本对齐覆盖 xy

jquery - 扩展内容后如何为div设置最大高度?

javascript - 如何在变量jquery中保存最后一个 child

javascript - 如何从字符串中删除除第一个字符外的特殊字符集