Регистрация JavaScript при асинхронной обратной передаче

У меня есть кнопка asp.net, обернутая внутри UpdatePanel, и при нажатии она выполняет асинхронную обратную передачу и регистрирует некоторый javascript, который показывает диалог jquery.

protected void btnAddData(object sender, EventArgs e) {
    StringBuilder jqueryDialog = new StringBuilder();
    jqueryDialog.Append("$(document).ready(function() {");
    jqueryDialog.Append("RefreshData();");
    jqueryDialog.Append("$('#divData').dialog({ modal: false, draggable: true, title: 'Historical Data', width: 700 });");
    jqueryDialog.Append("});");

    ScriptManager sm = ScriptManager.GetCurrent(this);
    if (sm != null && sm.IsInAsyncPostBack) {
        ScriptManager.RegisterClientScriptBlock(
            this, typeof(Page), Guid.NewGuid().ToString(),
            jqueryDialog.ToString(), true);
    }
}

Как вы можете видеть, javascript сначала вызывает функцию с именем RefreshData(), которая существует в моей разметке как javascript.

<script type="text/javascript" language="javascript">
    if ($) {
        $(document).ready(function () {
            function RefreshData() {
                alert("Data Refreshed!");
            }
        });
    }
</script>

Однако Firefox выдает ошибку, которая говорит, что RefreshData не определен. Означает ли это, что любой JavaScript, который я регистрирую при асинхронной обратной передаче, не сможет использовать функции JavaScript, которые я определил в моей разметке?

Спасибо за помощь.

1 ответ

Решение

Не определяйте RefreshData функция внутри функции document.ready, которая является анонимным обратным вызовом. Определите его снаружи, чтобы он был доступен снаружи:

<script type="text/javascript">
    if (typeof($) != 'undefined') {
        function RefreshData() {
            alert("Data Refreshed!");
        }
    }
</script>

Также вам, вероятно, не нужно оборачивать документ. Уже на вашей стороне сервера есть:

StringBuilder jqueryDialog = new StringBuilder();
jqueryDialog.Append("RefreshData();");
jqueryDialog.Append("$('#divData').dialog({ modal: false, draggable: true, title: 'Historical Data', width: 700 });");
Другие вопросы по тегам