Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
気の利いた入力コンポーネント
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
たのしいtable / Fun table
ymrl
0
20
freeeのアクセシビリティの現在地 / freee's Current Position on Accessibility
ymrl
4
1.5k
全社でアクセシビリティに取り組む / Company-wide Accessibility Initiatives
ymrl
1
950
デザイナーがTSKaigiでWAI-ARIAの話をしてみて / Speaking as a Designer: WAI-ARIA at TSKaigi
ymrl
0
690
TypeScriptとReactで、WAI-ARIAの属性を正しく利用する / Fixing WAI-ARIA Typing in React with TypeScript
ymrl
1
930
がんばらないアクセシビリティ / Accessibility Without the Struggle
ymrl
0
1k
Webサイトのアクセシビリティにどう向き合う? / How Should We Approach Web Accessibility?
ymrl
0
170
いま求められるソフトウェアのアクセシビリティ / Essential Accessibility in Software Today
ymrl
1
1.6k
アクセシビリティを意識したプロダクトづくり / Creating Products with Accessibility in Mind
ymrl
0
24k
Other Decks in Technology
See All in Technology
そのドキュメント、自動化しませんか?
yuksew
1
420
穢れた技術選定について
watany
19
6.2k
Jitera Company Deck
jitera
0
280
どこまでAIに任せるか 〜確率論と決定論の境界決定〜
shukob
0
460
AI時代の開発生産性を捉え直す — 経営と現場をつなぐ「開発組織のオブザーバビリティ」— / AI Dev Ex Conference 2026
tkyowa
1
1.3k
[Droidcon Orlando '26] The Android Lens: Applying Mobile Forensics to AI Performance
amanda_hinchman
1
110
AI時代の開発生産性は、個人技からチーム設計へ
moongift
PRO
4
2.5k
設計レビューとAIハーネスで向き合う AIが生み出した新しいボトルネックの対処法 / Design Reviews and AI Harnesses Against New Bottlenecks Created by AI
nstock
4
440
「休む」重要さ
smt7174
6
1.6k
AI時代こそ、スケールしないことをしよう -「作る人」から「なぜ作るか」を考える人へ / Do Things That Don't Scale in the AI Era — From How to Why
kaminashi
1
100
AIコード生成×サプライチェーン攻撃 — PHPが直面する“二重の信頼問題
shinyasaita
0
460
Amplify Gen2でbackend.tsにCDKを定義する/しない事によるCDKの挙動の違いとユースケース
smt7174
1
490
Featured
See All Featured
Measuring & Analyzing Core Web Vitals
bluesmoon
9
900
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
420
Rebuilding a faster, lazier Slack
samanthasiow
85
9.6k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
23k
Designing for humans not robots
tammielis
254
26k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.3k
What's in a price? How to price your products and services
michaelherold
247
13k
What does AI have to do with Human Rights?
axbom
PRO
1
2.3k
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.2k
Why You Should Never Use an ORM
jnunemaker
PRO
61
9.9k
Fashionably flexible responsive web design (full day workshop)
malarkey
408
67k
Faster Mobile Websites
deanohume
310
32k
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 ૹ৴͔ͯ͠ΒʮΤϥʔͰ͢ʯͰ͗͢
͔ͤͬ͘ྑ͍αʔϏε࡞ͬͯΔͷͳΒ ࡉ͔͍ͱ͜ΖؾΛར͔͍͖͍ͤͯͨͰ͢Ͷ