Probleem met selectie textarea veranderen

Pagina: 1
Acties:

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
Ik heb een form met daarin een textarea. Nu wil ik dat daarin (in het geselecteerde gedeelte) simpel een stukje code gezet kan worden doormiddel van een dialog. Dat heb ik gemaakt doormiddel van een aparte pagina die open met de open() method.

In dat dialog komt een lijst met linkjes en als je op een klikt is het dus de bedoeling dat er een stukje code die bij dat linkje hoort in de textarea gezet wordt. Dat heb ik al eens eerder gedaan met een gewone input text, maar het verschil daarbij is dat ik geen selectie gebruikte maar gewoon direct de value van de text veranderde. Als ik nu een stukje geselecteerd heb in de textarea en op de link klik, is de selectie in de textarea verdwenen.

Ik gebruik nu opener.document.selection.createRange().text = "string" maar als ik niets geselecteerd heb zet ie "string" gewoon netjes bovenin de pagina (?). Ik weet dat dit IE only is en dat de persoon die dit gaat gebruiken alleen IE gebruikt.

Heeft iemand een oplossing? Het mag ook een geheel andere aapak zijn.

Noushka's Magnificent Dream | Unity


  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

Volgens mij werkt het hier op GoT ook op de manier zoals jij wilt... Je zou de source ff in kunnen duiken om te kijk hoe het is gedaan.

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
BtM909 schreef op 03 maart 2003 @ 15:36:
Volgens mij werkt het hier op GoT ook op de manier zoals jij wilt... Je zou de source ff in kunnen duiken om te kijk hoe het is gedaan.
Je bedoelt zeker met die smileys. Dat is iets anders want er opent dan geen popup venstertje. Je verliest je selectie dan niet.

Noushka's Magnificent Dream | Unity


Verwijderd

Michali schreef op 03 maart 2003 @ 15:38:
[...]


Je bedoelt zeker met die smileys. Dat is iets anders want er opent dan geen popup venstertje. Je verliest je selectie dan niet.
Dus is het wellicht een mogelijkheid om geen popup te openen maar om het allemaal op dezelfde pagina te houden?

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
Ik zou het kunnen oplossen met een iframe, maar dat vind ik lang niet zo mooi en functioneel. Het neemt dan ook weer een aardig gedeelte van de pagina in beslag terwijl dat gedeelte weinig of niet nodig is.

Noushka's Magnificent Dream | Unity


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 10:36

crisp

Devver

Pixelated

Probeer deze eens; werkt ook in recente Mozilla versies:

main.html:
HTML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Text insert</title>
<script type="text/javascript">

var target = null;
function getTarget(el) {

  target = (document.getElementById)? document.getElementById(el):0;

}

function storeCursor(el) {

  if (document.all && el.createTextRange) el.cursorPos = document.selection.createRange().duplicate();

}

function putStr(text) {

  if (target) {

    if (document.all && target.cursorPos) {

      target.cursorPos.text = text;

    } else if (target.selectionStart != undefined) {

      var sStart = target.selectionStart;
      var sEnd = target.selectionEnd;
      target.value = target.value.substr(0, sStart) + text + target.value.substr(sEnd, target.value.length);
      target.selectionStart = (sStart == sEnd)? sStart + text.length:sStart;
      target.selectionEnd = sStart + text.length;

    } else {

      target.focus();
      target.value += text;

    }

    target.focus();
    storeCursor(target);

  }

}

function openwin() {

  window.open('window.html', 'blaat', 'height=300,width=400,top=100,left=100');

}

</script>
</head>
<body onload="document.forms['message'].elements['content'].focus();getTarget('content');">
<form name="message">
<textarea id="content" name="content" rows="9" cols="45" style="width: 384px; height: 150px" onfocus="getTarget('content')" onselect="storeCursor(this)" onkeyup="storeCursor(this)" onclick="storeCursor(this)"></textarea><br />
</form>
<a href="javascript://" onclick="openwin();return false">open window</a>
</body>
</html>


window.html:
HTML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Selectie</title>
<script type="text/javascript">

function insertString(text) {

  opener.putStr(text);
  window.close();

}

</script>
</head>
<body>
<a href="javascript://" onclick="insertString('Geachte ');return false">Aanhef</a><br />
<a href="javascript://" onclick="insertString('Met vriendelijke groet,');return false">Mvg</a><br />
<a href="javascript://" onclick="insertString('crisp');return false">crisp</a><br />
</body>
</html>

Intentionally left blank


  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
function putStr(text) {

  if (target) {

    if (document.all && target.cursorPos) {

      target.cursorPos.text = text;

    } else if (target.selectionStart != undefined) {

      var sStart = target.selectionStart;
      var sEnd = target.selectionEnd;
      target.value = target.value.substr(0, sStart) + text + target.value.substr(sEnd, target.value.length);
      target.selectionStart = (sStart == sEnd)? sStart + text.length:sStart;
      target.selectionEnd = sStart + text.length;

    } else {

      target.focus();
      target.value += text;

    }

    target.focus();
    storeCursor(target);

  }

document.selection.createRange().text = text;

}


Toen ik dat laatste regeltje toevoegde deed ie het :). Zonder die laatste regel kreeg ik alleen de selectie terug.

Noushka's Magnificent Dream | Unity


Verwijderd

bij mij werkt het stukje van Crisp perfect... alleen een beetje lastig dat hij na iedere plaatsing van een smil o.d. het venster sluit... maar dat kan je zo weghalen :)

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 10:36

crisp

Devver

Pixelated

Michali schreef op 03 March 2003 @ 16:44:
[...]

Toen ik dat laatste regeltje toevoegde deed ie het :). Zonder die laatste regel kreeg ik alleen de selectie terug.
eeuuhhh, volgens mij begrijp je de code niet helemaal; je omzeilt nu de check of er ueberhaupt een target is, plus de crossbrowser checks daarin en voert rucksichloos een IE-only method uit die ook al in de functie eerder verwerkt zit, nl
JavaScript:
1
target.cursorPos.text = text;

Laat anders je complete code eens zien...

Intentionally left blank


  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
ik heb het gewoon precies zo in gezet als jij hebt neer gezet. Als ik dat in de textarea een stukje text selecteer, dan de dialog open en een stukje text probeer terug te zetten, dan is het enige wat er gebeurt dat het stukje weer geselecteerd is.

whoops, was wat vergeten. Het werkt wel. :) danku

[ Voor 10% gewijzigd door Michali op 03-03-2003 17:04 ]

Noushka's Magnificent Dream | Unity


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 10:36

crisp

Devver

Pixelated

Michali schreef op 03 March 2003 @ 16:57:
ik heb het gewoon precies zo in gezet als jij hebt neer gezet. Als ik dat in de textarea een stukje text selecteer, dan de dialog open en een stukje text probeer terug te zetten, dan is het enige wat er gebeurt dat het stukje weer geselecteerd is.

whoops, was wat vergeten. Het werkt wel. :) danku
Mooi :)

Ik maak dus gebruik van een global variabele target zodat je deze methode ook met meerdere textareas tegelijk kan toepassen. Onload geef ik dan de default textarea aan. Dit is dus een copy-paste uit mijn gastenboek, en toevallig kwam ik er vandaag achter hoe ik dit ook in Mozilla werkend kon krijgen :)

Intentionally left blank

Pagina: 1