Код JavaScript в UpdatePanel

Хорошо: у меня есть UpdatePanel на aspx странице, которая содержит единственного Заполнителя.

В этом заполнителе я добавляю один из выбора usercontrols в зависимости от определенных внешних условий (это - страница конфигурации).

В каждом из этих usercontrols существует bindUcEvents () функция JavaScript, которая связывает различный jQuery и события JavaScript к кнопкам и блокам проверки допустимости в usercontrol.

Проблема, которую я имею, - то, что JavaScript usercontrol не распознается. Обычно, JavaScript в updatepanel выполняется, когда updatepanel отправляет назад, однако ни один из этого кода не может быть найден страницей (я попытался выполнить функцию вручную через консоль поджигателя, но это говорит мне, что не может найти функцию).

У кого-либо есть какие-либо предложения?

С наилучшими пожеланиями, Ed.

Править:

сокращенный (но функциональный) пример:

Разметка:

<script src="/js/jquery-1.3.2.min.js"></script>
  <form id="form1" runat="server">
    <div>

    <asp:ScriptManager ID="Script" runat="server" />

    <asp:Button ID="Postback" runat="server" Text="Populate" OnClick="PopulatePlaceholder" />

    <asp:UpdatePanel ID="UpdateMe" runat="server">
    <Triggers>
        <asp:AsyncPostBackTrigger ControlID="Postback" EventName="Click" />
    </Triggers>
        <ContentTemplate>
            <asp:Literal ID="Code" runat="server" />
            <asp:PlaceHolder ID="PlaceMe" runat="server" />
        </ContentTemplate>
    </asp:UpdatePanel>
    </div>
 </form>

C#:

protected void PopulatePlaceholder(object sender, EventArgs e)
{
    Button button = new Button();
    button.ID = "Push";
    button.Text = "push";
    button.OnClientClick = "javascript:return false;";
    Code.Text = "<script type=\"text/javascript\"> function bindEvents() { $('#" + button.ClientID + "').click(function() { alert('hello'); }); }  bindEvents(); </script>";
    PlaceMe.Controls.Add(button);
}

Вы будете видеть, что кнопка не делает poput аварийное сообщение, даже при том, что код присутствует на странице.

EDIT2:

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

<%= Control.ClientID %>

биты кода это будет очень трудно к фактору прочь в неопределенные функции и бессмысленно, поскольку они каждый только используются в одном месте (мы говорим очень определенная проверка и нечетный триггер popout + некоторая логика).

5
задан Ed James 24 May 2010 в 14:22
поделиться

5 ответов

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

window.document.getElementById('someId').innerHtml = "<script type=\"text/javascript\">alert('hey');</script>";

, что не работает. Попробуйте следующее:

protected void PopulatePlaceholder(object sender, EventArgs e)
{
    Button button = new Button();
    button.ID = "Push";

    button.Text = "push";
    button.OnClientClick = "return false;";


    string script = "function bindEvents() { $('#" + button.ClientID + "').click(function() { alert('hello'); }); }  bindEvents();";

  ScriptManager.RegisterClientScriptBlock(this.Page, typeof(SomeClass), Guid.NewGuid().ToString(), script, true);


  PlaceMe.Controls.Add(button);
} 

Параметры RegisterClientScriptBlock, возможно, придется изменить, но вы поняли идею.

8
ответ дан 18 December 2019 в 11:54
поделиться

Чтобы повторно запустить некоторые js после запуска панели обновления, я всегда использовал это

Sys.WebForms.PageRequestManager.getInstance().add_endRequest(
    function(sender, args) {
        //update whatever here
    });

Также, если у вас есть какие-либо ссылки на элементы в панели обновления, вы можете обновить эти переменные внутри эта функция также, иначе у вас будут старые ссылки, которые не будут работать.

5
ответ дан 18 December 2019 в 11:54
поделиться

Почему-то кажется, что ваш Code.Text где-то теряется при переводе - не знаю конкретики, возможно, это сделано намеренно; в любом случае следующее работает:

    protected void PopulatePlaceholder(object sender, EventArgs e)
    {
        Button button = new Button();
        button.ID = "Push";
        button.Text = "push";
        button.OnClientClick = "javascript:return false;";
//        Code.Text = 
        PlaceMe.Controls.Add(button);
        PlaceMe.Controls.Add(new LiteralControl("<script type=\"text/javascript\"> function bindEvents() { $('#" + button.ClientID + "').click(function() { alert('hello'); }); }  bindEvents(); </script>"));
    }

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

-1
ответ дан 18 December 2019 в 11:54
поделиться

Добавьте диспетчер сценариев (расширения Ajax) на свою страницу и добавьте ссылки на сценарии внутри этого диспетчера. Менеджер будет загружать каждый тег скрипта при загрузке страницы на основе ajax (а не только при начальной загрузке) - переместите весь необходимый код javascript внутри панели обновления, и все готово.

    <asp:ScriptManager ID="ScriptManager1" runat="server">
        <Scripts>
            <asp:ScriptReference Path="../lib/jquery-1.2.6.pack.js" />

Недостаточно хорошо прочитал вопрос (и без образца). Смотрите мой новый ответ.

3
ответ дан 18 December 2019 в 11:54
поделиться

Возможно, вы ищете это: http://api.jquery.com/live/

Практически совместим с .bind () (исключения указаны в приведенной выше ссылке) - но также привязывается к добавленным элементам / позже изменилось.

Или, может быть, попробуйте также .delegate () - не может напрямую заменить вызовы .bind (), но в большинстве случаев работает намного быстрее.

0
ответ дан 18 December 2019 в 11:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: