阻止.load()(如果已加载)?

时间:2018-06-26 23:09:02

标签: javascript c# jquery asp.net-mvc

我在页面上有几个按钮。每个按钮均加载不同的部分“视图”,并使用jQuery .load()方法。

它很好用,但是我注意到,如果我继续单击该特定按钮,它将不断重复加载局部视图,直到停止为止。我相信我最终可能会使网站崩溃(不好!)。

我试图缓存它(通过装饰控制器的方法和持续时间等),但是它不起作用。我怀疑是因为我通过单击按钮加载此视图。

如何防止用户不知道的情况下重复加载此“视图”?

这是我的jQuery / Javascript:

//"Select Area" button - click event
    $(".btnAreaDiv .btn-myClass").click(function () {

        switch (this.id) {
            case "btnMyButton":
                    $('#myDiv').load('_MyPartialView'); //to-do: only load me, if I haven't been loaded?
                break;
            //more code etc., more button handling
        }
    }

这是_MyPartialView.cshtml的内容:

@{
    Layout = null;
}

<div class="row">
    <div class="col-md-6">
        <div class="row" style="width:97%">
            <div class="col-md-12" style="border:2px solid #c5c5c5"><span id="lblMySelector">My Selector</span></div>
        </div>
    </div>
    <div class="col-md-6"></div>
</div>

<div class="row nopadding checkboxDiv mySelector">
    <div class="col-md-12 nopadding">
        <input id="myCheckBox" type="checkbox" /><label for="myCheckBox">Include all/label> <br />
    </div>
</div>

当然还有我控制器中的ActionResult方法:

public ActionResult _MyPartialView()
{
    return View();
}

我已经尝试过了,但是没有用:

switch (this.id) {
    case "btnMyButton":
        if (!$('#lblMySelector').length) {

            console.log('label not found', $('#lblMySelector').length);

            $('#myDiv').load('_MyPartialView'); 

        }
        break;

3 个答案:

答案 0 :(得分:1)

假设您有一些与此类似的标记:

BrowserWindow

您正在执行以下操作:

main.js

如果您不希望这种情况发生多次,请使用off删除按钮中的click事件:

ipcMain.on('cves-loaded', (event, arg) => {
  cvesWindow.webContents.send('targetOS', osGuess);
})

您可以更改使用off功能的位置;我将其放置在回调中以在加载失败的情况下进行加载(仅调用回调才能获得成功的响应代码)。

答案 1 :(得分:1)

您可以在单击时禁用按钮,并在需要时(例如,加载数据时)再次启用。 您还可以在“单击的按钮”上设置.data来标记已单击的按钮,而无需再加载。

    $(".btnAreaDiv .btn-myClass").click(function () {
    switch (this.id) {
        case "btnMyButton":
                if ($(this).data('loaded') == undefined) {
                    $(this).data('loaded', 1);
                    $('#myDiv').load('_MyPartialView');
                }
            break;
        //more code etc., more button handling
    }
}

如果愿意,也可以使用.attr)

答案 2 :(得分:1)

要缓存数据,可以像在this答案中一样使用.clone()方法。 您可以针对所有可能的请求提出要求。

var cache = {};

,并在收到数据后将其存储到您的缓存var中​​:

var cacher = function(name) {
    return function(response) {
        cache[name] = response;
    }
};

$("#myDiv").load('_MyPartialView', cacher('_MyPartialView'));