webForumDet fria alternativet

Disabla en submit-knapp inifrån form utan användande av ID?

JavaScript

27 svar · 1 055 visningar · startad av haider · sida 2 av 2

Frågan, av haider

Tjena, Jag har en sida med flertalet \<form\> taggar och jag vet att risken är överhängande att det kan uppstå krockar med IDs förr eller senare om varje form-tagg ska ha sin egen. Frågan är om jag inifrån en form-tag kan köra ett javascript, tex i formulärets \<select\>-tag i stil med \<select onChange=" nånting "\> och tack vare detta kunna nå den nuvarande form (this) utan att använda mig av

Läs frågan i sin helhet →
Medlem sedan jan. 2003956 inlägg
#21

getElementsByTagName funkar kanon! (så här långt ;))

För att testa "lokalt", alltså inuti form-taggen, körde jag:
this.form.getElementsByTagName('input')[4]
(jag brukar köra med alert, för att se om jag får nån respons)
Eftersom submitknappen är den femte input-taggen så hittades den utan problem. Fast, jag sitter och tänker lite på vad som kan hända om fler input taggar läggs till i framtiden eller om några forms har fler än fem.
Vi får oroa oss om detta sen, så får vi se om det finns nåt sätt att öka igenom arrayen (det blir väl en array eller hur?) och matcha den mot ett ID.

Frågan jag egentligen behöver ställa är hur jag kan skicka "ut" det värde jag får av det kommandot this.form.getElementsByTagName('input')[4] som ju körs internt, så det används av min externa funktion f(elm)?

Medlem sedan jan. 2003956 inlägg
#22

Peter, stort tack för tipset om getElementsByTagName. Jag fick lösningen att fungera internt, men det känns fult med en stor javascript-klump mitt i onchange, så jag hoppas du har nåt tips på hur jag kan flytta ut koden så jag kan anropa en extern funktion där all script hör hemma.

Medlem sedan dec. 20025 483 inlägg
#23
function f(frm, name)
{
    var elms = frm.getElementsByTagName("INPUT");
    for (var i = 0; i < elms.length; ++i)
    {
      if (/^image$/i.test(elms[i].type) && elms[i].name == name)
      {
          elms[i].src = "http://www.webforum.nu/images/wfstandard/misc/navbits_start.gif";
          break;
      }
    }
}
...
onchange="f(this.form, 'pelle')"
...
<input type="image" name="pelle">
Medlem sedan jan. 2003956 inlägg
#24

Kräver det att varje form har ett unikt namn? Eller vet den vilken det är i och med att jag sänder infon om formen genom this.form?

Vad betyder break? Jag tror inte jag har stött på denna förut.

Medlem sedan dec. 20025 483 inlägg
#25

Nej, vad formuläret har för namn spelar ingen roll - allt sköts genom this.form.

Break betyder att vi hoppar ur loopen; eftersom vi hittat det element vi letat efter finns ingen anledning att låta loopen fortsätta.

Medlem sedan jan. 2003956 inlägg
#26

Stort tack Peter!

Det löste sig galant, med lite omskrivning.
Så här skrev jag om scriptet (för jag behövde stoppa in en else)

function f(frm, name, selectValue)
{
	var elms = frm.getElementsByTagName("INPUT");
	for (var i = 0; i < elms.length; ++i)
	{
	  if (/^image$/i.test(elms[i].type) && elms[i].name == name)
	  {
		  if (selectValue.match(/xxx/)) {
				elms[i].src = "/bilder/knapp_disabled.gif";
				elms[i].disabled = true;
				break;
				
			} else {
				elms[i].src = "/bilder/knapp_.gif";
				elms[i].disabled = false;
				break;
			}
	  }
	}
}

Sen anropade jag med:

onChange="f(this.form, 'add', this.value)"

där 'add' är namnet på submit knappen. Den hette så innan, så jag ville lämna det som det var.

Jag kommer troligen döpa om namnet på funktionen för överskådlighetens skull.
Sen försökte jag förstå lite, men misslyckades med den delen; if (/^image$/i.test(elms*.type) && elms*.name == name).
elms*.name tror jag betyder att när den hittar submit-knappens namn, men vad är image-grejen?***

Medlem sedan dec. 20025 483 inlägg
#27

Du gör helt rätt i att döpa om funktionen :)

Samlingen 'elms' innehåller samtliga formulärelement i formuläret (alla inputs, selects m.fl.).

Delen '/^image$/i' kontrollerar att det formulärelement vi hittat är av typen <input type="image">.

Medlem sedan jan. 2003956 inlägg
#28

En tanke slog mig om det här.
Nu är det bara en fundering, men jag vill gärna ta upp frågan i alla fall.

Eftersom jag hade problem med att om första optiontaggen hade "xxx" i sitt värde, så skulle inte funktionen vara till någon nytta, eftersom onchange inte skett ännu. Så jag bestämde mig för att för att submitten är disable redan från början och att första valet är i still med "gör ditt val".

Men så kom jag att tänka på en annan sak, men jag vet inte om det är rätt tänk.
Om man använder sig av en if-sats, och som med hjälp av document.write skriver ut antingen en <input> tag som är enablad eller disablad beroende på första objektets (option-taggen) värde.

Så mitt inne i ett formulär har vi alltså en submit-tag som är utskriven genom javascript. Är det en bra eller dålig sak att göra?

259 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
122 ms — deklarationer (db)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)
125 ms — ändringar (db)