2011-05-04 8 views
20

Mam textarea i div z wartościami. Kiedy klikam na wartość, wstawiam ją do textarea. Potrzebuję go wstawić tam, gdzie mój kursor był w textarea. Dlaczego mówię "WAS"? Ponieważ kiedy go wypuszczę i kliknę na wartość, którą chcę wstawić, zakładam, że traci ostrość w obszarze tekstowym.Wprowadź wartość do TEKSTYLIKACJI, gdzie kursor był

Moje pytanie brzmi: czy istnieje sposób, aby "zapamiętać" ostatnią pozycję kursora w obrębie pola tekstowego, a następnie wstawić moje wartości w tej pozycji? ?

Może to być liczba char w ciąg .. Obecnie dodam to tak:

input.val(function(i, val) { return val + " " + myInsert + " "; }); 

Również używam jQuery, chyba mogę go używać?

+1

Zadałem sobie to samo pytanie jakiś czas temu: http://stackoverflow.com/questions/5605401/insert-link-in-contenteditable-element – PeeHaa

Odpowiedz

17

Napisałem wtyczkę jQuery z różnymi przeglądarkami do obsługi daszka/selekcji w tekstach i wejściach tekstowych o nazwie Rangy inputs (straszna nazwa, naprawdę powinienem wymyślić lepszy).Połączenie metod z tego i technik w Edgar Villegas Alvarado's answer powinno wystarczyć, choć w IE, Zdarzenie focusout zbyt późno i będziesz musiał używać zastrzeżonych beforedeactivate zdarzenie Zamiast:

var $textBox = $("#foo"); 

function saveSelection(){ 
    $textBox.data("lastSelection", $textBox.getSelection()); 
} 

$textBox.focusout(saveSelection); 

$textBox.bind("beforedeactivate", function() { 
    saveSelection(); 
    $textBox.unbind("focusout"); 
}); 

Podczas wstawiania tekstu później dodaje wstawi tekst w poprzedniej pozycji kursora (lub zastąpienie wcześniej zaznaczonego tekstu, jeśli użytkownik wybrał występuje):

var selection = $textBox.data("lastSelection"); 
$textBox.focus(); 
$textBox.setSelection(selection.start, selection.end); 
$textBox.replaceSelectedText("Some new text"); 

Patrz jsFiddle przykładem: http://jsfiddle.net/rQXrJ/1/

+0

To jest świetne !, jednak w IE tag jest wstawiany na początku ciągu znaków. Działa wspaniale w FF. – santa

+0

To dlatego, że 'focusout' też jest późno w IE: musisz użyć 'beforedeactivate'. Zmieniając ... –

+2

@santa: ... Zrobione –

1

Jeśli kursor (kursor) znajduje się gdzieś w polu tekstowym, rejestruje się w Javascript jako pusty wybór. Oznacza to, że atrybuty selectionStart i selectionEnd są takie same. Możesz użyć tych atrybutów, aby wykryć pozycję karetki.

+0

Nadal nie jestem pewien, w jaki sposób wstawiłbym swoją wartość, gdybym znał pozycję opiekuna? Jestem zdesperowany na kilka przykładów. Dzięki. – santa

1

Możesz użyć jQuery Caret plugin, aby uzyskać/ustawić pozycję kursora.
Przykład użycia:

var cursorPosition = $("#textbox").caret().start); 

Mogłeś 'sklep' to pozycja tak:

$("#textbox").focusout(function(){ 
    var cursorPosition = $(this).caret().start); 
    $(this).data("lastCursorPos", cursorPosition); 
}); 

Aby je odzyskać (na zdarzenia click div), wykonaj następujące czynności:

var lastCursorPosition = $("#textbox").data("lastCursorPos"); 

Mam nadzieję że to pomoże. Cheers

+0

Brzmi obiecująco, dzięki. Jak wstawić wartość do tej pozycji? – santa

+0

wydaje się nie działać w Chrome :-( –

2

Oto przykład roboczych, co staramy się robić to sprawdzić pod adresem: http://jsfiddle.net/J5Z2n/1/

 
Hello there my good friend.... 
how do you do 

jQuery:

 
function insertAt (myField, myValue, startSel, endSel) { 
    if (startSel || startSel == '0') { 
     var startPos = startSel; 

     var endPos = endSel; 

     myField.val(myField.val().substring(0, startPos)+ myValue+ myField.val().substring(endPos, myField.val().length)); 

    } 
    else { 

     myField.val() += myValue; 

    } 
} 

// calling the function 
var targetBox = $('textarea#insert'), 
    startSel, 
    endSel; 
targetBox.bind('focusout', function() { 
    //insertAtCursor(this, 'how do you do'); 
    startSel = this.selectionStart; 
    endSel = this.selectionEnd; 
}); 

    $("#myvalue").click(function() { 
     var myValue = $(this).text(); 
     insertAt(targetBox, myValue, startSel, endSel); 

    });  

Oryginalny funkcja została zapożyczona z tego postu http://alexking.org/blog/2003/06/02/inserting-at-the-cursor-using-javascript

To powinno dać ci solidny start, mam nadzieję. Pozdrowienia

+0

nie działa w najnowszym firefoxie –

Powiązane problemy