Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
気の利いた入力コンポーネント
Search
ymrl
April 08, 2016
Technology
1.8k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
気の利いた入力コンポーネント
ymrl
April 08, 2016
More Decks by ymrl
See All by ymrl
freeeらしさをAIとともに作る / Creating the freee Experience with AI
ymrl
0
290
たのしいtable / Fun table
ymrl
0
43
freeeのアクセシビリティの現在地 / freee's Current Position on Accessibility
ymrl
4
1.6k
全社でアクセシビリティに取り組む / Company-wide Accessibility Initiatives
ymrl
1
1k
デザイナーがTSKaigiでWAI-ARIAの話をしてみて / Speaking as a Designer: WAI-ARIA at TSKaigi
ymrl
0
760
TypeScriptとReactで、WAI-ARIAの属性を正しく利用する / Fixing WAI-ARIA Typing in React with TypeScript
ymrl
1
1k
がんばらないアクセシビリティ / Accessibility Without the Struggle
ymrl
0
1.1k
Webサイトのアクセシビリティにどう向き合う? / How Should We Approach Web Accessibility?
ymrl
0
200
いま求められるソフトウェアのアクセシビリティ / Essential Accessibility in Software Today
ymrl
1
1.7k
Other Decks in Technology
See All in Technology
re:Invent2026 事前勉強会 歴史と愉しみ方10分LT編
toshi_atsumi
0
120
PostgreSQL オプティマイザ統計の秘密
nori_shinoda
0
310
視野はAIに、視座は人に / ai-for-breadth-humans-for-perspective
nkzn
6
3k
eBPF 簡介 2026 版
shunghsiyu
0
170
なぜ東京にいる私が、新潟の技術コミュニティを運営するのか by 八雲慎之助
yakumo
0
220
AIに任せられるFlutterコードベースを作る 〜仕様をコードで表し、ハーネスで守る〜
myohei
1
630
In-Context Learning再入門。ICLの勾配降下的解釈の研究動向を追ってみる。
dai08srhg
1
220
Microsoft Entra Kerberos で実現するクラウド デバイス管理
tamaiyutaro
0
190
アクセラレーターで実現するServiceNow活用の高速化 / ServiceNow World Forum 2026
visional_engineering_and_design
0
130
Don't write the architecture only in the prompt.
neohsu
0
310
AWS構成から考えるWebセキュリティ ― WordPressの構築経験から考える公開範囲と更新運用【JAWS FESTA 2026 in AKITA】
cscengineer
PRO
0
100
Strands Decider 2BでAWSアップデートの目利きをしてみた
sato4mi
1
100
Featured
See All Featured
HDC tutorial
michielstock
2
1k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
23k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
3
3.9k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
Ten Tips & Tricks for a 🌱 transition
stuffmc
1
280
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.7k
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
600
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
620
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.9k
Mobile First: as difficult as doing things right
swwweet
225
10k
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.7k
Transcript
ؾͷར͍ͨ ೖྗίϯϙʔωϯτͷ !ZNSM
͜ͷεϥΠυຕ ͋ΔͷͰۦ͚Ͱ αϯϓϧίʔυ͜͜ɿ IUUQTHJUIVCDPNZNSMJOQVUDPNQPOFOUFYBNQMFT
୭ w !ZNSMʢ·͋Δʣ w ࣾձਓྺGSFFFྺ w 6*Λߟ͑Δͷͱ$44ॻ͘ͷ͕͖
ೖྗίϯϙʔωϯτ ʢ·͋ɺUFYUBSFBͱ͔͋Δ͚Ͳʣ
څ༩ܭࢉGSFFFͷͱ͋Δը໘
IUUQTXXXKSFBTUDPKQPUPOBEPDVNFOU@SFRVFTU
IUUQTUXJUUFSDPNZNSMTUBUVT
ආ͚ΒΕͳ͍িಥ w ։ൃऀࢹɿ͍ΖΜͳ߹͕͋ΜͶΜ w Ϣʔβʔࢹɿ։ൃऀͷ߹ͳΜͯΒΜ w Τϥʔ͕ग़ͯΠϥοͱͨ͘͠ͳ͍ w શ֯ͱ֯ͷ۠ผͳΜ͔ͯͭͳ͍ w
ͦͦͲ͏͍͏ܗࣜͰೖΕΔͷ͔Θ͔Βͳ͍
ؾΛޮ͔͍ͤͨ w શ֯֯ͷมͱ͔ϑϩϯτΤϯυͰͬͪΌ͑ w ॳΊͯͷϢʔβʔ͕໎ΘͣʹೖྗͰ͖Δ w ׳ΕͯΔϢʔβʔ͕ߴʹೖྗͰ͖Δ w ։ൃऀ͕΄͍͠ܗࣜΛ͑Δ͜ͱͰ͖Δʢ͔ʣ w
͔࣍ΒͦͷܗࣜͰೖΕͯΒ͑Δʢ͔ʣ
ؾΛར͔ͤͯΔྫ w શ֯ˠ͕֯ΔͷͰ*.&Φϯͷ··ೖྗ0, w ֹۚཝ͕Λ ʹͯ͘͠ΕΔ w ཝ͕Λʹͯ͘͠ΕΔ w ࣌ࠁཝͰΛʹͯ͘͠ΕΔ
w ༣ศ൪߸ཝͰϋΠϑϯ͕ࣗಈతʹิΘΕΔ
ʢ͓͞Β͍ʣ3FBDUͷ ೖྗίϯϙʔωϯτ
͜Μͳײ͡ class NormalInput extends React.Component { handleChange(e) { const value
= e.target.value; this.props.onChange(e, value); } render() { return( <input type="text" value={this.props.value} onChange={this.handleChange.bind(this)} /> ); } } ίϯϙʔωϯτʹ มߋ༰Λ௨͢Δ ͕͏͔͠Εͳ͍ͷͰ 4ZOUIFUJD&WFOUΛୈҰҾʹͯ͠Δ
͔ͭ͏ <NormalInput type="text" value={ this.state.value } onChange={(_e, value)=>this.setState({ value: value
})} />
શ֯ӳʹม͢Δ handleChange(e) { const value = e.target.value.replace(/[!-~]/g, (chr) => String.fromCharCode(chr.charCodeAt(0)
+ 0xFEE0) ); this.props.onChange(e, value); } ֯จࣈ͕͋ͬͨΒม͢Δ
ม͕ΔͱΧʔιϧ͕ ͍ͪΜޙΖʹ͍͘
͕มΘΔͱ͖ʹ ΧʔιϧҐஔΛͯ͋͛͠Δ componentWillUpdate() { const element = ReactDOM.findDOMNode(this); this.selectionStart =
element.selectionStart; this.selectionEnd = element.selectionEnd; } componentDidUpdate() { const element = ReactDOM.findDOMNode(this); if (element === document.activeElement) { element.setSelectionRange(this.selectionStart, this.selectionEnd); } } อ͓͍࣋ͯͨ͠ΧʔιϧҐஔΛ VQEBUFޙʹηοτ͢Δ VQEBUFલͷΧʔιϧҐஔΛอ͓࣋ͯ͘͠
͍͍ײ͡
ͻΒ͕ͳΛ ΧλΧφʹ͢Δ
handleChange(e) { const value = e.target.value.replace(/[ぁ-ゖ]/g, (chr) => String.fromCharCode(chr.charCodeAt(0) +
0x60) ); this.props.onChange(e, value); }
͍͋͠ڍಈʹͳΔ
ΧʔιϧҐஔͷ੍ޚ͍͠ w ຊޠೖྗ͕བྷΉ߹ͷڍಈ͕͋͘͠ͳΔ w มޙʹจࣈ͕มΘΔ߹ʹΑ͘Θ͔Μͳ͘ͳΔ w ఘΊͱ͍ͨ΄͏͕ແ w Χʔιϧ͕͋Δͱ͖ม͠ͳ͍Ͱ͓͘ w
ͬͱଞʹؤுΓ͍ͨ͜ͱͨ͘͞Μ͋Δ
CMVSͰม͞ΕΔ
class CoolKatakanaInput extends React.Component { constructor(props) { super(); this.state =
{ showValue: props.value }; } render() { return( <input type="text" value={this.state.showValue} onChange={this.handleChange.bind(this)} onBlur={this.handleBlur.bind(this)} /> ); } componentWillReceiveProps(props) { const element = ReactDOM.findDOMNode(this); if (element !== document.activeElement) { this.setState({ showValue: props.value}); } } ͞ΕͨQSPQTΛTUBUFʹίϐʔ දࣔʹTUBUFͷ΄͏Λ͏ ϑΥʔΧεͯ͠ͳ͍࣌ͷ QSPQTͷมԽදࣔʹଈ࣌ө
handleChange(e) { const inputValue = e.target.value; const value = inputValue.replace(/[ぁ-ゖ]/g,
(chr) => String.fromCharCode(chr.charCodeAt(0) + 0x60) ); this.setState({ showValue: inputValue}); this.props.onChange(e, value); } handleBlur() { this.setState({ showValue: this.props.value}); } ฤूதมͤͣʹදࣔ ϑΥʔΧε͕֎Εͨͱ͖ʹQSPQTΛ࠶ద༻
CMVSͰม͞ΕΔ
ؾͷར͍ͨײ͡ʹ͢ΔͨΊʹ w Ͱ͖Δ͔͗Γػցతʹม͢ΔʢͨΓલʣ w ೖྗϑΟʔϧυͷϥϕϧͰཉ͍͠ܗࣜΛ͑Δ w ࢯ໊ʢΧφʣʹΧλΧφͰೖΕͯ΄͍͠ؾ࣋ͪΛࠐΊΔ w αʔϏεͰೖྗܗࣜ౷Ұ͓ͯ͘͠ w
֯ɺಡΈԾ໊શ֯ΧλΧφͳͲ w Ͳ͏ͯ͠มͰ͖ͳ͍߹ͳͲଈ࣌ʹڭ͑ͯ͋͛Δ w ૹ৴͔ͯ͠ΒʮΤϥʔͰ͢ʯͰ͗͢
͔ͤͬ͘ྑ͍αʔϏε࡞ͬͯΔͷͳΒ ࡉ͔͍ͱ͜ΖؾΛར͔͍͖͍ͤͯͨͰ͢Ͷ