Autor
|
Tema: Updatepanel y javascript (Leído 7,243 veces)
|
NetJava
Desconectado
Mensajes: 195
|
Buenas, tengo un problema con updatepanel y javascript. Explico un poco, tengo un updatepanel que en su interior tiene un panel que llama a una función javascript que se ocupa del diseño del scroll. El problema está en que cuando se actualiza el updatepanel que tiene en su interior un panel y dentro de este un Accordion, el scroll no se actualiza. El Accordion es dinámico, cambia según los datos de bd. Cuando se recarga la página por completo, no surge este problema, únicamente surge cuando se actualiza el updatepanel, que contiene el panel con la función javascript. <asp:UpdatePanel ID="UpdatePanel_room" runat="server" ChildrenAsTriggers="False" UpdateMode="Conditional" OnLoad="ms_room"> <ContentTemplate> <asp:Panel ID="pnl_room" runat="server" ScrollBars="Vertical" Width="150px" Height="330px" class="flexcroll"> <div class="lipsum"> <asp:Timer ID="timer_room" runat="server" OnTick="timer_room_Tick" Interval="10000" Enabled="true"></asp:Timer> <!---*****************--> <Ajax:Accordion ID="Accordion_room" runat="server" HeaderCssClass="Header" ContentCssClass="Contents" HeaderSelectedCssClass="SelectedHeader" Font-Names="Trebuchet MS" Font-Size="10" BorderColor="#000000" BorderStyle="Solid" BorderWidth="0" FramesPerSecond="100" FadeTransitions="true" TransitionDuration="500"> <Panes> </Panes> </Ajax:Accordion> <!---*****************--> </div> </asp:Panel> </ContentTemplate> </asp:UpdatePanel>
Si sacase del updatepanel el panel con el diseño del scrollo, este tampoco se actualizaría con el nuevo tamaño del Accordion :X Qué opináis?! Yo estoy un poco en el limite de la locura.
|
|
|
En línea
|
|
|
|
NetJava
Desconectado
Mensajes: 195
|
Bueno, pues estoy más o menos encaminado con el problema que tengo, pero no consigo ajustarme xD. Os comento, perimero url: http://parametheus.wordpress.com/2011/08/27/javascript-dentro-de-un-asp-net-ajax-updatepanel/
Código en Page_Load ScriptManager.RegisterStartupScript(Me, Page.GetType, "scriptkey1", "eval();", True)
La función de javascript esta en un archivo y se carga como ya conocéis todos: <script type='text/javascript' src="../scripts/script1.js"></script>
pues algo debe estar fallando o faltando, qué os parece?
|
|
|
En línea
|
|
|
|
NetJava
Desconectado
Mensajes: 195
|
Buenos, tras patearme todo google, todos los comentarios, toda la ayuda de microsoft, la solución para mi caso es la siguiente: http://stackoverflow.com/questions/802506/cant-get-scriptmanager-registerstartupscript-in-webcontrol-nested-in-updatepane?rq=1
Particularmente el cuarto comentario: ScriptManager.RegisterClientScriptBlock(UpdatePanel1, UpdatePanel1.GetType(), "UpdatePanel1_PreRender", _ "<script type='text/javascript' id='UpdatePanel1_PreRender'>" & _ "include('yourDynamic.js');" & _ "removeDuplicatedScript('UpdatePanel1_PreRender');</script>" _ , False)
// Include a javascript file inside another one. function include(filename) { var head = document.getElementsByTagName('head')[0];
var scripts = document.getElementsByTagName('script'); for(var x=0;x<scripts.length;> { if (scripts[x].getAttribute('src')) { if(scripts[x].getAttribute('src').indexOf(filename) != -1) { head.removeChild(scripts[x]); break; } } }
script = document.createElement('script'); script.src = filename; script.type = 'text/javascript'; head.appendChild(script) }
// Removes duplicated scripts. function removeDuplicatedScript(id) { var count = 0; var head = document.getElementsByTagName('head')[0];
var scripts = document.getElementsByTagName('script'); var firstScript; for(var x=0;x<scripts.length;> { if (scripts[x].getAttribute('id')) { if(scripts[x].getAttribute('id').indexOf(id) != -1) { if (count == 0) { firstScript = scripts[x]; count++; } else { head.removeChild(firstScript); firstScript = scripts[x]; count = 1; } } } } clearAjaxNetJunk(); } // Evoids the update panel auto generated scripts to grow to inifity. X-( function clearAjaxNetJunk() { var knowJunk = 'Sys.Application.add_init(function() {'; var count = 0; var head = document.getElementsByTagName('head')[0];
var scripts = document.getElementsByTagName('script'); var firstScript; for(var x=0;x<scripts.length;> { if (scripts[x].textContent) { if(scripts[x].textContent.indexOf(knowJunk) != -1) { if (count == 0) { firstScript = scripts[x]; count++; } else { head.removeChild(firstScript); firstScript = scripts[x]; count = 1; } } } } }
Un saludo a todos.
|
|
|
En línea
|
|
|
|
NetJava
Desconectado
Mensajes: 195
|
No me lo puedo creer! Ahora el updatepanel no actualiza los datos del accordion xD. Aunq el javascript si. Seguiré estudiandolo.
|
|
|
En línea
|
|
|
|
Novlucker
Ninja y
Colaborador
Desconectado
Mensajes: 10.683
Yo que tu lo pienso dos veces
|
C# ASPX<asp:Content ID="Content3" ContentPlaceHolderID="MainContent" runat="server"> <asp:Timer runat="server" ID="ajaxTimer" Interval="5000" Enabled="true" OnTick="ajaxTimer_Tick"></asp:Timer> <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional"> <ContentTemplate> <asp:Panel ID="mainPanel" runat="server"> <asp:Label ID="lblFecha" runat="server"></asp:Label> </asp:Panel> </ContentTemplate> </asp:UpdatePanel> </asp:Content>
Codebehindprotected void ajaxTimer_Tick(object sender, EventArgs e) { lblFecha.Text = DateTime.Now.ToString(); ScriptManager.RegisterStartupScript(UpdatePanel1, UpdatePanel1.GetType(), "afterupdate", "CallAlert();", true); }
javascript (Main.js)function CallAlert() { alert(new Date()); }
ASPX donde esta el scriptmanager, en mi caso está en la master<asp:ScriptReference Path="~/Scripts/Main.js" />
Listo! Saludos
|
|
|
En línea
|
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD "Hay dos cosas infinitas: el Universo y la estupidez humana. Y de la primera no estoy muy seguro." Albert Einstein
|
|
|
NetJava
Desconectado
Mensajes: 195
|
Buenas, he estado este fin de semana dandole al tema con tu ejemplo, muchas gracias, puedo garantizar que funciona, jajaja ningún problema con el C#. Sigue sin funcionar bien, creo que es por algún problema de base por haber dado ya tantas vueltas, voy a seguir a ver que es lo que pasa y luego lo pondré aquí, para no marearos más con este tema. El fallo soy yo xD.
Muchas gracias.
|
|
|
En línea
|
|
|
|
NetJava
Desconectado
Mensajes: 195
|
Es imposible xD. Os pongo el código. Código Aspx<asp:ScriptManager ID="ScriptManager1" runat="server"> <Scripts> <asp:ScriptReference Path="../scripts/flexcroll.js" /> </Scripts> </asp:ScriptManager>
ms_room -> Cargar el Accordion desde programación. <asp:UpdatePanel ID="UpdatePanel_room" runat="server" UpdateMode="Conditional" OnLoad="ms_room" > <ContentTemplate> <!-- flexcroll OnUnload="ms_room" OnLoad="ms_room" --> <asp:Timer ID="timer_room" runat="server" OnTick="timer_room_Tick" Interval="10000" Enabled="true"></asp:Timer> <asp:Panel ID="pnl_room" runat="server" ScrollBars="Vertical" Width="150px" Height="330px" class="flexcroll"> <div class="lipsum"> <!---*****************--> <Ajax:Accordion ID="Accordion_room" runat="server" HeaderCssClass="Header" ContentCssClass="Contents" HeaderSelectedCssClass="SelectedHeader" Font-Names="Trebuchet MS" Font-Size="10" BorderColor="#000000" BorderStyle="Solid" BorderWidth="0" FramesPerSecond="100" FadeTransitions="true" TransitionDuration="500" RequireOpenedPane="false"> <Panes> </Panes> </Ajax:Accordion> <!---*****************--> </div> </asp:Panel> </ContentTemplate> </asp:UpdatePanel>
Código vb:Public Sub timer_room_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles timer_room.Tick Label1.Text = DateTime.Now.ToLongTimeString() ScriptManager.RegisterStartupScript(UpdatePanel_room, UpdatePanel_room.GetType(), "afterupdate", "eval();", True) End Sub
Código javascript (flexcroll.js)eval( function (p, a, c, k, e, r) { e = function (c) { return (c < a ? '' : e(parseInt(c / a))) + ((c = c % a) > 35 ? String.fromCharCode(c + 29) : c.toString(36)) };
if (!''.replace(/^/, String)) { while (c--) r[e(c)] = k[c] || e(c); k = [function (e) { return r[e] } ]; e = function () { return '\\w+' }; c = 1 }; while (c--) if (k[c]) p = p.replace(new RegExp('\\b' + e(c) + '\\b', 'g'), k[c]); return p } ('D H={38:[],5O:C(){7... Simplifico código porque si no se hace muy incomodo de ver ...prototype'.split('|'), 0, {}) )
Si pongo el Timer fuera del Updatepanel, no hay problema, pero por que actualiza la página entera, claro en mi caso que no tiene el Conten. Sigue actualizando, pero el javascript no se ejecuta. Esto parece misión imposible... Qué opináis?!
|
|
|
En línea
|
|
|
|
NetJava
Desconectado
Mensajes: 195
|
Olvidaba comentar que class="flexcroll" y class = "lipsum" son para darle al Panel el diseño del scroll, que es por lo que me estoy matando. xD
|
|
|
En línea
|
|
|
|
NetJava
Desconectado
Mensajes: 195
|
Buenas, pues ya esta solucionado, comprobado, verificado. La respuesta de es correcta al 100%, para mi caso al menos, el problema de después estaba en como yo trataba el javascript de flexcroll. http://www.hesido.com/web.php?page=customscrollbarUn saludo y muchas gracias.
|
|
|
En línea
|
|
|
|
Novlucker
Ninja y
Colaborador
Desconectado
Mensajes: 10.683
Yo que tu lo pienso dos veces
|
Excelente!
|
|
|
En línea
|
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD "Hay dos cosas infinitas: el Universo y la estupidez humana. Y de la primera no estoy muy seguro." Albert Einstein
|
|
|
|
|