2017-04-19 10 views
10

में divs पर काम नहीं कर रही है मैं प्रतिक्रिया में एक div पर एक keyDown घटना का उपयोग करना चाहता हूँ। मैं करता हूं:पर केडडाउन घटना प्रतिक्रिया

componentWillMount() { 
     document.addEventListener("keydown", this.onKeyPressed.bind(this)); 
    } 

    componentWillUnmount() { 
     document.removeEventListener("keydown", this.onKeyPressed.bind(this)); 
    }  

    onKeyPressed(e) { 
    console.log(e.keyCode); 
    } 

    render() { 
    let player = this.props.boards.dungeons[this.props.boards.currentBoard].player; 
    return (
     <div 
     className="player" 
     style={{ position: "absolute" }} 
     onKeyDown={this.onKeyPressed} // not working 
     > 
     <div className="light-circle"> 
      <div className="image-wrapper"> 
      <img src={IMG_URL+player.img} /> 
      </div> 
     </div> 
     </div> 
    ) 
    } 

यह ठीक काम करता है, लेकिन मैं इसे प्रतिक्रिया शैली में और अधिक करना चाहता हूं। मैंने

 onKeyDown={this.onKeyPressed} 

घटक पर कोशिश की। लेकिन यह प्रतिक्रिया नहीं करता है। यह मुझे याद करते हुए इनपुट तत्वों पर काम करता है।

Codepen: http://codepen.io/lafisrap/pen/OmyBYG

मैं इसे कैसे कर सकता है?

उत्तर

19

आप का उपयोग करना चाहिए tabindex विशेषता प्रतिक्रिया में एक div पर घटना OnKeyDown सुनने के लिए सक्षम होने के लिए। टैबइंडेक्स = "0" को सेट करना आपके हैंडलर को आग लगाना चाहिए।

1

आप इसे इस तरह

<div 
    className="player" 
    style={{ position: "absolute" }} 
    onKeyDown={this.onKeyPressed} 
    tabIndex="0" 
    > 

तो onKeyPressedthis करने के लिए बाध्य नहीं है लिखने के लिए है, तो तीर समारोह का उपयोग कर इसे फिर से लिखने या घटक constructor में यह बाध्य करने की कोशिश की जरूरत है।

+0

क्षमा करें। मुझे यकीन था, मैंने इसे अभी अनदेखा कर दिया है। लेकिन यह समस्या नहीं है। यह अभी भी काम नहीं कर रहा है। – Michael

+0

अद्यतन उत्तर। आपको या तो div पर क्लिक करना चाहिए या किसी भी कुंजी दबाए जाने से पहले इसे ध्यान में रखना चाहिए। – Panther

+0

मैंने किया। यह काम नहीं कर रहा है। मैंने ऊपर दिए गए कोड को अपडेट किया है। यह डीओएम कमांड के साथ ठीक काम करता है, लेकिन प्रतिक्रिया शैली में नहीं। – Michael

0

आप शुद्ध जावास्क्रिप्ट में बहुत ज्यादा सोच रहे हैं। उन प्रतिक्रिया जीवनशैली विधियों पर अपने श्रोताओं से छुटकारा पाएं और event.keyCode के बजाय उपयोग करें (क्योंकि यह जेएस इवेंट ऑब्जेक्ट नहीं है, यह एक प्रतिक्रिया SyntheticEvent है)। आपका पूरा घटक इस तरह के रूप में सरल हो सकता है (मान लीजिए कि आपने अपने तरीकों को कन्स्ट्रक्टर में बाध्य नहीं किया है)।

onKeyPressed(e) { 
    console.log(e.key); 
} 

render() { 
    let player = this.props.boards.dungeons[this.props.boards.currentBoard].player; 
    return (
    <div 
     className="player" 
     style={{ position: "absolute" }} 
     onKeyDown={(e) => this.onKeyPressed(e)} 
    > 
     <div className="light-circle"> 
     <div className="image-wrapper"> 
      <img src={IMG_URL+player.img} /> 
     </div> 
     </div> 
    </div> 
) 
} 
+0

यह वही है कि मैं इसे कैसे लिखना चाहता था। लेकिन नरक, यह नहीं जा रहा है। यहां कोडपेन है: http://codepen.io/lafisrap/pen/OmyBYG। यदि आप लाइन 275 पर टिप्पणी करते हैं तो कुंजी बोर्ड इनपुट (कर्सर कुंजी) काम नहीं कर रहा है। ऑनकेडाउन लाइन 307 में है। – Michael

+0

कीकोड मैं कर्सर कुंजी के लिए उपयोग करता हूं, क्योंकि वे कोई चरित्र नहीं लौटाते हैं। – Michael

+0

प्रतिक्रिया जावास्क्रिप्ट ईवेंट ऑब्जेक्ट्स का उपयोग नहीं करती है, इसलिए कोई कुंजीकोड प्रॉपर्टी नहीं है। वह 'ईवेंट' ऑब्जेक्ट एक प्रतिक्रिया [सिंथेटिक इवेंट] है (https://facebook.github.io/react/docs/events.html)। – steel

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