2016-10-24 17 views
10

प्रतिक्रिया में बाहरी पाठ परिवर्तन घटनाओं को कैसे पढ़ा जाए।प्रतिक्रिया: बाहरी ऑन चेंज इवेंट

Grammarly और Auto Text Expander जैसे एक्सटेंशन टेक्स्टरेरा के अंदर टेक्स्ट अपडेट करते हैं, लेकिन परिवर्तन के बाद चेंज या ऑन इनपुट ईवेंट को कोई प्रतिक्रिया नहीं दी जाती है। नतीजतन, राज्य अद्यतन नहीं होता है और स्थिति असंगत है (टेक्स्टरेरा और घटक के राज्य में अलग-अलग मान)। एक तरीका सबमिट पर डोम वैल्यू को पढ़ना है, लेकिन यह मेरे परिदृश्य के लिए सही समाधान नहीं है, क्योंकि कुछ अन्य क्रियाएं टेक्स्टरेरा के वर्तमान मूल्य पर निर्भर करती हैं। कोई अच्छा समाधान?

पीएस: मैं एक सामान्य समाधान मांग रहा हूं। एक्सटेंशन कोड बदलना एक विकल्प नहीं है।

+2

ठीक है, बात यह है कि 'इनपुट' या 'टेक्स्टरेरा' एचटीएमएल उन एक्सटेंशन द्वारा नियोजित '.value' संपत्ति के प्रत्यक्ष संशोधनों पर नहीं बदलता है। यदि आपको टेक्स्ट तत्व है तो आपको समय-समय पर 'document.activeElement.value' को मतदान करना होगा। – wOxxOm

+0

मतदान मेरे लिए एक सही समाधान नहीं है। कोई अन्य विचार? – manish

+0

ठीक है, चूंकि उन एक्सटेंशन कुछ 'कुंजीडाउन' या अन्य हार्डवेयर ईवेंट के बाद मान को सही करते हैं, इसलिए आप उनको सुन सकते हैं और थोड़ी देर के लिए मतदान कर सकते हैं, फिर रुकें। – wOxxOm

उत्तर

0

जब आप एक jQuery इनपुट प्लगइन का उपयोग करते हैं तो आपको इस तरह की समस्या हो सकती है और प्लगइन .prop विधि के बजाय .attr विधि का उपयोग करता है, जो ऑन चेंज ईवेंट को ट्रिगर करता है। इस मामले में, आपको प्लगइन द्वारा प्रदान किए गए कॉलबैक हैंडलर पर भरोसा करना होगा।

आपके मामले में ऐसा लगता है कि ऐसा कॉलबैक हैंडलर है। (कोड उपलब्ध होने पर यह जांचने में कभी दर्द नहीं होता है।) फिर, एकमात्र विकल्प मतदान होता है, जो बदसूरत लेकिन अपरिहार्य है।

-1

आप componentDidMount के अंदर सभी या एक विशिष्ट टेक्स्टरेरा के ईवेंट श्रोता को जोड़ सकते हैं (कार्यान्वयन के लिए स्निपेट देखें)। यह प्रतिक्रिया के अंदर राज्य अद्यतन करेगा। स्निपेट को टिप्पणी के साथ अच्छी तरह से संबोधित किया गया है। यह आपकी मदद करनी चाहिए!

class KeyTrace extends React.Component { 
 
    constructor(props) { 
 
    super(props) 
 
    this.setValueToState = this.setValueToState.bind(this) 
 
    this.state = {} //initial state 
 
    } 
 
    setValueToState(e) { 
 
    this.setState({ 
 
    [e.target.id]: e.target.value //set the new value in the state as {[id]: [value]} pair 
 
    }) 
 
    } 
 
    componentDidMount() { 
 
    const textareas = document.querySelectorAll('textarea') //finds all textarea in the DOM 
 
    const textareasArray = [...textareas] //convert the HTML Collection into array 
 
    textareasArray.forEach((el) => { //loop through the array 
 
     if (el.id === 'update') //add onchange listener for specific textareas (optional) 
 
     el.onchange = this.setValueToState //add a event listener 
 
    }) 
 

 
    } 
 
    render(){ 
 
    console.log(this.state) 
 
    return false 
 
    } 
 
} 
 

 
ReactDOM.render(<KeyTrace/>, document.getElementById('react'))
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script> 
 
<div id="non-react"> 
 
    Changes will be stored in react state 
 
    <br/> 
 
    <textarea id="update"></textarea> 
 
    <br/>Changes will not be stored in react state 
 
    <br/> 
 
    <textarea id="wont-update"></textarea> 
 
    <br/> 
 
</div> 
 
<div id="react"></div>

पी एस। onchange ईवेंट को आग लगाने के लिए आपको blur (टेक्स्टरेरा के बाहर क्लिक करें) टेक्स्टरेरा की आवश्यकता है। अन्यथा, आप onchange के बजाय onkeypress का उपयोग कर सकते हैं।

+0

आपका नमूना इरादे के रूप में काम नहीं करता है। 'document.getElementById ('अपडेट')। value = 'नोप' राज्य को अपडेट नहीं करेगा। –

+0

'ऑन चेंज' का अर्थ है जब आप 'textarea' के मान को बदलते हैं तो टेक्स्टरेरा में नया मान सेट नहीं करते हैं। –

0

हालांकि इस तरह के परिदृश्य के साथ दिमाग में लिखा नहीं गया है, शायद https://github.com/erikras/react-native-listener आपको जो चाहिए वो हासिल करने में आपकी मदद कर सकते हैं ?!

+0

यदि आप टिप्पणी नहीं कर सकते हैं, तो कृपया इसके बजाय उत्तर का उपयोग न करें। या कम से कम एक जवाब देने का प्रयास करें, यहां तक ​​कि एक गरीब भी। – Badda

संबंधित मुद्दे