Как условно зарегистрировать window.setInterval при загрузке - PullRequest
0 голосов
/ 21 апреля 2011

У меня есть следующий 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
            });
        }
    });
}

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

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);

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

Ответы [ 3 ]

1 голос
/ 21 апреля 2011

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

Вам нужно просто вызвать 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",
                ...
0 голосов
/ 21 апреля 2011

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

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

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

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

0 голосов
/ 21 апреля 2011

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

некоторые баллы

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

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

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

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

...