<script src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
<div id="container">
<!-- This element's contents will be replaced with your component. -->
</div>
// yeah, browser sniffing sucks, but there are browser-specific quirks to handle that are not a matter of feature detection
var ua = window.navigator.userAgent.toLowerCase();
var isIE = !!ua.match(/msie|trident\/7|edge/);
var isWinPhone = ua.indexOf('windows phone') !== -1;
var isIOS = !isWinPhone && !!ua.match(/ipad|iphone|ipod/);
class Highlights extends React.Component {
render() {
let __html = this.props.children
.replace(/\n$/g, '\n\n')
.replace(/[A-Z].*?\b/g, '<mark>$&</mark>');
if (isIE) {
// IE wraps whitespace differently in a div vs textarea, this fixes it
__html = __html.replace(/ /g, ' <wbr>');
}
return <div ref="elem" className="backdrop">
<div className="highlights" dangerouslySetInnerHTML={{__html}} />
</div>
}
componentDidUpdate() {
this.refs.elem.scrollTop = this.props.scrollTop;
}
}
class Textarea extends React.Component {
constructor(props) {
super(props);
this.listenScrollEvent = this.listenScrollEvent.bind(this)
this.state = {
scrollTop:0,
text: `This demo shows how to highlight bits of text within a textarea. Alright, that's a lie. You can't actually render markup inside a textarea. However, you can fake it by carefully positioning a div behind the textarea and adding your highlight markup there. JavaScript takes care of syncing the content and scroll position from the textarea to the div, so everything lines up nicely. Hit the toggle button to peek behind the curtain. And feel free to edit this text. All capitalized words will be highlighted.`
};
}
componentDidMount() {
this.refs.textarea.addEventListener('scroll', this.listenScrollEvent);
}
componentWillUnmount() {
this.refs.textarea.removeEventListener('scroll', this.listenScrollEvent);
}
listenScrollEvent() {
this.setState({scrollTop:this.refs.textarea.scrollTop})
}
render() {
return <div className="container">
<Highlights scrollTop={this.state.scrollTop}>{
...
Please Whitelist JSFiddle in your content blocker.
Help keep JSFiddle free for always by one of two ways:
Whitelist JSFiddle in your content blocker (two clicks)
Go PRO and get access to additional PRO features →
Join the 4+ million users, and keep the JSFiddle dream alive.
Ad-free
All ads in the editor and listing pages are turned completely off.
Use pre-released features
You get to try and use features (like the Palette Color Generator) months before everyone else.
Fiddle collections
Sort and categorize your Fiddles into multiple collections.
Private collections and fiddles
You can make as many Private Fiddles, and Private Collections as you wish!
Console
Debug your Fiddle with a minimal built-in JavaScript console.