webForumDet fria alternativet

Göra SELECT-meny till text-fält!

JavaScript

25 svar · 1 095 visningar · startad av oskars

Medlem sedan nov. 20051 317 inlägg
Frågan#1

Hej på er! Nu regnar det :) Antar att hösten är här också, ganska skönt.

Har en liten tanke om hur jag vill ha mina rullgardiner (select)...

Jag har ett databasprogram i windows som är helt fantastiskt (när det inte krånglar). I det finns det rullgardiner som är redigerbara... Låt oss säga att jag har en rullgardin med bland annat värdet "Webforum - www.webforum.nu" så kan jag välja det värdet i rullgardinen och sen gå in och ändra det till t.ex "Web-forum - www.webforum.com". Som det är nu med dom vanliga <select>-menyerna så finns ju inte denna möjligheten! Tyvärr, så jag funderar på om man kan lösa det på nått sätt?

En idé jag har är att ha två stycken flät så här:
[textfält1] [select1]

Där [textfält1] är ett vanligt textfält
Och där [select1] är en vanlig rullgardin, fast det som först bara är synlig är själva rullgardinsknappen som man sen klickar på så får man fram hela innehållet... har testat att göra så att <select> är bara 10px bred, och på nått sätt få innehållet att vara t.ex 200px brett, men det funkar inte på det sättet jag har försökt. Sen när man klickat på det värdet man vill ha i rullgardinen så ska det hamna automatiskt i [textfält1]... på så sätt så kan man redigera texten hur man vill.. Notera att jag ej vill redigera texten i databasen, utan bara i formuläret..

Tacksam för hjälp!

Hoppas ni förstår mina idéer och förklaringar! :i

:)

Mvh
Oskar

Medlem sedan dec. 20025 483 inlägg
#2

Hej!

Givetvis finns det fler lösningar än den följande. T.ex. skulle du initialt kunna ha en bild på en dropdownpil som, när den klickas på, skiftas till en <select>. Sedan är jag litet osäker på huruvida värden för <option>s också skall kunna ändras. Nedan är det ej implementerat, men är trivialt att åstadkomma om det skulle önskas.

<script type="text/javascript">
var isWide = false, sel, selWidth, currOp = null;
function widenSelect(f)
{
  if (!isWide){
    sel.style.width = selWidth + "px";
    isWide = true;
    f.elements["i"].style.display = "inline";
  }
}

function updateInput(s)
{
  currOp = s.options[s.selectedIndex];
  s.form.elements["i"].value = currOp.text;
}

function updateOption(v)
{
  if (currOp){
    currOp.text = v;
  }
}
</script>
<form>
 <select name="s" onclick="widenSelect(this.form)" onchange="updateInput(this)">
  <option>webForum</option>
  <option>abc</option>
  <option>123</option>
 </select>
 <input name="i" style="display:none" size="50" onkeyup="updateOption(this.value)">
</form>
<script type="text/javascript">
var sel = document.forms[0].elements["s"];
selWidth = sel.offsetWidth;
sel.style.width = 20 + "px";
</script>
Medlem sedan nov. 20051 317 inlägg
#3

Tjenare! Tusen tack!

Ser super ut, men har lite tankar:

* Jag vill ej att selecten ska expandera, jag vill bara ha en liten knapp helt tiden. Platsbrist 2006 :)
* Värdena i selecten ska Ej kunna ändras (livsfarligt)... Dom ska ju hämtas från en databas :)

Annars funkar det precis så som jag vill. Det är ruggigt fint :):D

Har du några lösningar på mina förslag?

Kan man på något sätt göra så att det bara är "innehållet" i selecten som är "stort" .. medans man bara har en liten knapp till den?

Edit: Att ta bort funktionen som gör så att värdet uppdateras i selecten var ju inte så svårt :) Fixade det...

Jag har grejat tagit bort lite grejer i din kod:

<script type="text/javascript">
var isWide = false, sel, selWidth, currOp = null;

function updateInput(s)
{
  currOp = s.options[s.selectedIndex];
  s.form.elements["i"].value = currOp.text;
}

function updateOption(v)
{
  if (currOp){
    currOp.text = v;
  }
}
</script>
<form>
 <select name="s" onchange="updateInput(this)">
  <option>webForum</option>
  <option>abc</option>
  <option>123</option>
 </select>
 <input name="i" size="50">
</form>
<script type="text/javascript">
var sel = document.forms[0].elements["s"];
selWidth = sel.offsetWidth;
sel.style.width = 20 + "px";
</script>

Gjorde så att textfältet syns direkt t.ex.. och att värdena inte går att ändra i selecten...

Det enda som återstår nu är att innehållet i selectmenyn ska vara "stort", men knappen ska förbli "liten" :)

EDIT: Edit igen! Det här vore grymt bra... tror jag?? Man har det så som jag visade i koden.. men när man klickar på selectknappen så "försvinner" textfältet under tiden man väljer värde i selectmenyn! Vad tror du om det? Och att det sen så klart ploppar fram igen, fast med valt värde :)

Medlem sedan dec. 20025 483 inlägg
#4

Hm, jag är litet osäker på hur du menar. Du skriver att menyn ej får expandera. Men om den inte gör det, hur skall man då kunna välja mellan olika värden? Är det samma effekt som <textarea rows="1"> du är ute efter?

I nedanstående kod göms textfältet medan användaren väljer ett värde och visas igen när ett värde har valts.

<script type="text/javascript">
function updateInput(s)
{
  var currOp = s.options[s.selectedIndex];
  s.form.elements["i"].value = currOp.text;
  s.form.elements["i"].style.display = "inline";
}

var m = 0;
function showHideInput(f)
{
  if (++m % 2) f.elements["i"].style.display = "none";
}
</script>
<form>
 <select name="s" onchange="updateInput(this)" onclick="showHideInput(this.form)">
  <option>webForum</option>
  <option>abc</option>
  <option>123</option>
 </select>
 <input name="i" style="display:none" size="50">
</form>
Medlem sedan nov. 20051 317 inlägg
#5

Vi är på rätt väg :D

Först ska det se ut så här:
[liten selectknapp] & [textfält]
sen antingen klickar man på selectknappen eller skriver in ett eget värde
klickar man på den lilla selectknappen så döljs textfältet och byts ut av en selectmeny som är i full storlek.
sen när man valt värde ur selectmenyn så återgår raden till [liten selectknapp] & [textfält med valt värde från selectmenyn]

*exalterad*

Medlem sedan dec. 20025 483 inlägg
#6

Jag har bifogat ett exempel på hur jag tror du vill ha det.

Medlem sedan nov. 20051 317 inlägg
#7

Nä men det är ju perfekt :D

UNDERBART!

Ska jag göra kopior på det där bara så jag får upp till 6st likadana under varandra?

*svimfärdig*

Medlem sedan dec. 20025 483 inlägg
#8

Vi kan återanvända koden så här

<script type="text/javascript">
function updateInput(s, i)
{
  var currOp = s.options[s.selectedIndex];
  s.form.elements[i].value = currOp.text;
  s.style.display = "none";
  s.form.elements[i].style.display = "inline";
}

function showHideSelect(s, i)
{
  var s = document.forms[0].elements[s],
      i = document.forms[0].elements[i]; 
  i.style.display = (i.style.display != "none") ? "none" : "inline";
  s.style.display = (s.style.display != "none") ? "none" : "inline";
}
</script>
<form>
 <img src="arrow.png" height="20" width="17" style="cursor:pointer" onclick="showHideSelect('s','i')">
 <select name="s" style="display:none" onchange="updateInput(this, 'i')">
  <option>webForum</option>
  <option>abc</option>
  <option>123</option>
 </select>
 <input name="i" size="40">
 <br>
 <img src="arrow.png" height="20" width="17" style="cursor:pointer" onclick="showHideSelect('t','j')">
 <select name="t" style="display:none" onchange="updateInput(this, 'j')">
  <option>webForum</option>
  <option>abc</option>
  <option>123</option>
 </select>
 <input name="j" size="40">
</form>
Medlem sedan nov. 20051 317 inlägg
#9

Jag tackar och bugar! Tack för enormt bra hjälp! Du har gjort mig otroligt sugen på att lära mig Javascript!

Medlem sedan nov. 20051 317 inlägg
#10

äeh nu har jag fått nått fel utan att ha pillat med något, det har ju fungerat perfekt ända tills nu=)

function updateInput(s, i)
{
  var currOp = s.options[s.selectedIndex];
  s.form.elements[i].value = currOp.text;
  s.style.display = "none";
  s.form.elements[i].style.display = "inline";
}

function showHideSelect(s, i)
{
  var s = document.forms[0].elements[s],
      i = document.forms[0].elements[i]; 
  i.style.display = (i.style.display != "none") ? "none" : "inline";
  s.style.display = (s.style.display != "none") ? "none" : "inline";
}

får error:
'style' är Null eller inte ett objekt.. vad är fel egentligen när det fungerat perfekt.. och slutat att fungera utan att jag pillat med det?

Medlem sedan juni 200032 967 inlägg
#11

Det är inte speciellt intressant att se asp-kod när problemet är klientrelaterat. Visa hur den genererade HTML-koden ser ut när den kommer till webbläsaren.

Medlem sedan dec. 20025 483 inlägg
#12

Var anropar du showHideSelect()?

Medlem sedan nov. 20051 317 inlägg
#13
<img src="arrow.gif" style="cursor:pointer;margin:0 0 0 0;margin0;padding:0;" onclick="showHideSelect('produkt2_select','produkt2')">
<select name="produkt2_select" style="display:none;margin:1px 0 0px 3px;width:213px;" onchange="updateInput(this, 'produkt2')">
<option>Välj produkt...</option>
<option></option>
<option value="Cadillac Skinnjacka">Cadillac Skinnjacka</option>
<option value="1st 6-pack Grogg-glas "Cadillac"">1st 6-pack Grogg-glas "Cadillac"</option>
<option value="1st 6-pack Snaps-glas "Cadillac"">1st 6-pack Snaps-glas "Cadillac"</option>
<option value="1st 6-pack Whiskey-glas "Cadillac"">1st 6-pack Whiskey-glas "Cadillac"</option>
<option value="1st 6-pack Öl-glas "Cadillac"">1st 6-pack Öl-glas "Cadillac"</option>
</select>
<input name="produkt2" type="text" style="width:204px;">
function updateInput(s, i)
{
  var currOp = s.options[s.selectedIndex];
  s.form.elements[i].value = currOp.text;
  s.style.display = "none";
  s.form.elements[i].style.display = "inline";
}

function showHideSelect(s, i)
{
  var s = document.forms[0].elements[s],
      i = document.forms[0].elements[i]; 
  i.style.display = (i.style.display != "none") ? "none" : "inline";
  s.style.display = (s.style.display != "none") ? "none" : "inline";
}

Sorry :)

Medlem sedan dec. 20025 483 inlägg
#14

Följande ger mig inget felmeddelande:

<img src="arrow.gif" style="cursor:pointer;margin:0 0 0 0;margin0;padding:0;" onclick="showHideSelect('produkt2_select','produkt2')">
<form>
                                <select name="produkt2_select" style="display:none;margin:1px 0 0px 3px;width:213px;" onchange="updateInput(this, 'produkt2')">
                                    <option>Välj produkt...</option>
                                	<option></option>
	                                
	                                    <option value="Cadillac Skinnjacka">Cadillac Skinnjacka</option>
	                                
	                                    <option value="1st 6-pack Grogg-glas "Cadillac"">1st 6-pack Grogg-glas "Cadillac"</option>
	                                
	                                    <option value="1st 6-pack Snaps-glas "Cadillac"">1st 6-pack Snaps-glas "Cadillac"</option>
	                                
	                                    <option value="1st 6-pack Whiskey-glas "Cadillac"">1st 6-pack Whiskey-glas "Cadillac"</option>
	                                
	                                    <option value="1st 6-pack Öl-glas "Cadillac"">1st 6-pack Öl-glas "Cadillac"</option>
	                                
                                </select>
                                <input name="produkt2" type="text" style="width:204px;">
</form>

JAVASCRIPTET:
<script>
function updateInput(s, i)
{
  var currOp = s.options[s.selectedIndex];
  s.form.elements[i].value = currOp.text;
  s.style.display = "none";
  s.form.elements[i].style.display = "inline";
}

function showHideSelect(s, i)
{
  var s = document.forms[0].elements[s],
      i = document.forms[0].elements[i]; 
  i.style.display = (i.style.display != "none") ? "none" : "inline";
  s.style.display = (s.style.display != "none") ? "none" : "inline";
}
</script>
Medlem sedan juni 200032 967 inlägg
#15

Och om du ser till att koda om " till " i namnen på glasen?

Vad är det för skillnad på de kodblocken som fungerar / inte fungerar då?

Medlem sedan dec. 20025 483 inlägg
#16

@nders skrev:

Och om du ser till att koda om " till " i namnen på glasen?

Såg inte dem :r (y)

Fast faktum kvarstår: koden i mitt senaste inlägg ger mig inget felmeddelande i varken IE7 eller FF.

Medlem sedan nov. 20051 317 inlägg
#17

@nders, kan det va det? :O
jag vet inte riktigt :/
EDIT: Det funkar ändå inte om jag tar bort dom!

Kallar jag inte på min javascriptfil så här:
<script language="javascript" type="text/javascript" src="javascript.js"></script>

Märker att andra jävla javascript slutat funk, men vissa fungerar ändå!. vafan?

Medlem sedan dec. 20025 483 inlägg
#18

Då är nog det bästa att bifoga en länk till sidan, alternativt ta bort samtliga JavaScript och sedan lägga till dem en efter en för att upptäcka var felet ligger.

Fungerar http://member.webforum.nu/4685/oskars.html?

Medlem sedan nov. 20051 317 inlägg
#19

Sidan du länkar till fungerar perfekt!!!

måste jag ha egna <form>-taggar för dom här? eller kan jag lägga koden innanför befintliga formgtaggar?

EDIT: Det funkar fortfarande inte på min sida dock.. ;)

EDIT: Det funkar inte om jag bara har det javascriptet i min javascript.js fil...

EDIT: hm... vafan... samma kodsnuttar funkar bra om jag t.ex lägger dom högst upp på sidan .. precis under <body>-taggen... :q

Medlem sedan dec. 20025 483 inlägg
#20

Problemet kan ligga i showHideSelect(). Den refererar till formulär 0, men om du har fler formulär på sidan gör du bäst i att skriva enligt

function showHideSelect(s, i)
{
  var s = document.forms["namn_på_formulär"].elements[s],
      i = document.forms["namn_på_formulär"].elements[i]; 
  i.style.display = (i.style.display != "none") ? "none" : "inline";
  s.style.display = (s.style.display != "none") ? "none" : "inline";
}
270 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
125 ms — deklarationer (db)
0 ms — hämta statistik (cache)
142 ms — hämta tråd, inlägg och bilagor (db)
122 ms — ändringar (db)