[ASP.NET] Twee javascripts, alleen eerste wordt uitgevoerd

Pagina: 1
Acties:

  • EmilneM
  • Registratie: December 2001
  • Laatst online: 15-09-2023
Op een ASP.NET-webform staan onder andere een aantal textboxen en een button. Aan een textbox txtDebiteuren is een TextChanged_event gekoppeld. Als dit event wordt uitgevoert wordt onder andere via een clientside-javascriptje gezorgd dat er een bepaald textboxje de focus krijgt. In het OnClick_event van de button staat hetzelfde javascriptje, maar dan voor een andere textbox.

Als op de button geklikt wordt terwijl ook de text in het textvakje gewijzigd is worden twee events uitgevoerd. Eerst het TextChanged_event van de textbox en daarna het OnClick_event van de button.

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Private Sub SetFocus(ByVal ctrl As Control)
        Dim focusScript As String = "<script language='javascript'>" & _
          "document.getElementById('" + ctrl.ClientID & _
          "').focus();</script>"

        Page.RegisterStartupScript("FocusScript", focusScript)
End Sub

Private Sub txtDebiteuren_TextChanged(ByVal sender As System.Object, _
  ByVal e As System.EventArgs) Handles txtDebiteuren.TextChanged
       SetFocus(txtDebiteuren)
End Sub

Private Sub cmdNieuw_Click(ByVal sender As System.Object, ByVal e _
  As System.EventArgs) Handles cmdNieuw.Click
        txtDebiteuren.Enabled = True
        SetFocus(txtNaam)
End Sub


Je zou verwachten dat textboxje 'txtNaam' nu netjes de focus krijgt maar ik krijg een script-error waarin staat dat txtDebiteuren de focus niet kan krijgen (logisch want hij is niet enabled). Dit wil naar mijn idee dus zeggen dat SetFocus(txtNaam) als het ware overgeslagen wordt, alleen het javascriptje dat als eerste wordt uitgevoerd wordt in de pagina gerendered. Kan ik de volgorde van het uitvoeren van de events omdraaien of is er een andere manier om te zorgen dat txtNaam netjes de focus krijgt in deze situatie?

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

op het moment dat er een JS error optreedt stopt alle uitvoering van verdere scripts. Wat je kan doen is de error voorkomen door in je JS functie eerst te kijken of de betreffende control wel enabled is alvorens de focus te zetten:

JavaScript:
1
2
var el = document.getElementById(ID);
if (el.disabled == false) el.focus();

Intentionally left blank


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 15:26

Janoz

Moderator Devschuur®

!litemod

Ik weet niet waar dat javascript precies terecht komt, maar als dit wordt uitgevoerd voordat de hele pagina binnen is (doordat het bijvoorbeeld in de header wordt gezet) dan werkt het niet aangezien het element met de clientID nog niet is gerenderd.

Om precies te kunnen achterhalen wat er fout gaat is het handiger om naar de source van de gegenereerde html pagina te kijken.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Janoz schreef op 17 november 2003 @ 10:09:
Ik weet niet waar dat javascript precies terecht komt, maar als dit wordt uitgevoerd voordat de hele pagina binnen is (doordat het bijvoorbeeld in de header wordt gezet) dan werkt het niet aangezien het element met de clientID nog niet is gerenderd.

Om precies te kunnen achterhalen wat er fout gaat is het handiger om naar de source van de gegenereerde html pagina te kijken.
Ik neem aan dat er gewoon respectievelijk een onchange en een onclick eventhandler wordt gegenereerd. Imho is dat wel een nadeel van ASP.NET; die ondoorzichtigheid van wat er nou uiteindelijk clientside gebeurd...

Intentionally left blank


  • EmilneM
  • Registratie: December 2001
  • Laatst online: 15-09-2023
crisp schreef op 17 november 2003 @ 10:02:
op het moment dat er een JS error optreedt stopt alle uitvoering van verdere scripts. Wat je kan doen is de error voorkomen door in je JS functie eerst te kijken of de betreffende control wel enabled is alvorens de focus te zetten:

JavaScript:
1
2
var el = document.getElementById(ID);
if (el.disabled == false) el.focus();
Heb het geprobeerd mét:
Visual Basic .NET:
1
2
3
4
5
    Private Sub SetFocus(ByVal ctrl As Control)
        Dim focusScript As String = "<script language='javascript'>" & _
        "var el = document.getElementByID('" + ctrl.ClientID & _
        "');if (el.disabled == false) el.focus();</script>"
    End Sub


en zónder variabele:
Visual Basic .NET:
1
2
3
4
5
6
    Private Sub SetFocus(ByVal ctrl As Control)
        Dim focusScript As String = "<script language='javascript'>" & _
        "if (document.getElementByID('" + ctrl.ClientID & _
        "').disabled == false) document.getElementByID('" + ctrl.ClientID & _
        "').focus();</script>"
    End Sub


maar het wil niet lukken. Zit er iets fout in de vb.net code?

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

EmilneM schreef op 17 november 2003 @ 10:24:
[...]


Heb het geprobeerd mét:
Visual Basic .NET:
1
2
3
4
5
    Private Sub SetFocus(ByVal ctrl As Control)
        Dim focusScript As String = "<script language='javascript'>" & _
        "var el = document.getElementByID('" + ctrl.ClientID & _
        "');if (el.disabled == false) el.focus();</script>"
    End Sub


en zónder variabele:
Visual Basic .NET:
1
2
3
4
5
6
    Private Sub SetFocus(ByVal ctrl As Control)
        Dim focusScript As String = "<script language='javascript'>" & _
        "if (document.getElementByID('" + ctrl.ClientID & _
        "').disabled == false) document.getElementByID('" + ctrl.ClientID & _
        "').focus();</script>"
    End Sub


maar het wil niet lukken. Zit er iets fout in de vb.net code?
doet eens view-source in je browser en copy-paste dat eens hier; ik heb geen flauw idee wat dit clientside precies aan HTML en JS genereerd eerlijk gezegd.

Intentionally left blank


  • EmilneM
  • Registratie: December 2001
  • Laatst online: 15-09-2023
Heel stom, vergeten om de code uit te voeren.....de volgende code toegevoegd en geen foutmelding meer.

Visual Basic .NET:
1
Page.RegisterStartupScript("FocusScript", focusScript)


Mijn probleem blijft echter, alleen het eerste script wordt uitgevoerd en SetFocus(txtNaam) wordt gewoon overgeslagen :? .

  • EmilneM
  • Registratie: December 2001
  • Laatst online: 15-09-2023
Volgens mij ben ik nog niet helemaal scherp op de maandagochtend.....weer foutje in de code, het probleem is nu opgelost en werkt perfect met de js-code van Crisp...bedankt!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Komt dit niet gewoon doordat je een RegisterStartupScript doet met 2 maal dezelfde key? Als het goed is wordt er dan maar een van de twee naar de page gerenderd. Het is dus logisch dat er maar een uitgevoerd wordt.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • EmilneM
  • Registratie: December 2001
  • Laatst online: 15-09-2023
rwb schreef op 17 november 2003 @ 11:50:
Komt dit niet gewoon doordat je een RegisterStartupScript doet met 2 maal dezelfde key? Als het goed is wordt er dan maar een van de twee naar de page gerenderd. Het is dus logisch dat er maar een uitgevoerd wordt.
Heb het geprobeerd en idd, hij pakt dus alleen de eerste (vreemd eigenlijk dat hij niet de laatste pakt :? )......ik moet dan 2 SetFocus subroutines aanmaken met 2 verschillende key's:

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    Private Sub SetFocus(ByVal ctrl As Control)
        Dim focusScript As String = "<script language='javascript'>" & _
        "var el = document.getElementById('" + ctrl.ClientID & _
        "'); if (el.disabled == false) el.focus();</script>"

        Page.RegisterStartupScript("FocusScript", focusScript)
    End Sub

    Private Sub SetFocus2(ByVal ctrl As Control)
        Dim focusScript As String = "<script language='javascript'>" & _
        "var el = document.getElementById('" + ctrl.ClientID & _
        "'); if (el.disabled == false) el.focus();</script>"

        Page.RegisterStartupScript("FocusScript2", focusScript)
    End Sub

    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As _
      System.EventArgs) Handles MyBase.Load
          txtDebiteuren.Enabled = False
          txtNaam.Enabled = True
          SetFocus(txtDebiteuren)
          SetFocus2(txtNaam)
    End Sub

Nu krijgt txtNaam wel netjes de focus....

Of is er een gemakkelijkere oplossing?

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Je zou een string in de Page scope kunnen declareren en deze telkens wijzigen als je SetFocus aanroept.
Dan kan je in je PreRender methode de RegisterStartupScript aan kunnen roepen. Dan krijg je tenminste niet 2 * een script block in je pagina.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • EmilneM
  • Registratie: December 2001
  • Laatst online: 15-09-2023
crisp schreef op 17 november 2003 @ 10:02:
op het moment dat er een JS error optreedt stopt alle uitvoering van verdere scripts. Wat je kan doen is de error voorkomen door in je JS functie eerst te kijken of de betreffende control wel enabled is alvorens de focus te zetten:

JavaScript:
1
2
var el = document.getElementById(ID);
if (el.disabled == false) el.focus();
Met dit script geef hij nog steeds een fout als de control niet visible is..... Ik ben dus eigenlijk op zoek naar het juiste script dat alleen uitgevoerd mag worden als:

el.disabled = false AND el.visible = true

Heb al een aantal manieren geprobeerd waaronder deze:

JavaScript:
1
if(el.disabled == false AND el.style.visibility = 'visible'

Het wil echter maar niet lukken.......

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:03
Het is niet AND maar && .

Daarnaast moet je ook je if - met een ) beëindigen, en de ene keer gebruik je == als vergelijkingsoperator, en even later gebruik je = als vgl, wat eigenlijk een assignment operator is.


Lekker basic hoor, dit vind je in iedere JS tutorial en Javascript hoort trouwens thuis in W&G, niet in P&W.

[ Voor 41% gewijzigd door whoami op 25-11-2003 12:31 ]

https://fgheysels.github.io/


  • EmilneM
  • Registratie: December 2001
  • Laatst online: 15-09-2023
whoami schreef op 25 november 2003 @ 12:30:
Het is niet AND maar && .

Daarnaast moet je ook je if - met een ) beëindigen, en de ene keer gebruik je == als vergelijkingsoperator, en even later gebruik je = als vgl, wat eigenlijk een assignment operator is.


Lekker basic hoor, dit vind je in iedere JS tutorial en Javascript hoort trouwens thuis in W&G, niet in P&W.
Hij geeft nu geen foutmelding meer, maar ook geen focus.......zou dat komen omdat de visibility van de control niet in javascript maar in asp.net is ingesteld?

edit:

Het component komt helemaal niet voor in de html als visible = false.... Ik moet dus een andere manier vinden voor het juiste script...

[ Voor 13% gewijzigd door EmilneM op 25-11-2003 12:41 ]


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 18:08

gorgi_19

Kruimeltjes zijn weer op :9

Erhm.. Visible-property van de asp.net-control != enabled-property van de asp.net-control

En anders moet je met attributes.collection gaan werken (zit bij een control).

Maar je zit volgens mij nu serverside en clientside weer lekker door elkaar te halen.

[ Voor 49% gewijzigd door gorgi_19 op 25-11-2003 12:45 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Als je control niet visible is dan wordt hij niet door ASP.NET gerenderd naar de pagina. Je kan dus aan de serverkant al bepalen of je het script mee moet sturen of niet.
Als je de clientside visibility wil bepalen zal je dat in de style collection van een component moeten zoeken.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • EmilneM
  • Registratie: December 2001
  • Laatst online: 15-09-2023
rwb schreef op 25 november 2003 @ 13:02:
Als je control niet visible is dan wordt hij niet door ASP.NET gerenderd naar de pagina. Je kan dus aan de serverkant al bepalen of je het script mee moet sturen of niet.
Als je de clientside visibility wil bepalen zal je dat in de style collection van een component moeten zoeken.
Serverside bepalen of het script wordt meegestuurd werkt in mijn geval niet, het gaat namelijk om een geval waarbij eerst een _textchanged event van een textbox plaatsvindt en daarna een onclick van een button. In het textchanged_event heeft de betreffende control visible = true en in de onclick visible = false.

Clientside werkt ook niet omdat de control dus inderdaad niet in de html staat omdat hij door asp.net niet wordt gerendered.

Ik moet dus eigenlijk een script hebben die dit afvangt.....Clientside moet door het script bekeken worden of de control wel bestaat.

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:03
Bedoel je zoiets gorgi_19:

code:
1
myControl.Attributes["visible"] = false;

bv?

Wordt de control door ASP.NET dan wel gerendered?

https://fgheysels.github.io/


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 18:08

gorgi_19

Kruimeltjes zijn weer op :9

weet niet of visible een geldig html-property is :) daar moet je iemand van de buren lief voor aankijken. :+

Je krijgt nu bijvoorbeeld als HTML:
HTML:
1
<a href="doel" target="_self" visible="false">doel</a>

[ Voor 20% gewijzigd door gorgi_19 op 25-11-2003 13:57 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
EmilneM schreef op 25 november 2003 @ 13:18:
[...]


Serverside bepalen of het script wordt meegestuurd werkt in mijn geval niet, het gaat namelijk om een geval waarbij eerst een _textchanged event van een textbox plaatsvindt en daarna een onclick van een button. In het textchanged_event heeft de betreffende control visible = true en in de onclick visible = false.

Clientside werkt ook niet omdat de control dus inderdaad niet in de html staat omdat hij door asp.net niet wordt gerendered.

Ik moet dus eigenlijk een script hebben die dit afvangt.....Clientside moet door het script bekeken worden of de control wel bestaat.
Je hoeft toch ook niet perse in die event handlers te beslissen welke de focus krijgt. Je kan ook ergens een variable een waarde geven en in de PreRender van de page pas bepalen welk control de focus krijgt.
gorgi_19 schreef op 25 november 2003 @ 13:57:
weet niet of visible een geldig html-property is :) daar moet je iemand van de buren lief voor aankijken. :+

Je krijgt nu bijvoorbeeld als HTML:
HTML:
1
<a href="doel" target="_self" visible="false">doel</a>
Zover ik weet is het inderdaad geen geldige property. Je zou het dan moeten doen met iets als
C#:
1
control.Attributes[ "style" ] = "visibility: hidden";

[ Voor 22% gewijzigd door Woy op 25-11-2003 13:58 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:03
gorgi_19 schreef op 25 november 2003 @ 13:57:
weet niet of visible een geldig html-property is :) daar moet je iemand van de buren lief voor aankijken. :+

Je krijgt nu bijvoorbeeld als HTML:
HTML:
1
<a href="doel" target="_self" visible="false">doel</a>
Dat weet ik ook niet :+
Maar het ging mij om het idee. :)

https://fgheysels.github.io/


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 18:08

gorgi_19

Kruimeltjes zijn weer op :9

@rwb:

Gebruik dan
Visual Basic .NET:
1
control.Style.Add("visibility","hidden")

:P

@whoami:
't is en blijft clientside; da's eng.. :P

Digitaal onderwijsmateriaal, leermateriaal voor hbo

Pagina: 1