Avatar billede Kim Neesgaard Seniormester
21. november 2008 - 08:21 Der er 25 kommentarer og
1 løsning

Rens clipboard for linieskift

Jeg har en form med en række textboxe, både singleline og multiline. Brugerne ønsker at kunne 'klippe' tekster fra forskellige datakilder og paste i textboxene. Hvis de klipper en tekst med et linieskift og paster i et singlelinefelt, så kommer kun teksten hen til linieskiftet med og det er der ikke tilfredshed med.

Er det muligt løbende at 'rense' indholdet i clipboardet for linieskift, fx. i en rutine placeret i Page_Load, således at indholdet i clipboadet altid er klart til at blive pasted i en textbox på formen?
Avatar billede montago Praktikant
24. november 2008 - 14:30 #1
hvis kilderne kommer udefra så er der et smart trick man kan lave... men ikke Serverside... du skal bruge java script:

dét man gør er at:

1. fange eventet "CTRL + V"
2. sætte focus på et textarea inden eventet rammer siden
3. lader eventet ramme siden
4. tager texten fra textarea og behandler det
5. kopiere teksten ind i destinationen.

hvis du er JS-noob kan jeg godt give dig et script til det...
Avatar billede montago Praktikant
24. november 2008 - 14:36 #2
jeg ku ik la være...

dette er utestet, men meget tæt på funktionelt:

<html>
    <head>
        <script>
        function paste(e){
            var e = e ? e : window.event;
           
            if( e.ctrlKey && String.fromCharcode(e.charCode).toLower() == "v")
            {
                document.getElementById("hidden").focus();
                document.getElementById("hidden").select();
            }
        }
        function pasteEnd(e, obj){
            var e = e ? e : window.event;
           
            if( e.ctrlKey && String.fromCharcode(e.charCode).toLower() == "v")
            {
                // Behandel textarea
                // indset teksten i obj.value
            }
        }
        </script>
    </head>
    <body onload='func();'>
        <textarea id="hidden"></textarea>
        <asp:textarea runat="server" id="input"
            onKeyDown="paste(e)"
            onKeyUp="pasteEnd(e, this)"/>
    </body>
</html>
Avatar billede Kim Neesgaard Seniormester
24. november 2008 - 14:42 #3
Tak - jeg prøver!
Avatar billede Kim Neesgaard Seniormester
24. november 2008 - 15:05 #4
Jeg har prøvet, men kan ikke få det til at virke. Jeg er ikke en ørn til JS, men skal denne: onload='func();' ikke angives et sted?

Sidste del har jeg rettet til:

<textarea id="hidden" rows="" cols="" onkeydown="paste(e)" onkeyup="pasteEnd(e, this)"></textarea>

da den ellers brokkede sig over 'textarea' - er det ok?
Avatar billede montago Praktikant
24. november 2008 - 23:50 #5
hov... skulle nok have været en <asp:textbox...
lad mig lige kigge på min egen kode...

okay... der skal faktisk kun 1 event til...

function EditPaste()
{
    // tag indholdet af textarea.clipboard
    // behandle den
    // send den til TextFelt
}

function paste()
{
    var e = e ? e : window.event;
         
    if( e.ctrlKey && String.fromCharcode(e.charCode).toLower() == "v")
      document.getElementById("clipboard").value = "";
      document.getElementById("clipboard").select();
      setTimeout(EditPaste, 100);
    }
}

<textarea id="clipboard" style="display:none;"></textarea>

<asp:textbox runat="server" id="TextFelt" onKeyDown="paste(e)" />


det som sker er :

1. paste eventet kommer, og bliver opdaget
2. inden eventet fyrer, flyttes fokus til clipboard, hvor teksten pastes
3. teksten er herefter klar i clipboard'et som kan sendes tilbage med script...
Avatar billede montago Praktikant
24. november 2008 - 23:52 #6
installer Firefox + Firebug

så du klar til at debugge javascript ;-)
Avatar billede olebole Juniormester
25. november 2008 - 01:09 #7
<ole>

Jeg har selv brugt tricket adskillige gange, men det kræver en kontekst, hvor man kender cursorens position - og sætter tekst ind, hvor den står. Desuden er det en god idé at disable kontekstmenuen ved højreklik i feltet, så der ikke kan pastes dén vej.

Det kræver også, man ikke gemmer textarea'et med display eller visibility. I stedet giver man det 'position:absolute;height:0;width:0;border:0'.

Event'en skal medsendes korrekt:
    <asp:textbox runat="server" id="TextFelt" onkeydown="paste(event)" oncontextmenu="return false" />

- hvorefter linjen her kan udelades:
    var e = e ? e : window.event;

/mvh
</bole>
Avatar billede montago Praktikant
25. november 2008 - 08:26 #8
ahh det er rigtigt... jeg husker nu, at jeg flyttede textarea udenfor skærmen...
Avatar billede Kim Neesgaard Seniormester
25. november 2008 - 11:59 #9
montago -> hvordan flytte textbox udenfor skærmen?

onkeydown og oncontextmenu giver fejl: ikke en valid attribute for textbox?
Avatar billede montago Praktikant
25. november 2008 - 12:15 #10
sv: hvordan flytte textbox udenfor skærmen?

postition:fixed; top:-500px; left:0px;


sv: onKeyDown

er det ikke bare Visual Studio som klager ?

sv: onContextMenu

lav den således:

function noContext(evt)
{
  if( evt.button == 2 )
        return false;
  return true;
}

<asp:textbox onclick="return noContext(event)" />
Avatar billede olebole Juniormester
25. november 2008 - 13:03 #11
Så vidt jeg husker, er der ikke enighed omkring button-nummeret mellem browsere/platforme - mens contextmenu-event'en understøtes bredt
Avatar billede olebole Juniormester
25. november 2008 - 13:13 #12
Hmmm ... Opera understøtter ikke oncontextmenu - men heller ikke onclick, når klikket foretages med højreknappen! Hvorfor skal nordmænd også absolut lave browsere, når nu de er så gode til at pumpe olie, sejle med sivbåde og drikke træsprit?  ;D
Avatar billede montago Praktikant
25. november 2008 - 13:47 #13
enig...  Opera burde aflives...
Avatar billede montago Praktikant
25. november 2008 - 13:48 #14
if ( evt.button > 1 ) <-- virker nok bedre
Avatar billede olebole Juniormester
25. november 2008 - 13:55 #15
Ikke i Opera. onclick="alert('HeyHep')" virker ikke engang ved højreklik  :o|
Avatar billede montago Praktikant
25. november 2008 - 14:13 #16
doh...

men som sagt - bedre på tværs af platforme osv, hvis ellers der findes en kombination hvor højreklik == 3

men nu hvor der ikke findes en løsning til Opera brugerne, må disse jo bare lide

måske man kan fange event-boblen før den rammer textfeltet ?

=)
Avatar billede montago Praktikant
25. november 2008 - 15:01 #17
hvad med onFocus ?
Avatar billede montago Praktikant
25. november 2008 - 15:02 #18
heh... glemte lige formålet
Avatar billede olebole Juniormester
25. november 2008 - 15:04 #19
- som Oppenheimer sagde det i 1945  ;D
Avatar billede Kim Neesgaard Seniormester
08. august 2011 - 10:07 #20
For at afslutte dette ældre spørgsmål (sdom jeg selv er skyld i ikke blev afsluttet - beklager og tak for assistance), vil jeg give den løsning, jeg endte med og det er ikke som udgangspunktet at 'rense' clipboard for uønskede tegn. Jeg tager udgangspunkt i selve tekstboksen, som skal renses:

tbTitle.Attributes.Add("onkeyup", "this.value=removeTags(this.value);")

og funktionen angiver jeg som:

//Renser et tekstfelt for linieskift mv.
    function removeTags(str)
{
  str = str.replace(/&nbsp;/ig, ' ');
  str = str.replace(/<[^>]*>/g, '');
  str = str.replace(/(\r|\n|\t)+/g, ' ');
  str = str.replace(/[\ ]{2,}/g, ' ');
  return str;
}

Dette har fungeret til brugernes behov.

Beklager endnu en gang at have været så sen til at svare!!
Avatar billede olebole Juniormester
08. august 2011 - 19:50 #21
Undskyld, men hvor kan du få den kode til at virke?

*) Et HTML elements attribute collection har ingen add metode.

*) Så vidt jeg ved, accepterer ingen gængs browser, at et HTML elements attribute collection staves med stort.

*) Event handlers bør sættes med addEventListener - alernativt attachEvent i IE - men ikke som attribut.

Det kunne være rigtig spændnende at høre lidt om konteksten  =)
Avatar billede Kim Neesgaard Seniormester
09. august 2011 - 19:25 #22
Jeg skal med det samme sige, at jeg IKKE er en ørn indenfor dette, men jeg har samlet lidt hist og pist.

Først den virkemåde, som brugerne ønskede. Det stammer fra et registreringssystem, hvor et af felterne er et titelfelt. Brugerne sakser normalt titlen fra internettet og det man ønskede var, at efter at have overført tekst mv. til klippebordet, så ville man gerne paste den ud i textboksen og når man slap tasten, skulle teksten formatteres, så teksten stod 'pænt'.

Jeg har igen lige prøvet det og det virker altså fantastisk godt, selvom det måske ikke burde det.....
Avatar billede olebole Juniormester
10. august 2011 - 22:31 #23
Kunne jeg bede dig lægge et link til et eksempel, der fungerer - eller bare vise en kode, der gør?

Det er ikke så meget et spørgsmål om, at den ovenstående kode ikke burde fungere. Der eksisterer ikke en browser på markedet, hvori koden kan fungere.

Derfor er vi sikkert mange, der kunne lære noget, hvis vi fik hele forklaringen på, hvad der sker og hvorfor  =)
Avatar billede Kim Neesgaard Seniormester
11. august 2011 - 19:12 #24
Det ligger på et firmanet, så jeg kan ikke lægge et link. Koden under 'svar' har jeg taget direkte fra programmet, men jeg vil gerne i morgen endnu en gang tjekke, at det forholder sig sådan. Hvad er du interesseret i udover koden under svar?
Avatar billede olebole Juniormester
11. august 2011 - 22:52 #25
Et eller andet, der kan forklare, hvordan en kode, der ikke kan fungere, alligevel skulle kunne komme til at virke. Hvad der skulle forklare dette, har jeg ingen anelse om  =)
Avatar billede Kim Neesgaard Seniormester
13. august 2011 - 11:58 #26
Ups - jeg tror, at jeg har været rigtig mangelfuld i mit svar og taget noget for givet, som man ikke skal!! Jeg uddyber her:

Jeg har en .NET applikation kørende og i denne findes den omtalte titel-tekstboks. I codebehindefilen indsætter jeg:

tbTitle.Attributes.Add("onkeyup", "this.value=removeTags(this.value);")

I aspx-filens scriptafsnit indsætter jeg:

//Renser et tekstfelt for linieskift mv.
    function removeTags(str)
{
  str = str.replace(/&nbsp;/ig, ' ');
  str = str.replace(/<[^>]*>/g, '');
  str = str.replace(/(\r|\n|\t)+/g, ' ');
  str = str.replace(/[\ ]{2,}/g, ' ');
  return str;
}

Giver det bedre mening?
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
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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