akila arasan
akila arasan

Reputation: 747

How to get the selected text from text area in react?

I am trying to make a text editor in react.Does anyone knows how to get the selected text from the textarea so that styles can be applied on the selected text.I know we can use window.getSelection in javascript but I am curious to know If any other methods are available for this functionality?

Upvotes: 8

Views: 18558

Answers (3)

Vasant Patil
Vasant Patil

Reputation: 11

How to do it in functional component? Expanding on the answer given by Sanjeev.

function MyEditor() {

const [state,setValue] = useState({value: ""});

//1
const myRef = React.createRef()

const inputsHandler = (e) =>{
    var taxt = e.target.innerHTML
    let textArray = taxt.split(/\n/gm)
    console.log(textArray)
    setValue( {value: e.target.value} )
}

const onDone = () => {
    console.log("on done", stateNew)
    dispatch(updateEditorVisibility())
    // dispatch(props.reducer(state.value))
    dispatch(stateNew.editorReducerAction(state.value))
}



return (
    <div>
        <textarea 
         type="text"
         ref={myRef} 
         name="first_name" 
         onChange={inputsHandler} 
         value={state.value}/>
         <button onClick={() => {       
                let textVal = myRef.current;
                let cursorStart = textVal.selectionStart;
                let cursorEnd = textVal.selectionEnd;
                let selectedText = state.value.substring(cursorStart,cursorEnd) 
                console.log(selectedText)
            }}>Log</button>
    </div>
)}
  1. Create a ref using create ref

    const myRef = React.createRef();

  2. set the ref in your textarea ref={myRef}

  3. To access use

                let cursorStart = textVal.selectionStart;
                let cursorEnd = textVal.selectionEnd;
                let selectedText = state.value.substring(cursorStart,cursorEnd) 
                console.log(selectedText)````
    
    

Upvotes: 0

sanjeev
sanjeev

Reputation: 136

Yes there is a method to do this, specially in React. The way you should go to achieve this is as follow.

step 1:- use ref in your textarea ui element. like

     `<textarea
           className='html-editor'  
           ref='myTextarea' 
          value = {this.state.textareaVal}
          onChange={(event)=>{
                      this.setState({
                         textareaVal:event.target.value;
                      });
                   }}
       >
      </textarea>` 

step 2:- now you can access the DOM element,using react refs.

    let textVal = this.refs.myTextarea; 

step 3:- use selectionStart and selectionEnd :- using selectionStart and
selectionEnd you can get to know your start and end pointer
of selected text.which can be done as below;

        let cursorStart = textVal.selectionStart;
        let cursorEnd = textVal.selectionEnd;

now you have start and end index of your selected text.

step 4 :- use javascript substring function to get the selected text.

    this.state.textareaVal.substring(cursorStart,cursorEnd) 

Upvotes: 12

Boris Ablamunits
Boris Ablamunits

Reputation: 115

The best way to make a Text Editor in React is to use DraftJS.

If you are using React, DraftJS is the way to go about it. It abstracts away many of the challenges you would face while trying to create your own text editor from scratch. This includes managing the state of your editor (similarly to how you would manage a component's state), managing text selection, applying different attributes and so on.

You can get started by checking out the docs, and I would suggest watching the introduction video on that page, which goes through the difficulties DraftJS aims to solve.

I hope that helps.

Upvotes: 0

Related Questions