lolukokasosMedlem sedan mars 2001196 inlägg
Oj, javascript har aldrig varit min grej...
Har en sida där det kommer upp textrutor som måste fyllas i ifall man är försenad. Dessa textrutor (element) kan finnas många av eller endast en. Jag ska då kolla om textrutan är ifylld men mitt problem är att det när det är en koms åt med document.form.sentext.value och om det finns flera (array)så är det document.form.sentext[0] som ska gälla. Dock så bryter skriptet vid koll om det är det andra....
Jag har provat document.form.sentext===Array men den vill inte vara med när den väl är array.
Hur kollar man om ett element är array i formuläret?
voigtann1Medlem sedan juni 20018 810 inlägg
kommer inte vara 100% testad här men:
var isNodeList = function(el) {
return typeof el === 'object' && typeof el.length === 'number' && typeof el.item == 'function';
};
var sentexts = document.forms[0].sentext;
if(isNodeList(sentexts)) {
// many
for(var i = 0;i<sentexts.length;i++) {
console.log(sentexts[i]);
}
} else {
// single
console.log(sentexts);
}
lolukokasosMedlem sedan mars 2001196 inlägg
Oj, det var inte riktigt förståeligt för mig. Men jag tolkar det som att det är typeof som ska användas för att kolla om det är array. Jag lägger hela min nuvarande icke fungerande kod här, den ger s=1 hela tiden...
function sen() {
if ( typeof document.visabest.sentext === 'number') { s = 0 } else { s = 1}
prompt( s, '');
if (s > 0) {
if (document.visabest.sentext.value.length > 0) {
prompt('en', '');
if (document.visabest.sensign.value.length > 0) {
document.visabest.fardig.disabled = false;
}
}
}
else {
//prompt('arr', '');
if (document.visabest.sentext[0].value.length > 0) {
if (document.visabest.sensign[0].value.length > 0) {
document.visabest.fardig[0].disabled = false;
}
}
}
}
voigtann1Medlem sedan juni 20018 810 inlägg
fast document.visabest.sentext kommer inte vara ett number, det är inte heller en array du få när du hämta DOM element det är en nodlista du har att jobba med.
Om du nu skapar dynamiskt fält så antingen få du ut ett element eller en nodeList beroende på vad du få ut (när du kolla det med isNodeList funktionen i mitt inlägg så kan du loopa ut alla fält (for-loopen) annars om det bara är ett element (detta är kanske inte korrekt skriven då den kan vara null också) så kommer den träffa else satsen i if frågan.
lolukokasosMedlem sedan mars 2001196 inlägg
Det var slarvigt av mig att skicka in den koden men typeof document.visabest.sentext.value.length === 'number' borde väl funka?
Mitt problem med din kod är att jag inte riktigt förstår hur den ska testas. Du skapar en variabel som blir en funktion som du sedan hänvisar i en annan funktion. Hur anropar du detta? Att du loopar ut resultat förstod jag.
voigtann1Medlem sedan juni 20018 810 inlägg
fast length retunera alltid ett tal så det är rätt meningslöst du vill i så fall kolla om den är större än 0 (eller bara låta den vara).
Min funktion är skriven på ett annolunda sätt bara.. men kolla igenom exempelt så ser du att jag anropar funktionen (inne i if frågan) för att se om den är en nodeList om sentexts är det så loopar den ut kollektionen, annars så kör den bara en gång... vad du nu vill göra.
kan kanske ha missförstått vad du vill göra, jag tog det att du hade fler än ett fält med samma namn som du kunde skapa upp med javascript?
lolukokasosMedlem sedan mars 2001196 inlägg
Nej jag tror inte att length alltid anger en siffra.
Mitt huvudsakliga problem är att om det är en array av element och jag frågar vad document.visabest.sentext.value.length är så blir det skriptfel och den bara hoppar över skriptet. Så jag är endast intresserad av att ta reda på om elementet sentext är en array eller inte? Om det är en array så läser man ut det med document.visabest.sentext[0].value.length.
Jag vet inte hur jag ska anropa ditt exempel? Kan du ange något mer?
voigtann1Medlem sedan juni 20018 810 inlägg
lolukokasos skrev:
Nej jag tror inte att length alltid anger en siffra.
det kommer den alltid göra, förutom när du ha en kollektion av element med samma namn (vilket du kommer få om jag förstå dig rätt).
Om du bara ha ett element med namnet 'sentext' så kommer du få värdet ifrån den och då kollar du längden på den (om det är en tom sträng då bli längden självklart 0).
lolukokasos skrev:
Så jag är endast intresserad av att ta reda på om elementet sentext är en array eller inte?
Och det gör jag i mitt kod exempel, om det är en nodeList så kommer den loopar igenom alla element och just nu gör inget (förutom att skriva inne i konsollens logg vilket element den är inne i). ersätt
console.log(sentexts); med den kod du vill köra (där sentexts är den aktuella elementet i loopen). Om det inte är en nodelista så tar mitt exempel för givet att det finns minst ett element med namnet 'sentext' och i så fall skriver den ut den i loggen).
Ett problem du kan få är 'fardig' (och 'sensign') det måste finnas lika många sådna som det finns 'sentext' element, om det är det så är det bara att köra fardig inne i din loop och köra en enable/disable på den.
Du få komma med HTML exempel på ett scenario du har problem, om denna info inte hjälper.
Min gissning är att detta borde lösa ditt problem:
var isNodeList = function(el) {
return typeof el === 'object' && typeof el.length === 'number' && typeof el.item == 'function';
};
var checkLate = function(lateText, sign, done) {
if(lateText.value.length && sign.value.length) {
done.disabled = false;
}
};
var sentexts = document.visabest.sentext;
var sensign = document.visabest.sensign;
var fardig = document.visabest.fardig;
if(isNodeList(sentexts)) {
// many
for(var i = 0;i<sentexts.length;i++) {
checkLate(sentexts[i], sensign[i], fardig[i]);
}
} else {
// single
checkLate(sentexts, sensign, fardig);
}
lolukokasosMedlem sedan mars 2001196 inlägg
Men om det är en array och du frågar efter length som om det vore en variabel (ej array) så är elementet undefined eller null och då ger inte length något värde. Det är ju här som jag har problemet.
Jag vet hur jag ska plocka ut mina värden om jag bara i kod kan konstatera om det är en array eller inte.
Med ditt kodexempel så fastnar det på raden med lateText.length... och säger
SCRIPT5007: Det går inte att hämta värdet för egenskapen length: objektet är null eller odefinierat
Och ja, fardig, sentext och sensign är alltid lika många av.
voigtann1Medlem sedan juni 20018 810 inlägg
lolukokasos skrev:
Men om det är en array och du frågar efter length som om det vore en variabel (ej array)
Förstå inte vad du menar där. Vet inte vad du vill göra med .length i dina exempel men den kommer inte ta någon array värde utan den kommer kolla vad document.visabest.sentext kommer ha för värde men så fort visabest skapar fler gånger så är inte document.visabest ett element längre utan en nodeList.
så är elementet undefined eller null och då ger inte length något värde. Det är ju här som jag har problemet.
Det är det jag skrev, att du förmodligen få kolla att sentexts faktist är något.
if(isNodeList(sentexts)) {
// many
for(var i = 0;i<sentexts.length;i++) {
checkLate(sentexts[i], sensign[i], fardig[i]);
}
} else if(sentexts) {
checkLate(sentexts, sensign, fardig);
}
Det hade underlättat att göra tester om du vill bidra med din HTML kod.
Felmeddelandet är att det inte finns något element med det namnet.
du vill kanske se om formuläret också finns?:
var isNodeList = function(el) {
return typeof el === 'object' && typeof el.length === 'number' && typeof el.item == 'function';
};
var checkLate = function(lateText, sign, done) {
if(lateText.value.length && sign.value.length) {
done.disabled = false;
}
};
var form = document.visabest;
if(form) {
var sentexts = form.sentext;
var sensign = form.sensign;
var fardig = form.fardig;
if(isNodeList(sentexts)) {
// many
for(var i = 0;i<sentexts.length;i++) {
checkLate(sentexts[i], sensign[i], fardig[i]);
}
} else if(sentexts) {
// single
checkLate(sentexts, sensign, fardig);
}
}
lolukokasosMedlem sedan mars 2001196 inlägg
Jag får i stort sätt hela tiden samma fel att variablen är null eller undefined. Men [0] eller inte gör skillnaden om det funkar eller inte. Har rensat koden på oväsentligheter som menyer och annat.
<html>
<head>
<link rel="Stylesheet" href="css.css" type="text/css">
</head>
<body>
<center>
<script language="JavaScript">
function win(chkbox)
{
var x, id, antalet;
var theForm = chkbox.form;
var n = theForm.elements.length;
var val = chkbox.value
val = val.split('-')
id = val[0]
antalet = val[1]
if(chkbox.checked){
x=prompt('Din signatur tack: '+id,'');
document.visabest.signatur.value=x;
document.visabest.id.value=id;
document.visabest.antalet.value=antalet;
if (x==null || x==""){
chkbox.checked=false;
}
else{
document.visabest.submit();
}
}
}
function pyOrder()
{
x=prompt('Din signatur tack: ' , '');
document.visabest.signatur.value=x;
if (x==null || x=="")
{
;
}
else
{
document.visabest.submit();
}
//document.visabest.pyOrderNr.value = val1;
}
function sen() {
//if (document.visabest.sentext.value.length == undefined) { s = 0; } else {s = 1;}
if ( typeof document.visabest.sentext.value.length === 'number') { s = 1; } else { s = 0;}
//if (document.visabest.sentext instanceof Array) { s = 0; } else {s = 1;}
//var s = document.visabest.sentext.value.length;
//prompt( s, '');
if (s > 0) {
if (document.visabest.sentext.value.length > 0) {
//prompt('en', '');
if (document.visabest.sensign.value.length > 0) {
document.visabest.fardig.disabled = false;
}
}
}
else {
//prompt('arr', '');
if (document.visabest.sentext[0].value.length > 0) {
if (document.visabest.sensign[0].value.length > 0) {
document.visabest.fardig[0].disabled = false;
}
}
}
}
function sen1() {
var isNodeList = function (el) {
return typeof el === 'object' && typeof el.length === 'number' && typeof el.item == 'function';
};
var checkLate = function (lateText, sign, done) {
if (lateText.value.length && sign.value.length) {
done.disabled = false;
}
};
var sentexts = document.visabest.sentext;
var sensign = document.visabest.sensign;
var fardig = document.visabest.fardig;
if (isNodeList(sentexts)) {
// many
for (var i = 0; i < sentexts.length; i++) {
checkLate(sentexts[i], sensign[i], fardig[i]);
}
} else {
// single
checkLate(sentexts, sensign, fardig);
}
}
</script>
<form name="visabest" action="qpsRedovisaBest2.asp" method=post>
<br>
<h3><b>Sexan - 6</b></h3>
<input type=hidden name="signatur" ID="Hidden1">
<input type=hidden name="maskNr" value="6" ID="Hidden2">
<input type=hidden name="id" value="" ID="Hidden3">
<input type=hidden name="antalet" value="" ID="Hidden4">
<input type=hidden name="pyOrderNr" value="">
<table class="oversikttab" width=800 border=0 ID="Table1">
<tr>
<th bgcolor=#999999><font color=#FFFFFF>kö</font></th>
<th bgcolor=#999999><font color=#FFFFFF>id</font></th>
<th bgcolor=#999999><font color=#FFFFFF>artikelnummer</font></th>
<th bgcolor=#999999><font color=#FFFFFF>info</font></th>
<th colspan=10 bgcolor=#999999><font color=#FFFFFF>antal körningar (pall)</font></th>
</tr>
<tr class=jamn>
<td width=25 align=center><a href='qpsBestPrp.asp?bestId=148473'>1</a>.</td>
<td width=25 align=center>148473</td>
<td width=130 align=center><a href='qpsBestPrp.asp?bestId=148473'><b>Test</b></a></td>
<td width='110' align=center><i></i></td><td width=30 align=center bgcolor=#FFFFFF>1.<input type=checkbox name='a1' value='148473-1' onclick='win(this);'></td><tr class=jamn>
<td width=25 align=center><a href='qpsBestPrp.asp?bestId=125495'>2</a>.</td>
<td width=25 align=center>125495</td>
<td width=130 align=center><a href='qpsBestPrp.asp?bestId=125495'><b>2321321</b></a></td>
<td width='110' align=center><i></i></td><td width=30 align=center bgcolor=#FFFFFF>1.<input type=checkbox checked disabled></td><td colspan=3 align=right width=30 bgcolor=#FFFFFF><input type=submit name='fardig' disabled value='125495-färdig?' onClick="javaScript:document.visabest.action = 'qpsAddHist.asp';"></td><td>Sentext:<input type=text name='sentext' id='125495' onchange='sen();'></td><td>Sign:<input type=text size=2 name='sensign' onchange='sen();'></td><tr class=jamn>
<td width=25 align=center><a href='qpsBestPrp.asp?bestId=62372'>3</a>.</td>
<td width=25 align=center>62372</td>
<td width=130 align=center><a href='qpsBestPrp.asp?bestId=62372'><b>7679KH1032275</b></a></td>
<td width='110' align=center><i></i></td><td width=30 align=center bgcolor=#FFFFFF>1.<input type=checkbox checked disabled></td><td colspan=3 align=right width=30 bgcolor=#FFFFFF><input type=submit name='fardig' disabled value='62372-färdig?' onClick="javaScript:document.visabest.action = 'qpsAddHist.asp';"></td><td>Sentext:<input type=text name='sentext' id='62372' onchange='sen();'></td><td>Sign:<input type=text size=2 name='sensign' onchange='sen();'></td><td colspan=5 align=center bgcolor=#FFFFFF><input type=text size=5 disabled value=1></td><tr>
</table>
</form>
</body>
</html>
voigtann1Medlem sedan juni 20018 810 inlägg
jag få bara fel pga att du kör din sen() funktion när den borde köra sen1()?
jag vet inte om du vill toggla enable/disabled heller (räcker att man ändra båda fälten en gång sen kan man radera texten och ändå behålla knappen tryckbar)
var checkLate = function(lateText, sign, done) {
done.disabled = !(lateText.value.length && sign.value.length);
};
lolukokasosMedlem sedan mars 2001196 inlägg
Och vad händer om du anropar sen1()? Jag får även med din nya kod samma fel som ovan att .length är null eller odefinerat.
Ja, funktionen är att man måste fylla i 2 textfält för att en knappen (intill) ska bli enabled.
voigtann1Medlem sedan juni 20018 810 inlägg
jaha, du sitter i IE8 eller i quirks mode. Kör på :
var sen = function() {
var isNodeList = function (el) {
return typeof el === 'object' && typeof el.length === 'number';
};
var checkLate = function (lateText, sign, done) {
if (lateText.value.length && sign.value.length) {
done.disabled = false;
}
};
return function() {
var sentexts = document.visabest.sentext;
var sensign = document.visabest.sensign;
var fardig = document.visabest.fardig;
if (isNodeList(sentexts)) {
// many
for (var i = 0; i < sentexts.length; i++) {
checkLate(sentexts[i], sensign[i], fardig[i]);
}
} else if(sentexts) {
// single
checkLate(sentexts, sensign, fardig);
}
}
}();
så kommer det fungera förmodligen.
lolukokasosMedlem sedan mars 2001196 inlägg
Voigtann1, jag lyfter på hatten och tackar så väldigt mycket :) :) :)
Efter lite testande så funkade din kod nästan rakt av. Om du har tid så förklara gärna vad som är så speciellt med IE8 och quirk mode. Kan jag förvänta mig att denna kod kommer sluta att fungera vid uppgradering? (den funkade i firefox)
Som sagt, TACK!
voigtann1Medlem sedan juni 20018 810 inlägg
Äldre webbläsare har inte alla metoder och API som de senare webbläsarna ha (i detta fall var det item i nodeList. Quirks mode hamnar du i om du inte ange en korrekt doctype och vissa webbläsare gå ner i version då så du inte kan använda all CSS, JS och en del HTML kod som du normalt kan använda dig av i din aktuella webbläsare.