Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

UpdatePanel и JavaScript

62K
24 августа 2010 года
Orion70
5 / / 24.08.2010
Народ, помогите. Ситуация такая:

Есть страница с UpdatePanel. На ней 2 UserControl-а со своими UpdatePanel и клиентскими функциями JavaScript.

В одном из контролов кнопка - по ней одному контролу делается Visible - false, другому true и UpdatePanel.Update() основной страницы.

Все работает хорошо, но после Update() функции JavaScript того контрола, который был изначально спрятан не видны. Как быть?
К функциям обращаюсь например так: onClick="func();"
62K
25 августа 2010 года
Orion70
5 / / 24.08.2010
не ужели никто не знает?

немного упрощу задачу:

Есть страница с UpdatePanel. На ней UserControl, в нем JavaScript.
Первоначально UserControl.Visible = false.

По кнопке на странице контролу делается:
UserControl.Visible = true;
UpdatePanel.Update();

Скрытый контрол показывается, но функции JavaScript в нем не работают.
Что посоветуете?
279
27 августа 2010 года
bave
456 / / 07.03.2004
По какому событию должен отработать JavaScript в UserControl-е? - по идее выполнение скрипта должно быть завязано на события PageRequestManager-а, например:

Код:
Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(pageLoadedHandler);

// функция будет отрабатывать всегда, даже при событиях от AJAX-овских контролов:
function pageLoadedHandler(sender, args) {

      // ну,а тут получаешь список обновленных панелей (это массивов div-ов панелей
      // вернется просто, соответственно с ID-шниками UpdatePanel-ов...)
      varr updated_panels = args.get_panelsUpdated();

      // ну далее если в массиве по Id-шнику найдешь нужную апдейт панел значит она обновилась,
      // тогда и запускай свой скрипт...
}
62K
31 августа 2010 года
Orion70
5 / / 24.08.2010
событие - например нажатие на кнопку, которая находится в этой апдейт панели.
Не понял решения: Есть обработчик события. В нем я должен определить, что панель у меня обновилась. Допустим определил. Как мне запускать скрипт?

Например, в панели есть следующий код:
<updatepanel>
<script>
function myFunc() { alert(1);}
</script>
...
<asp:Button id="btnMy" runat="server" onClientClick="myFunc()">
...
</updatepanel>

как заставить его работать?
279
02 сентября 2010 года
bave
456 / / 07.03.2004
Цитата:
Есть обработчик события. В нем я должен определить, что панель у меня обновилась. Допустим определил. Как мне запускать скрипт?



Обычно - вызвать его как функцию.

Код:
function pageLoadedHandler(sender, args) {
      var updated_panels = args.get_panelsUpdated();

       for (var i = 0; i < updated_panels.length; i++)
       {
              if(updated_panels.id == '<%=ваша_апдейт_панель.ClientID%>')
              {
                    // вот тут-то и вызывайте ваш скрипт...
                    myFunc();
              }
       }
}


Кстате этот метод чтобы скрипт отработал после обновления панели! - если будет несколько кнопок, которые обновляют одну и туже панель и при этом обработчики разные, то такой метод уже не покатит...

странно, что не работает OnClientClick...
2.2K
02 сентября 2010 года
REFOT
181 / / 08.04.2005
Если скрипт размещённый в <asp:UpdatePanel> выводится при динамическом обновлении страницы, то он работать не будет.

Это можно проверить так:

Код:
<asp:ScriptManager ID="ScriptManager1" runat="server" />

<asp:UpdatePanel ID="up1" visible="true" runat="server">
    <ContentTemplate>
        <asp:UpdatePanel id="up2" visible="true" runat="server">
            <ContentTemplate>
           
                <asp:Button Text="Кнопка 1"  runat="server"/>
                <script type="text/javascript">
                    alert("Скрипт 1");
                </script>
           
            </ContentTemplate>
        </asp:UpdatePanel>
        <asp:UpdatePanel id="up3"  visible="false"  runat="server">
            <ContentTemplate>
       
                <asp:Button Text="Кнопка 2" runat="server"/>
                <script type="text/javascript">
                    alert("Скрипт 2");
                </script>
       
            </ContentTemplate>
        </asp:UpdatePanel>
    </ContentTemplate>
</asp:UpdatePanel>

</asp:Content>

<script runat="server">
    protected void Page_Load(object sender, EventArgs e)
    {
        if (IsPostBack)
        {
            if (up2.Visible == true)
            {
                up2.Visible = false;
                up3.Visible = true;            
            }
            else
            {  
                up2.Visible = true;
                up3.Visible = false;
            }
        }
    }
</script>


Чтобы скрипт заработал его можно вывести через ScriptManager.RegisterClientScriptBlock:

Код:
<asp:ScriptManager ID="ScriptManager1" runat="server" />

<asp:UpdatePanel ID="up1" visible="true" runat="server">
    <ContentTemplate>
        <asp:UpdatePanel id="up2" visible="true" runat="server">
            <ContentTemplate>
           
                <asp:Button Text="Кнопка 1"  runat="server"/>
                <script type="text/javascript">
                    alert("Скрипт 1");
                </script>
           
            </ContentTemplate>
        </asp:UpdatePanel>
        <asp:UpdatePanel id="up3"  visible="false"  runat="server">

            <ContentTemplate>
                <asp:Button Text="Кнопка 2" runat="server"/>
            </ContentTemplate>

        </asp:UpdatePanel>
    </ContentTemplate>
</asp:UpdatePanel>

</asp:Content>

<script runat="server">
    protected void Page_Load(object sender, EventArgs e)
    {
        if (IsPostBack)
        {
            if (up2.Visible == true)
            {
                up2.Visible = false;
                up3.Visible = true;    
                ScriptManager.RegisterClientScriptBlock(this,this.GetType(),"msg1", "alert('Скрипт 2');", true);
            }
            else
            {
                up2.Visible = true;
                up3.Visible = false;
            }
        }
    }
</script>
62K
06 сентября 2010 года
Orion70
5 / / 24.08.2010
Цитата: bave

 
Код:
// вот тут-то и вызывайте ваш скрипт...
                    myFunc();



объект myFunc не найден

62K
06 сентября 2010 года
Orion70
5 / / 24.08.2010
To Refot:
Получается нужно 2 раза писать одно и тоже: alert Скрипт 2 написан в коде 2 раза. А если это большая функция?
66K
13 декабря 2010 года
ocelot
2 / / 13.12.2010
Если ваш контрол использует детерменированные скрипты (т.е. они не собираются динамически в контроле из его параметров), то я бы посоветовал их вобще вынести во внешний файл (который подгружался бы при помощи RegisterClientScriptInclude) или внутренний ресурс (см. RegisterClientScriptResource). Обычно методы регистрации вызываются в Page_Load контрола, но боюсь если контрол невидим (Visible = false), то дальше OnInit жизненный цикл не пойдет (но, тут я могу и ошибаться, но PreRender-а точно не будет).
Можно вынести процедуры регистрации в статичный метод контрола, который можно будет вызвать как в самом контроле, так и в каком-нибудь методе жизненного цикла вашей страницы (например, OnLoad), что бы скрипты точно попали на страницу.
Если вы правильно укажите параметры в процедуре регистрации скрипт не будут дважды инклудиться если ваш контрол изначально будет виден.

Наверное немного путанное объяснение, но если коротко: ваша проблема скорее всего заключается в том, что либо вы скрипты описываете в разметке контрола (т.е. они попадают в ContentTemplate панели), и тогда они просто не будут работать (в силу принципов работы UpdatePanel) либо вы их регистрируте на поздних этапах жизненного цикла, а в силу невидимости котрола его цикл не полный.
279
14 февраля 2011 года
bave
456 / / 07.03.2004
Прикольно, тема раз в квартал up-ится :)

Цитата:
объект myFunc не найден



так вместо myFunc() подставте свою функцию (myFunc() я чисто для примера влепил, показать где нужно ваш код вызвать)

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог