Avatar billede goose Nybegynder
08. december 2009 - 13:23 Der er 2 kommentarer og
1 løsning

Validering fejler

Jeg har nedenstående kode til at oprette en mappe på serveren. Mappenavne må kun inde a-z, 0-9 samt bindestreg og underscore.

Jeg kan godt få den til at komme med alerten, men den submitter alligevel.

Samtidig, så er der forskel på, om jeg blot trykker på return-tasten eller om jeg klikker på knappen.

Nogle der kan lure den?:

<%
dim sMsg
If Not request("inpNewFolderName")="" Then
  sFolder = request("inpCurrFolder") & "\" & request("inpNewFolderName")

  Set fso = Server.CreateObject("Scripting.FileSystemObject")
  If fso.FolderExists(sFolder) Then
    sMsg = "<script>document.write(getTxt('Folder already exists.'))</script>"
  Else
    on error resume next
    fso.CreateFolder(sFolder)
    if err then
      sMsg = "<script>document.write(getTxt('Invalid input.'))</script>"
    else
      sMsg = "<script>document.write(getTxt('Folder created.'))</script>"
    end if
  End If
  Set fso = Nothing
End If
%>
<base target="_self">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link href="style.css" rel="stylesheet" type="text/css">
<script>
  var sLang=parent.oUtil.langDir;
  document.write("<scr"+"ipt src='language/"+sLang+"/foldernew.js'></scr"+"ipt>");
</script>
<script>writeTitle()</script>

<script>
function doPreSubmit(){
  var Form1 = document.forms.Form1;
  Form1.elements.inpCurrFolder.value=(opener?opener:openerWin).document.getElementById("selCurrFolder").value;
    if(Form1.elements.inpNewFolderName.value.match(/[^a-z0-9 ]/i))
    {
    alert(getTxt("Invalid input."));
    return false;
    }
  return true;
  }
function doSubmit()
  {
  if(doPreSubmit())document.forms.Form1.submit()
  }
</script>
</head>
<body onload="loadTxt()" style="overflow:hidden;margin:0;">

<table width=100% height=100% align=center style="" cellpadding=0 cellspacing=0>
<tr>
<td valign=top style="padding-top:5px;padding-left:15px;padding-right:15px;padding-bottom:12px;height:100%">

<form method=post action="foldernew.asp" onsubmit="doPreSubmit()" name="Form1" id="Form1">
  <br>
  <input type="hidden" id="inpCurrFolder" name="inpCurrFolder">
  <span id="txtLang">New Folder Name</span>: <br>
  <input type="text" id="inpNewFolderName" name="inpNewFolderName" class="inpTxt" size=38>
  <div><b><%response.Write sMsg%> </b></div>
</form>

</td>
</tr>
<tr>
<td class="dialogFooter" align=right>
  <table cellpadding="1" cellspacing="0">
    <tr>
    <td>
      <input style="width:135" type="button" name="btnCloseAndRefresh" id="btnCloseAndRefresh" value="close & refresh" onclick="(opener?opener:openerWin).changeFolder();self.close();" class="inpBtn" onmouseover="this.className='inpBtnOver';" onmouseout="this.className='inpBtnOut'"> <input name="btnCreate" id="btnCreate" type="button" onclick="doSubmit()" value="create" class="inpBtn" onmouseover="this.className='inpBtnOver';" onmouseout="this.className='inpBtnOut'">
    </td>
    </tr>
  </table>
</td>
</tr>
</table>

</body>
</html>

/Goose
Avatar billede intenz Novice
08. december 2009 - 13:44 #1
Der er to ting i det.
Din doSubmit() funktion er sat som onclick på submit knappen. Derfor virker den kun når man klikker på submit, og ikke ved 'enter'.

I dit form element kører du onsubmit, hvilket er fint. Men den submitter uanset hvad fordi du ikke returnerer din true/false til formen også. Ændre det til:

<form method=post action="foldernew.asp" onsubmit="return doPreSubmit()" name="Form1" id="Form1">

Så bør du ikke havde grund til, at bruge din doSubmit() funktion mere. Da formen vil submitte sig selv hvis du får return true.
Avatar billede goose Nybegynder
08. december 2009 - 17:32 #2
Nu har jeg så prøvet at tilrette efter det du skriver (mener jeg selv) og fjernet den der doSubmit() og nu virker det, bortset fra, at jeg nu kun kan submitte med return-tasen, min kanp virker ikke?

<script>
function doPreSubmit(){
    var regtest = /^[a-z0-9_\-]*$/i;   
  var Form1 = document.forms.Form1;
  Form1.elements.inpCurrFolder.value=(opener?opener:openerWin).document.getElementById("selCurrFolder").value;
    if(!Form1.elements.inpNewFolderName.value.match(regtest))
    {
    alert(getTxt("Invalid input."));
    return false;
    }
  return true;
  }
</script>
</head>
<body onload="loadTxt()" style="overflow:hidden;margin:0;">


<form method=post action="foldernew.asp" onsubmit="return doPreSubmit();" name="Form1" id="Form1">
<table width=100% height=100% align=center style="" cellpadding=0 cellspacing=0>
<tr>
<td valign=top style="padding-top:5px;padding-left:15px;padding-right:15px;padding-bottom:12px;height:100%">

  <br>

  <input type="hidden" id="inpCurrFolder" name="inpCurrFolder">
  <span id="txtLang">New Folder Name</span>: <br>
  <input type="text" id="inpNewFolderName" name="inpNewFolderName" class="inpTxt" size=38>
  <div><b><%response.Write sMsg%>&nbsp;</b></div>



</td>
</tr>
<tr>
<td class="dialogFooter" align=right>
  <table cellpadding="1" cellspacing="0">
    <tr>
    <td>
      <input style="width:135" type="button" name="btnCloseAndRefresh" id="btnCloseAndRefresh" value="close & refresh" onclick="(opener?opener:openerWin).changeFolder();self.close();" class="inpBtn" onmouseover="this.className='inpBtnOver';" onmouseout="this.className='inpBtnOut'">&nbsp;<input name="btnCreate" id="btnCreate" type="submit" value="create" class="inpBtn" onmouseover="this.className='inpBtnOver';" onmouseout="this.className='inpBtnOut'">
    </td>
    </tr>
  </table>
</td>
</tr>
</table>
</form>

/Goose
Avatar billede goose Nybegynder
08. december 2009 - 22:22 #3
Fik det til at virke med noget kombineret serverside validering, så jeg lukker igen. Tak for hjælpen.

/Goose
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester