Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(pageLoadedHandler);
// функция будет отрабатывать всегда, даже при событиях от AJAX-овских контролов:
function pageLoadedHandler(sender, args) {
// ну,а тут получаешь список обновленных панелей (это массивов div-ов панелей
// вернется просто, соответственно с ID-шниками UpdatePanel-ов...)
varr updated_panels = args.get_panelsUpdated();
// ну далее если в массиве по Id-шнику найдешь нужную апдейт панел значит она обновилась,
// тогда и запускай свой скрипт...
}
UpdatePanel и JavaScript
Есть страница с UpdatePanel. На ней 2 UserControl-а со своими UpdatePanel и клиентскими функциями JavaScript.
В одном из контролов кнопка - по ней одному контролу делается Visible - false, другому true и UpdatePanel.Update() основной страницы.
Все работает хорошо, но после Update() функции JavaScript того контрола, который был изначально спрятан не видны. Как быть?
К функциям обращаюсь например так: onClick="func();"
немного упрощу задачу:
Есть страница с UpdatePanel. На ней UserControl, в нем JavaScript.
Первоначально UserControl.Visible = false.
По кнопке на странице контролу делается:
UserControl.Visible = true;
UpdatePanel.Update();
Скрытый контрол показывается, но функции JavaScript в нем не работают.
Что посоветуете?
По какому событию должен отработать JavaScript в UserControl-е? - по идее выполнение скрипта должно быть завязано на события PageRequestManager-а, например:
Не понял решения: Есть обработчик события. В нем я должен определить, что панель у меня обновилась. Допустим определил. Как мне запускать скрипт?
Например, в панели есть следующий код:
<updatepanel>
<script>
function myFunc() { alert(1);}
</script>
...
<asp:Button id="btnMy" runat="server" onClientClick="myFunc()">
...
</updatepanel>
как заставить его работать?
Цитата:
Есть обработчик события. В нем я должен определить, что панель у меня обновилась. Допустим определил. Как мне запускать скрипт?
Обычно - вызвать его как функцию.
Код:
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();
}
}
}
var updated_panels = args.get_panelsUpdated();
for (var i = 0; i < updated_panels.length; i++)
{
if(updated_panels.id == '<%=ваша_апдейт_панель.ClientID%>')
{
// вот тут-то и вызывайте ваш скрипт...
myFunc();
}
}
}
Кстате этот метод чтобы скрипт отработал после обновления панели! - если будет несколько кнопок, которые обновляют одну и туже панель и при этом обработчики разные, то такой метод уже не покатит...
странно, что не работает OnClientClick...
Это можно проверить так:
Код:
<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>
<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>
<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>
Цитата: bave
Код:
// вот тут-то и вызывайте ваш скрипт...
myFunc();
myFunc();
объект myFunc не найден
Получается нужно 2 раза писать одно и тоже: alert Скрипт 2 написан в коде 2 раза. А если это большая функция?
Можно вынести процедуры регистрации в статичный метод контрола, который можно будет вызвать как в самом контроле, так и в каком-нибудь методе жизненного цикла вашей страницы (например, OnLoad), что бы скрипты точно попали на страницу.
Если вы правильно укажите параметры в процедуре регистрации скрипт не будут дважды инклудиться если ваш контрол изначально будет виден.
Наверное немного путанное объяснение, но если коротко: ваша проблема скорее всего заключается в том, что либо вы скрипты описываете в разметке контрола (т.е. они попадают в ContentTemplate панели), и тогда они просто не будут работать (в силу принципов работы UpdatePanel) либо вы их регистрируте на поздних этапах жизненного цикла, а в силу невидимости котрола его цикл не полный.
Цитата:
объект myFunc не найден
так вместо myFunc() подставте свою функцию (myFunc() я чисто для примера влепил, показать где нужно ваш код вызвать)