UNPKG

weex-nuke

Version:

基于 Rax 、Weex 的高性能组件体系 ~~

317 lines (290 loc) 8.77 kB
# Input demo - order: 2 - hide:true 信用卡类型 --- ```js /** @jsx createElement */ import { createElement, Component, setNativeProps, findDOMNode, render } from 'rax'; import View from 'nuke-view'; import Text from 'nuke-text'; import Input from 'nuke-input'; import Icon from 'nuke-icon'; import Env from 'nuke-env'; import Button from 'nuke-button'; import Page from 'nuke-page'; import { StyleProvider } from 'nuke-theme-provider'; const { isWeex } = Env; const KEYS = { '0': 48, '9': 57, DELETE: 46, BACKSPACE: 8, ARROW_LEFT: 37, ARROW_RIGHT: 39, ARROW_UP: 38, ARROW_DOWN: 40, HOME: 36, END: 35, TAB: 9, A: 65, X: 88, C: 67, V: 86 }; const CREDIT_CARD_NUMBER_DEFAULT_MASK = 'XXXX XXXX XXXX XXXX'; let md = { Core: { 'color-brand1-1': '#00BBD3', 'color-brand1-6': '#1A9CB7', 'color-brand1-9': '#0096A6', 'color-error-3': '#D50000', 'color-line1-1': '#DADADA', 'color-line1-2': '#E0E0E0', 'color-text1-1': '#9E9E9E', ['font-size-title']: 40, ['font-size-subhead']: 32, ['font-size-body-3']: 28, ['font-size-body-2']: 28, ['font-size-body-1']: 28, ['font-size-caption']: 24, ['font-size-footnote']: 20 }, Input: { 'md-border-radius': 0, 'single-radius': 4, 'single-font-size': 28, 'error-text-color': '#F44336', 'error-border-color': '#F44336', 'md-placeholder-height': 50, 'md-help-margin-top': 16, 'md-help-height': 56, 'md-input-height': 50, 'md-focus-placeholder-color': '#9E9E9E', 'md-placeholder-font-size': 28, 'md-input-margin-bottom': 0, 'md-input-margin-top': 14, 'md-error-text-font-size': 24 } }; let App = class NukeDemoIndex extends Component { constructor() { super(); } input = () => {}; change = () => {}; // 过滤非数字输入,在android端可能存在兼容性问题 filterNumberOnlyKey(event) { var isNumber = this.keyIsNumber(event); var isDeletion = this.keyIsDeletion(event); var isArrow = this.keyIsArrow(event); if (!isNumber && !isDeletion && !isArrow) { event.preventDefault(); return false; } } keyCodeFromEvent(event) { var charKeyCode = event.which || event.keyCode; return charKeyCode; } keyIsNumber(event) { var keyCode = this.keyCodeFromEvent(event); return (keyCode >= KEYS['0'] && keyCode <= KEYS['9']) || keyCode == 229; } keyIsDelete(event) { return this.keyCodeFromEvent(event) == KEYS['DELETE']; } keyIsBackSpace(event) { return this.keyCodeFromEvent(event) == KEYS['BACKSPACE']; } keyIsDeletion(event) { return this.keyIsDelete(event) || this.keyIsBackSpace(event); } keyIsArrow(event) { const keyCode = this.keyCodeFromEvent(event); return keyCode >= KEYS['ARROW_LEFT'] && keyCode <= KEYS['ARROW_DOWN']; } // 选取开始 caretStartPosition(element) { if (typeof element.selectionStart == 'number') { return element.selectionStart; } return false; } //选取结束 caretEndPosition(element) { if (typeof element.selectionEnd == 'number') { return element.selectionEnd; } return false; } // 设置回删 setCaretPosition(element, caretPos) { if (element != null) { if (element.createTextRange) { var range = element.createTextRange(); range.move('character', caretPos); range.select(); } else { if (element.selectionStart) { element.focus(); element.setSelectionRange(caretPos, caretPos); } else { element.focus(); } } } } digitFromKeyCode(keyCode) { if (keyCode >= KEYS['0'] && keyCode <= KEYS['9']) { return keyCode - KEYS['0']; } } normaliseCaretPosition(mask, caretPosition) { var numberPos = 0; if (caretPosition < 0 || caretPosition > mask.length) { return 0; } for (var i = 0; i < mask.length; i++) { if (i == caretPosition) { return numberPos; } if (mask[i] == 'X') { numberPos++; } } return numberPos; } denormaliseCaretPosition(mask, caretPosition) { var numberPos = 0; if (caretPosition < 0 || caretPosition > mask.length) { return 0; } for (var i = 0; i < mask.length; i++) { if (numberPos == caretPosition) { return i; } if (mask[i] == 'X') { numberPos++; } } return mask.length; } numbersOnlyString(string) { var numbersOnlyString = ''; for (var i = 0; i < string.length; i++) { var currentChar = string.charAt(i); var isValid = !isNaN(parseInt(currentChar)); if (isValid) { numbersOnlyString += currentChar; } } return numbersOnlyString; } applyFormatMask(string, mask) { var formattedString = ''; var numberPos = 0; for (var j = 0; j < mask.length; j++) { var currentMaskChar = mask[j]; if (currentMaskChar == 'X') { var digit = string.charAt(numberPos); if (!digit) { break; } formattedString += string.charAt(numberPos); numberPos++; } else { if (!digit) break; formattedString += currentMaskChar; } } return formattedString; } handleMaskedNumberInputKey = (e) => { console.log('handleMaskedNumberInputKey', e); const mask = CREDIT_CARD_NUMBER_DEFAULT_MASK; this.filterNumberOnlyKey(e); var keyCode = this.keyCodeFromEvent(e); var element = e.target; var caretStart = this.caretStartPosition(element); var caretEnd = this.caretEndPosition(element); // Calculate normalised caret position var normalisedStartCaretPosition = this.normaliseCaretPosition(mask, caretStart); var normalisedEndCaretPosition = this.normaliseCaretPosition(mask, caretEnd); var newCaretPosition = caretStart; var isNumber = this.keyIsNumber(e); var isDelete = this.keyIsDelete(e); var isBackspace = this.keyIsBackSpace(e); if (isNumber || isDelete || isBackspace) { e.preventDefault(); var rawText = element.value; var numbersOnly = this.numbersOnlyString(rawText); var digit = this.digitFromKeyCode(keyCode); var rangeHighlighted = normalisedEndCaretPosition > normalisedStartCaretPosition; // Remove values highlighted (if highlighted) if (rangeHighlighted) { numbersOnly = numbersOnly.slice(0, normalisedStartCaretPosition) + numbersOnly.slice(normalisedEndCaretPosition); } // Forward Action if (caretStart != mask.length && digit) { // Insert number digit if (isNumber && rawText.length <= mask.length) { numbersOnly = numbersOnly.slice(0, normalisedStartCaretPosition) + digit + numbersOnly.slice(normalisedStartCaretPosition); newCaretPosition = Math.max( this.denormaliseCaretPosition(mask, normalisedStartCaretPosition + 1), this.denormaliseCaretPosition(mask, normalisedStartCaretPosition + 2) - 1 ); } // Delete if (isDelete) { numbersOnly = numbersOnly.slice(0, normalisedStartCaretPosition) + numbersOnly.slice(normalisedStartCaretPosition + 1); } } // Backward Action if (caretStart != 0) { // Backspace if (isBackspace && !rangeHighlighted) { numbersOnly = numbersOnly.slice(0, normalisedStartCaretPosition - 1) + numbersOnly.slice(normalisedStartCaretPosition); newCaretPosition = this.denormaliseCaretPosition(mask, normalisedStartCaretPosition - 1); } } console.log(numbersOnly); element.value = this.applyFormatMask(numbersOnly, mask); setNativeProps(findDOMNode(this.refs.myinput.wrappedInstace), { value: element.value }); this.setCaretPosition(element, newCaretPosition); } }; render() { return ( <StyleProvider style={md} commonConfigs={{ fixedFont: true }} androidConfigs={{ materialDesign: true }}> <Page title="Card Payment"> <Page.Intro main="CardNumber" sub="open chrome console to see event output" /> <Input ref="myinput" name="card-number" type={'text'} onKeyDown={this.handleMaskedNumberInputKey} autocomplete={'cc-number'} x-autocompletetype="cc-number" autocorrect={'off'} spellcheck={'off'} autocapitalize={'off'} onInput={this.input} placeholder={'Card Number'} onChange={this.change} hasClear={true} value="" /> </Page> </StyleProvider> ); } }; render(<App />); ```