Как условно зарегистрировать window.setInterval во время загрузки

#jquery #asp.net #pageload #registerstartupscript

#jquery #asp.net #загрузка страницы #registerstartupscript

Вопрос:

У меня есть следующий jquery, который регистрирует интервал таймера, который выполняется каждые 10 секунд на веб-странице всякий раз, когда нажимается кнопка ввода под названием btnExport.

 if ($) {
    $(document).ready(function () {
        $("input[id$='btnExport']").click(function ($e) {
            // javascript timer function
            window.setInterval(ExportProgressCheck, 10000);
        });

        function ExportProgressCheck() {
            $.ajax({
                type: "POST",
                url: "DMZ_Export.aspx/GetExportProgress",
                contentType: "application/json; charset=utf-8",
                data: "",
                dataType: "json",
                success: AjaxSuccess,
                error: AjaxFailed
            });
        }
    });
}
  

Однако в определенных сценариях мне нужно, чтобы интервал таймера начинал отсчитываться сразу после загрузки самой страницы. Моя проблема в том, что я не уверен, как это сделать из события загрузки страницы в codebehind. Теоретически это выглядело бы примерно так…

 protected void Page_Load(object sender, EventArgs e) {
    if (!Page.IsPostBack) {
        if (IsExportInProgress()) {
            // Register the timer interval now!! How do I do this??
            // window.setInterval(ExportProgressCheck, 10000);
            }
        }
    }
}
  

Я пытался выполнить это, зарегистрировав скрипт запуска, но ему не нравится скрипт, потому что он не знает, что такое ExportProgressCheck…

 ClientScriptManager cs = Page.ClientScript;
cs.RegisterStartupScript(cstype, csname1,
    "<script type="text/javascript">window.setInterval(ExportProgressCheck, 10000);</script>",
    false);
  

Любая помощь по этому вопросу была бы очень признательна! Спасибо!

Комментарии:

1. Вы прикрепили его к document.ready, означает onDomReady. Вы можете попробовать подключиться к window.load, но я не вижу проблемы.

Ответ №1:

Вы создаете свой код внутри $(document).ready() , т.е. этот код будет выполняться, как только dom будет загружен (страница загружена).

Вам нужно просто вызвать функцию setInterval() извне click при определенных условиях:

 if ($) {
    $(document).ready(function () {

        if(condition)
            window.setInterval(ExportProgressCheck, 10000);

        $("input[id$='btnExport']").click(function ($e) {
            // javascript timer function
            window.setInterval(ExportProgressCheck, 10000);
        });

        function ExportProgressCheck() {
            $.ajax({
                type: "POST",
                ...
  

Комментарии:

1. Однако я не могу определить, выполняется ли условие из файла .js. Я определяю, выполняется ли условие во время события Page_Load.

2. разве вы не можете использовать скрытый ввод и поместить туда условие во время Page_Load , чтобы затем извлечь его с помощью javascript ?

3. У меня была похожая идея, но я надеялся на более простой ответ. Хотя, судя по всему, именно это я и собираюсь в конечном итоге сделать. Спасибо за помощь.

Ответ №2:

вы на правильном пути.

некоторые моменты

  1. вам не нужно добавлять теги <script ..> при вызове RegisterStartupScript, просто укажите true в качестве последнего параметра.

  2. похоже, что ваш ExportProgressCheck еще не определен, когда появляется строка window.setInterval. Вы можете убедиться в этом, просто взглянув на свой исходный код, чтобы увидеть, где определена функция и где на нее ссылается ваш вызов присваивания. Возможные причины: может быть сбой неправильно сформированного js. доступна ли эта функция после загрузки вашей страницы? можете ли вы открыть окно javascript и вызвать его?

  3. Только что заметил, что $(document).готовая строка … да. это будет выполняться после того, как будет проанализирован весь элемент BODY. вам нужно удалить определение функции ExportProgressCheck из этого предложения ready. таким образом, он доступен для ваших сценариев запуска

регистрация сценария запуска должна поместить ваш вызов в нижнюю часть сегмента. все ваши скрипты должны быть загружены с помощью than. изучите исходный код, чтобы определить, что не в порядке

Ответ №3:

Выполнил это, выбрав другой маршрут. Я использую функцию $ get от jQuery, чтобы перейти на другую страницу aspx, чтобы получить значение условия.

 if ($) {
    $(document).ready(function () {

        $.get("ExportInProgCheck.aspx", function (response) {
            if (response != '')
                window.setInterval(ExportProgressCheck, 10000);
        });
    });
}
  

ExportInProgCheck.aspx просто возвращает ‘true’, если условие выполнено, и в этот момент window.setInterval устанавливается.