Detta är ett av de största UI-problemen som i huvudsak orsakas av ASP.NET:s regel "en enda form", eftersom Darrell Ordförande påpekar att det finns ett antal lösningar där ute men ingen av dem verkligen lösa hela problemet (dvs. för alla webbläsare), väl nu finns det en bra lösning - från Darrell Nortons blogg (länk): (reproduceras här eftersom jag aldrig kommer att hitta det igen annars ...)
Skicka in standardknappar när användaren trycker på returtangenten - äntligen!
En av de svåraste sakerna i webbutveckling är att få en viss knapp att skicka in om du har mer än en knapp på sidan. Andy Smith, av Metabyggare kändisskap, har en som fungerar för sent modell webbläsare.
På grund av ganska strikta kundkrav för en offentlig e-handel webbplats, behövde jag något som gick längre tillbaka i webbläsarens historia. Jag hittade en kodprov från Janus Kamp Hansen Det fungerade bara för IE.
Jag utökade det till att fungera med Mozilla och Netscape 6+, sedan lagt till lite mer kod för att få det att fungera med de flesta Netscape 4+ webbläsare. Sedan ändrade jag prestanda lite, och det är det! En snabb, lätt att använda kod sippet för att tvinga specifika skicka knappar för att skjuta från utvecklarbestämda textrutor.
Först kopiera denna metod till en lättillgänglig plats:
offentligt tomrum SetDefaultButton( sidsida, textruta textKontroll, knapp standardknapp)
{
*// Sets default buttons.* *// Originally created by Janus Kamp Hansen - http://www.kamp-hansen.dk* *// Extended by Darrell Norton - http://dotnetjunkies.com/weblog/darrell.norton/* *// -- added Mozilla support, fixed a few issues, improved performance* *string theScript = @"*<SCRIPT språk="javascript">
Funktion fnTrapKD( btn, händelse) {
om (dokument. alla) {
Om (event.keyCode ==13) {
händelse.returnValue=false;
Event.cancel = sant.
btn.click();
}
}
annat om (dokument.getelementById) {
om (händelse som ==13) {
händelse.returnValue=false;
Event.cancel = sant.
btn.click();
}
}
annars om (dokument. lager) {
Om (händelsen som ==13) {
händelse.returnValue=false;
Event.cancel = sant.
btn.click();
}
}
}
<RÄTTSLIGA OCH INRIKES FRÅGOR>";
*Page.RegisterStartupScript("ForceDefaultToScript", theScript);* *textControl.Attributes.Add("onkeydown", "fnTrapKD(" + defaultButton.ClientID + ",event)");*}
Den här koden registrerar det givna skriptet med sidan. Sedan lägger den till ett attribut till textrutan, som i det här fallet är en onKeyDown- händelse som kallar funktionen fnTrapKD med knappen clientID (det är HTML- ID i renderad HTML) och händelsen. Jag var tvungen att passera händelsen eftersom Netscape/Mozilla webbläsare inte kan fånga denna typ av händelse om du inte skickar in den till funktionen. IE kan komma åt händelsen från dokumentobjektet, men vi vill ha något trevligt och cross-rowser kompatibel.
Dokumentet.alla om uttalande omfattar IE.Dokumentet.getElementById täcker Netscape 6+ och Mozilla webbläsare. Document.layers om uttalande fungerar med Netscape 4+.
Lägg nu till en kodrad som länkar varje textruta som du vill ha med en viss inmatningsknapp. Till exempel:
*SetDefaultButton(this, TextBox1, Button1);* *SetDefaultButton(this, TextBox2, Button2);* *SetDefaultButton(this, TextBox3, Button3);*Jag brukar lägga det på sidan_Load, eftersom Page.RegistrateStartupScript metod ignorerar duplicerade skript. Nu är det helt enkelt en fråga om att ringa ett samtal till SetDefaultButton för varje textbox- skicka knapp association.
Jag har inte testat detta i stor utsträckning ännu, och en del av JavaScriptet kan vara onödigt. Och med tanke på antalet Netscape 4 versioner (och deras buggighet), det förmodligen inte fungerar på alla av dem. Men det fungerar (för nu). Och åtminstone göra ett försök på Netscape 4+ och IE 5+ kommer att täcka 99% av min webbplats eller webbläsare.
© 2026 Scott Galloway — Unlicense — All content and source code on this site is free to use, copy, modify, and sell.