Spustenie JavaScript Kódu   otázka

ASP.NET WebForms, JavaScript

Nazdar , pouzivam Web Control Library ktora je chat. Mám v nej kod :

btn.Attributes("OnClick") = _
        "DoChatCallBack(document.getElementById('" _
        & _txt.ClientID & "'));"

a ten sa vyvola ak niekto klikne na tlacitko btn.

Ja by som potreboval aby sa tento kod :

"DoChatCallBack(document.getElementById('" _
        & _txt.ClientID & "'));"

Vyvolal ked zavolam funkciu definovanu v kniznici a ta by odkazovala napriklad na Sub ktory by vyzeral takto :

Public Sub Submit
"DoChatCallBack(document.getElementById('" _
        & _txt.ClientID & "'));"
End Sub

Problem je v tom ze kod >>>"DoChatCallBack(document.getElementById('" _

& _txt.ClientID & "'));"<<< je znaceny ako chyba a neviem ako to mam spustit aby sa kod vykonal aj bez event-u ak sa klikne na tlacitko ?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Nepomôže, ak z toho kódu v metóde Submit odtraníte uvodzovky?

Public Sub Submit()
DoChatCallBack(document.getElementById(_txt.ClientID))
End Sub
nahlásit spamnahlásit spam 0 odpovědětodpovědět

Nie , nepomohlo. Pise ze DoChatCallBack nieje deklarovaný.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Kde je DoChatCallBack definované a aký kód vlastne obsahuje?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

A neviete ako simulovať kliknutie na to tlacitko ? to by na 100% pomohlo ale nenasiel som nic take :/

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Možno pomôže RaiseEvent názovButtonu.Click

nahlásit spamnahlásit spam 0 odpovědětodpovědět

RaiseEvent btn.Click nepomaha lebo je EVent nastaveny cez Attributes a aplikacia hadze chybu ze btn nieje event projektu .

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ide o <input type="button"/> alebo asp:button ? Kde je definovaný ? Ak je to v stránke, tak ho skúste nájsť v kolekcii Controls(tá je definovaná ako vlastnosť stránky .aspx), vytiahnúť z kolekcie do premennej a RaiseEvent premenná.Click

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Je definovaný vo Web Control Library :-) . A tá je ako component na stránke .aspx :-)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

No tak som skúšal to a zistil som, že aj keď button vytiahnem do premennej tak ono si to myslí že b je event a nie to čo si má myslieť(že b.Click je event).Potom bude asi jednoduchšie zavolať to čo je uvedené ako event. Keď je to DoChatCallback definované v serverovom kóde, tak stačí upraviť modifikátor prístupu a pod. a zverejniť tú metódu z ktorej chcete to DoChatCallback vykonať, ak je DoChatCallback definované v javascripte, tak buď dať do stránky javascript, ktorý DoChatCallback zavolá alebo keď môžete, tak udalosť, pri ktorej ste chcel vyvolať umelý stisk tlačidla odchytiť už v prehliadači(eventom javascriptu). Aký je kód toho DoChatCallback a kde je definované ? A ešte by pomohol kód v ktorom ste chcel vyvolať tú udalosť a hlavne to, že kde ten kód je.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Celé je to vo Web Control Library. Aby som vám nevypisoval zbytocne celý kód tu je link toho projektu (vrátane tutorialu a na konci stránky je tlacitko na stiahnutie projektu) : http://steveorr.net/articles/WebChat.asp...

Budem am velmi vdacny za pomoc , lebo sa to pokusam spojazdnit vela sposobmi a kazdym sa niekam dalej len zamotám. AJ som sa pohol dopredu ale ten sposob je dost hlupy a este som ho nedostal do fazy aby to fungovalo :-)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

No tak pri takto rozmernom projekte by ste asi mal uprednostniť to zbytočné vypisovanie kódu, ono sa lepšie hľadá chyba/riešenie keď zverejníte iba časti s tým súvisiace. Je sice pekné, že ste zverejnil kompletný kód, ale je ho toľko, že nedokážem identifikovať to miesto, kde chcete event vyvolať a ani nevidím to DoChatCallback. Ak chcete aby som Vám pomohol, tak prosím napíšte ešte raz do VBCode ten kód, a iba tie časti, ktoré s Vaším problémom priamo súvisia.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

OK , toto su hlavne dva Sub-y v ktorych sa nastavuju Eventy , vytvaraju komponenty a podobne :

'''Protected Overrides Sub RenderContents(ByVal output As HtmlTextWriter)'''

        'create the containing table
        Dim tbl As Table = New Table
        tbl.Height = Me.Height
        tbl.Width = Me.Width
        tbl.ToolTip = Me.ToolTip
        tbl.Style.Add("overflow", "scroll")
        tbl.Style.Add("position", "absolute")
        Dim td As TableCell = New TableCell
        td.ColumnSpan = 2
        td.Height = New Unit(95, UnitType.Percentage)
        Dim tr As TableRow = New TableRow
        tr.Cells.Add(td)
        tbl.Rows.Add(tr)

        'create the message display panel
        _pnl.Width = New Unit(99, UnitType.Percentage)
        _pnl.Height = New Unit(100, UnitType.Percentage)
        _pnl.BorderStyle = WebControls.BorderStyle.Solid
        _pnl.BorderWidth = New Unit(1, UnitType.Pixel)
        _pnl.Style.Add(HtmlTextWriterStyle.Overflow, "scroll")
        td.Controls.Add(_pnl)

        'create a new table row for textbox & button
        tr = New TableRow
        tbl.Rows.Add(tr)
        td = New TableCell
        td.Width = New Unit(95, UnitType.Percentage)
        tr.Cells.Add(td)

        'create the button 
        Dim btn As Button = New Button
        btn.ID = Me.ID & "_button"
        btn.UseSubmitBehavior = False
        btn.Text = "Send"

        'create the textbox
        _txt.Width = New Unit(99, UnitType.Percentage)
        _txt.BorderColor = Drawing.Color.Black
        _txt.BorderWidth = New Unit(1, UnitType.Pixel)
        _txt.Attributes("autocomplete") = "off"
        _txt.Attributes("onkeydown") = _
          "if ((event.keyCode == 13)) {document.getElementById('" _
          & btn.ClientID & _
          "').click();return false;} else return true;"
        _txt.Attributes("onkeypress") = "if (event.keyCode==124 || event.keyCode==126) event.keyCode=0;" 'prevent reserved (delimiter) characters from being entered
        td.Controls.Add(_txt)

        'create the final table cell
        td = New TableCell
        td.Controls.Add(btn)
        tr.Cells.Add(td)

        'Attach button's client event to the JavaScript functions
        btn.Attributes("OnClick") = _
          "DoChatCallBack(document.getElementById('" _
          & _txt.ClientID & "'));"

        tbl.RenderControl(output)
    End Sub

    Private Sub WebChat_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        _pnl.ID = Me.ID & "_chatpanel"
        _txt.ID = Me.ID & "_chattextbox"

        If Me.Visible Then
            'Retrieve the JavaScript functions 
            'that will recieve the result
            Dim sCallBack As String = _
                My.Resources.Callback.Replace("WebChat1", Me.ID)
            If Me.CallBackInterval <> 2 Then
                sCallBack = sCallBack.Replace("2000", _
                  (Me.CallBackInterval * 1000).ToString())
            End If
            Page.ClientScript.RegisterClientScriptBlock(Me.GetType, _
                "CalledBack", sCallBack, True)

            'Now generate the function that initiates 
            'the client side callback
            Dim sb As New StringBuilder()
            sb.Append(System.Environment.NewLine)
            sb.Append("function DoChatCallBack(txt)")
            sb.Append(System.Environment.NewLine)
            sb.Append("{")
            sb.Append("var msg = ''; if (txt != null) msg=txt.value; ")
            sb.Append(System.Environment.NewLine)
            sb.Append(Page.ClientScript.GetCallbackEventReference(Me, _
                "WebChatMaxMsgID + '||' + msg", _
                "CalledBack", "ErrCalledBack"))
            sb.Append(";")
            sb.Append(System.Environment.NewLine)
            sb.Append("if (txt != null) txt.value='';")
            sb.Append(System.Environment.NewLine)
            sb.Append("}")
            Dim sDoCallBack As String = sb.ToString()
            Page.ClientScript.RegisterClientScriptBlock(Me.GetType, _
                "DoChatCallBack", sDoCallBack, True)

            'set initial focus (if configured to do so)
            If Me.InitialFocus AndAlso Me.Enabled Then
                Page.ClientScript.RegisterStartupScript(Me.GetType, _
                "ChatFocus", "document.getElementById('" _
                & _txt.ClientID & "').focus();", True)
            End If

            'emit JavaScript function call that initializes 
            'the control and joins the user into the conversation
            Page.ClientScript.RegisterStartupScript(Me.GetType, _
                "ChatEnter", "ChatEnter();", True)
        End If
    End Sub

V Sub-e 'Protected Overrides Sub RenderContents(ByVal output As HtmlTextWriter)' skoro na konci je tento kód ktory nastavy atributy aby po kliknuti sa vyvolal ten javascript kód :



'Attach button's client event to the JavaScript functions
        btn.Attributes("OnClick") = _
          "DoChatCallBack(document.getElementById('" _
          & _txt.ClientID & "'));"

A tento kód :

"DoChatCallBack(document.getElementById('" _
          & _txt.ClientID & "'));"

neviem spustit ako normal kód , teda ako ho mám vykonať napríklad v sub-e ? Vyzeralo by to asi takto ale pise to chybu :

Sub Send
"DoChatCallBack(document.getElementById('" _
          & _txt.ClientID & "'));"
End Sub

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Toto je obsah CallBack.js :


var oTxt;
var oDiv;
window.onunload = ChatExit;

function ChatExit()
{
  oTxt.value = "<i>[exited]</i>";
  DoChatCallBack(oTxt);
}

function ChatEnter()
{
  oTxt = document.getElementById("WebChat1_chattextbox");
  oDiv = document.getElementById("WebChat1_chatpanel");
  oTxt.value = "<i>[entered]</i>";
  DoChatCallBack(oTxt);
  window.setTimeout("DoChatCallBack()", 2000);
}
  
var WebChatMaxMsgID = 0;
var WebChatTimeoutID;
function CalledBack(result, context)
{
    if (result.length>0)
    {
        var aryRows = result.split("~~");
        for (var iRow=0 ; iRow<aryRows.length; iRow++)
        {
            var aryCols = aryRows[iRow].split("||");
            if (parseInt(aryCols[0])>parseInt(WebChatMaxMsgID))
            {
                oDiv.innerHTML = oDiv.innerHTML + '<br>' + aryCols[1]; 
                oDiv.scrollTop = oDiv.scrollHeight;
                WebChatMaxMsgID = aryCols[0];
            }            
        }
        document.getElementById('WebChat1_chattextbox').focus();
    }
    //ensure sure there is exactly one timer going at a time
    window.clearTimeout(WebChatTimeoutID);
    WebChatTimeoutID=window.setTimeout("DoChatCallBack()", 2000);
}
function ErrCalledBack(result,context){alert('Unexpected Chat Error: ' + result);}

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak napríklad máme control a a v ňom pri spracovávaní na serveri chcete zavolať javascript, tak s klienta(s javascriptu) budete čakať na server, či chce zavolať DoChatCallback, t.j. periodicky nejaký súbor vyžadovať cez HTTP a na serveri v handleri, kde na túto periodickú požiadavku odpovedáte, sa cez If rozhodnete, či to DoChatCallback chcete zavolať a ak áno, tak vrátite klientovi stránku, v ktorej máte metódu DoChatCallback, jej dependencie(t.j. použité premenné, volané funkcie a pod.) a javascript kód, ktorý zabezpečí volanie DoChatCallback. Ten javascript to musí prijať a prevzatý javascript spustiť. To vydím ako možné riešenie. Ale ako to v praxi implementovať a či to nejde jednoduchšie to naozaj netuším. Tu už by mal do diskusie zasiahnúť niekto skúsenejší a snáď Vám pomôže. To že Vám to píše chybu je normálne, z klienta môžete robiť javascriptom požiadavky na server alebo požiadavok na server vyvolá človek ale jedinou mne známou možnosťou, ako zo serveru kázať niečo klientovi(prehliadaču) je popísaná možnosť, že klient sa bude neustále pýtať servera, či niečo nechce.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Nechápete princip HTTP protokolu, bez toho nemá cenu v ASP.NET psát. Jak chcete ze serveru spouštět kód, který se spouští u klienta v prohlížeči?

Celý web funguje tak, že se napíše adresa do prohlížeče, udělá se HTTP požadavek na server, server vygeneruje celou stránku (v tuto chvíli se spouští veškerý kód psaný v C# nebo ve VB.NET) a pošle ji klientovi. Až od okamžiku, kdy má klient celou stránku načtenou, se dají pouštět javascripty. Ty běží u klienta v prohlížeči, server s nimi nemá co do činění.

Javascripty můžou manipulovat s obsahem stránky, nebo případně udělat nový požadavek na server a dotáhnout nějaká další data (to se označuje jako AJAX). Ale od chvíle, kdy server pošle stránku klientovi, do toho už víceméně nemůže mluvit a zasahovat, jedině v případě AJAX volání anebo když uživatel klikne na nějaké tlačítko a odešle stránku zpět na server.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Ja ten princíp chápem a aj preto som napísal, že to nie je možné poslať zo serveru. Myslel som to tak, že klient už má predošlú stránku načítanú a tá bude prosíkať o príkaz napríklad cez FormXYZ.Submit()(Vami spomínaný AJAX) a keď ho dostane tak ho vykoná. Váš príspevok mi pripadá ako by ste neporozumel tomu môjmu predošlému.

nahlásit spamnahlásit spam -2 / 2 odpovědětodpovědět

Pokud tento princip chápete, jak sám říkáte, tak nevím, co řešíte. Pokud již máte napsanou funkci, která se dotáže serveru AJAXem a stáhne příslušná data, tak přece tuto funkci nemusíte volat ze serveru, stačí ji zavolat přímo z prohlížeče při kliknutí na tlačítko. Tlačítko vůbec nemusí dělat postback, pokud jen voláte funkci z javascriptu.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ako vidim je to tu uz trosku horuce. Nevedeli by ste mi deta pomoct ako spustit ten javascript zo Sub-u alebo Funkcie prosim ? Ako vidim dost tomu rozumiete a bol by som vam vdacny za kusok kodu.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak, jak se ptáte, to prostě nejde - z kódu na serveru nemůžete ve stránce zavolat javascript.

Jediné, čeho lze dosáhnout, je přes volání Page.ClientScript.RegisterStartupScript do stránky vložit kus javascriptu, který se má spustit. Ale nespustí se hned, bude spuštěn, až se stránka odešle do prohlížeče, a to ještě jenom možná, protože uživatel může mít javascripty vypnuté.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ja som mal na mysli to, že tým postbackom vlastne stiahne dáta. Ak viete, ako v javascripte vygenerovať zvlášť druhý request bez robenia postbacku, ako to spomínate, budem iba rád ak mi ukážete príklad.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback