View Full Version : Inconsistant behavior from script
Matt Pearson
06-22-2002, 05:05 PM
Hi everyone,
can anyone see whats wrong with this function?
It copys the data to all form elements
begining with "s" from form elements whose name is the same minus an s
so "name" is copied to "sname"
"address to "saddress" etc...
its looks for the first character a position 5 because this form submits to PHP and the elements have names like "form[name]" rather than normal element names.
about 1 in every 20 times it fails :(
function sameAs(thisform){
thisform = document.check1
for (n=10;n<thisform.elements.length;n++){
if (thisform.elements[n].name.charAt(5)=="s"){
if(thisform.elements[n].type=="text"){
halfstring=thisform.elements[n].name.substring(6,thisform.elements[n].name.length)
fullstring="form[" + halfstring
thisform.elements[n].value = thisform.elements[fullstring].value
}
else if(thisform.elements[n].type=="select-one"){
halfstring=thisform.elements[n].name.substring(6,thisform.elements[n].name.length)
fullstring="form[" + halfstring
thisform.elements[n].selectedIndex = thisform.elements[fullstring].selectedIndex
}
}
}
}
thanks for any help.
Matt
JohnKrutsch
06-22-2002, 08:26 PM
Post your form as well so we can get a look.
TrueLies
06-22-2002, 08:32 PM
Hi
I'm sorry to say that your question is not clear. Also, without the relastive html it is very hard to guess.
What I can do, I can analyze your script with you and point out sensitive points so you can check whether the error might be that:
function sameAs(thisform){
thisform = document.check1
/*you pass an ragument, then you reassign it: why? If it is an argument, it should already be referenced: sameAs(this.form) or sameAs(document.check1) . So question is: are you sure you meant to redraw the passed arguments? for if so, no reason to pass an ragument at all.*/
for (n=10;n<thisform.elements.length;n++){
/*n=10, correct? If a form has elements length==10, the loppo doesn't start, is this what you want?*/
if (thisform.elements[n].name.charAt(5)=="s"){
/*charAt(5) means on a name of 6 (SIX) chars, check the sixth: indexes start with 0: a possible issue here? I don't know.*/
if(thisform.elements[n].type=="text"){
halfstring=thisform.elements[n].name.substring(6,thisform.elements[n].name.length)
/*substring 6? you sure? First index of substring method is inclusive: close range at beginning, openr ange at end: so if charAt(5)=="s" on "abcdes", substring(6) is undefined for last element is index 5. Possible issue here? */
fullstring="form[" + halfstring
/*what is that? what is it for? the returned string is:
"form[anameMAYBE" with no closing square bracket. Also, the index might be undefined given the observation on substring(6)*/
thisform.elements[n].value = thisform.elements[fullstring].value
/*this apparently can't be: the reference is:
thisform.elements[ "form[anameMAYBE" ].value
still I see a missing bracket in the literal index (in itself legitimate)
*/
}
else if(thisform.elements[n].type=="select-one"){
halfstring=thisform.elements[n].name.substring(6,thisform.elements[n].name.length)
fullstring="form[" + halfstring
thisform.elements[n].selectedIndex = thisform.elements[fullstring].selectedIndex
/*same as above*/
}
}
;aybe I didn't udnerstand some part of your codes for I didn't understand well your question, but maybe these hints can point you in the right direction anyway.
The two major issues I see: a literal which includes an opening bracket but I see no closing one.
A charAt starting at 5 and a substring starting at 6, but what if moreover the length is 6: the higher index is 5.
I hope this helps
ciao
}
}
Matt Pearson
06-22-2002, 09:24 PM
Hi,
the form that uses this script is at:
www.essentialoilsdirect.com/basket.php
click on "go to checkout"
(it doesn't matter that the basket's empty, but the page needs to be passed a basket to display the form.)
Just to clear up your points:
1)yes that argument bit is dodgy, I must have been asleep when i coded that, thanks for spotting it ;)
2)n=10 because I want the loop to ignore the first
10 elements in the form, they are things like
"form[street]"
which my loop would try and fill with data from
"form[treet]"
If I let it act on those elements.
3)I charAT(5) and Substring(6,... because I want to know if the first character after the "form[" bit is an "S"
The Substring bit is reading after that character because that is what I use to differentiate the source fields from the ones I want to copy data into.
Substring also pulls out the closing bracket, when it reads after the leading s it returns "name]"
which my function bolts "form[" onto to make the real name of the element.
The whole purpose of this script is to find an element begining with s (such as "form[sname]") and fill it with the data from the element that has the same name without the leading "s" (so in that case "form[name]"
PS:The javascript is referenced from an external file, I would post that, but it is quite large. I am satisfied that everything else in it works OK and the problem is with this function.
Thanks for all your help :)
Matt
TrueLies
06-22-2002, 09:44 PM
Hi
uhm, I am still scartching my head to make sure I understood ha ha.
Ok, let's try this snippet:
function sameAs(thisform){
thisform = document.check1
for (n=10;n<thisform.elements.length;n++){
if (thisform.elements[n].name.charAt(5)=="s"){
if(thisform.elements[n].type=="text"){
halfstring=thisform.elements[n].name.substring(6,thisform.elements[n].name.length)
fullstring="form[" + halfstring;
/*BELOW: added ''code'' by me*/
if(!confirm("can't find form field whose name is: "+fullstring)){return false}
thisform.elements[n].value = thisform.elements[fullstring].value
}
else if(thisform.elements[n].type=="select-one"){
halfstring=thisform.elements[n].name.substring(6,thisform.elements[n].name.length)
fullstring="form[" + halfstring
thisform.elements[n].selectedIndex = thisform.elements[fullstring].selectedIndex
}
}
}
}
Apparently, the fields with the extracted name might not exist. is this hint useful?
let us know
ciao
vBulletin® v3.8.2, Copyright ©2000-2012, Jelsoft Enterprises Ltd.