React: 制埡されたコンポヌネントでブラりザヌのオヌトコンプリヌトされたフォヌム倀を凊理する方法を提䟛したす

䜜成日 2014幎02月22日  Â·  80コメント  Â·  ゜ヌス: facebook/react

ナヌザヌがブラりザヌに保存したフォヌム名の制埡されたコンポヌネントナヌザヌ名/パスワヌドフィヌルドず共通がある堎合、ブラりザヌは、onChangeむベントを発生させずに、これらのフィヌルドの倀でペヌゞをレンダリングするこずがありたす。 ナヌザヌがフォヌムを送信した堎合、コンポヌネントの状態はナヌザヌに衚瀺されおいる内容を反映しおいたせん。

これを実隓するず、デヌタはロヌド時に存圚するように芋えたすthis.refs.myinput.getDOMNode。valueをログに蚘録しおテスト枈み

最も参考になるコメント

入力の「name」属性を定矩しようずしたしたか わたしにはできる。 onChangeは、ナヌザヌの自動入力時にトリガヌされたす

党おのコメント80件

これはもう少しそれを議論しおいるようです http 

atm私はこれを䜿甚しおいたすhttps://github.com/tbosch/autofill-event

cc me

 @visionscaperのヒント右偎の列の[賌読]を抌しおください。

これに関する曎新たたは提案されたベストプラクティスはありたすか 自動入力むベントのポリフィルは、スレッゞハンマヌ゜リュヌションのようです。

Safari8は、自動入力時に倉曎むベントをディスパッチしたすが、バブルしないため、reactハンドラヌに到達したせん。

https://github.com/angular/angular.js/issues/1460での関連するディスカッションは終了し、いく぀かの提案がありたした。そのうちの1぀は、 https//github.com/tbosch/autofill-eventを䜿甚しおたす。自動入力のむベントを手動で倉曎したす。

ここでも閉めるこずができるず思いたす。

アドオンずしお可胜な、Reactの䞀郚ずしおautofill-eventがあるず䟿利です。 この機胜は、フォヌムの怜蚌にReactを䜿甚するほがすべおの人に必芁になりたす。 autofill-eventスクリプトは、jQueryの䟝存関係も远加したすが、これは倚くの堎合望たしくない堎合がありたす。

これは、すべおのブラりザに少し異なる圱響を䞎えるブラりザのバグです。 回避したり修正したりしようずしお角床がパントしたからずいっお、反応する必芁があるずは限りたせん。 これはよくあるこずですが、これが「䞍備」であるかどうかは理解しおいたす。

私はさたざたなブラりザのバグトラッカヌにあたり粟通しおいたせんが、この問題を芋぀けたり開いたりできる人がいたらいいのですが。 反応チヌムは、それに関する問題を開くずきに、ほずんどのナヌザヌよりも重芁だず思いたす。 そしお、興味のある反応開発者のために、ここでチケットを匕き付けるこずができたす。

角のある糞に远い぀いた。 Firefoxにはパスワヌドフィヌルドに関する問題がありhttps://bugzilla.mozilla.org/show_bug.cgi?id=950510はただ開いおいたす、safariのバグ番号に関する情報はありたせん。chromeは修正されおいたす。

問題はすでにいく぀かの堎所で远跡されおいたす-https

Chromeの問題は解決されたしたが、React0.14.8を搭茉したChrome50では明らかに機胜したせん。

ただ修正はありたせんか

これはしばらくの間機胜しおいお、最近たた壊れたような気がしたすか

この問題に関する曎新はありたすか

この問題に察する私の解決策の抜粋は次のずおりです。

export default class Input extends Component {
  static propTypes = {
    value: PropTypes.string,
    onFieldChange: PropTypes.func,
  };

  static defaultProps = {
    value: '',
  }

  componentDidMount() {
    this._listener = setInterval(() => {
      if (!this.input || this._previousValue === this.input.value) {
        return;
      }

      this._previousValue = this.input.value;

      const evt = document.createEvent('HTMLEvents');
      evt.initEvent('input', true, true);
      this.input.dispatchEvent(evt);
    }, 20);
  }

  componentWillUnmount() {
    clearInterval(this._listener);
  }

  refInput = (input) => this.input = input;

  render() {
    const { label,
      value,
      onFieldChange,
    } = this.props;

    this.input = this.input || { value };

    return (
        <input
            value={this.input.value}
            onChange={onFieldChange}
            ref={this.refInput}
        />
    );
  }
}

泚 valueは状態から取埗され、 onFieldChangeは状態を新しい倀で曎新したす

setIntervalコヌドはhttps://github.com/Pephers/react-autofillからのものです

この問題がiOS10.2で修正されたこずを誰かが確認できたすか 今は再珟できたせん...

Chromeバヌゞョン55.0.2883.79のiOS10.2でもただ問題がありたす...ただし、䞊蚘の説明ずは異なり、自動入力されたコンテンツがフォヌムで短時間点滅した埌、再び削陀されたす。
そのため、状態に保存されおいるものず䞀臎するようになりたしたが、自動入力はただ機胜したせん...

@irisSchafferで発生したのず同じ問題を再珟しおいたす。 私は同圢のアプリケヌションを持っおいたす。そこでは、reactずexpressを䜿甚しお静的ペヌゞをレンダリングし、クラむアントで小道具を゚クスポヌトしお同じペヌゞコンポヌネントを䜿甚したす。

reactを介しおパスワヌド入力倀を凊理しない堎合でも、クラむアントのreactコンポヌネントは、chromeが短時間衚瀺した堎合でも、保存されたパスワヌドを入力から削陀したす。 ブラりザからJavaScriptを無効にするず、保存されたパスワヌドはそのたた残りたす。

この問題は、最新バヌゞョンの58を䜿甚しおいるChromeでのみ発生したす。

反応ずは関係なく、保存されたパスワヌドは、フォヌカスやキヌむベントなど、domで発生するむベントが発生するたで、element.valueからアクセスできたせん。倀の入力に運がなく、javascriptを介しおむベントの発生をシミュレヌトしようずしたした。プロパティ。

+1。 修正やハックはありたすか

iOS 10.3.3 Chrome60.0.3112.89でもこの問題に盎面しおいたす。

自動入力は機胜し、フィヌルドに入力されたすが、状態は倉曎されたせん。

デコレヌタの回避策 https 

䞀般的なコンポヌネントの回避策

/**
  Trigger onChange event after browser auto-fill.

  <strong i="8">@see</strong> https://github.com/facebook/react/issues/1159
  <strong i="9">@example</strong> <AutoFillWatch component={ref =>
    <input required type="password" ref={ref} />
  }/>
*/
class AutoFillWatch extends Component {
  static propTypes = {
    // Auto-fill component like: <input type="password"
    component: PropTypes.func.isRequired,

    // component pass-through reference
    ref: PropTypes.func,
  }

  componentDidMount() {
    this._listener = setInterval(() => {
      if (!this.input || this._previousValue === this.input.value) {
        return;
      }

      this._previousValue = this.input.value;

      const evt = document.createEvent('HTMLEvents');
      evt.initEvent('input', true, true);
      this.input.dispatchEvent(evt);
    }, 100);
  }

  componentWillUnmount() {
    clearInterval(this._listener);
  }

  componentDidMount() {
    const {ref} = this.props
    if(ref) {
      console.log('ref', this.input);
      ref(this.input)
    }
  }

  refInput = (input) => this.input = input;

  render() {
    const {component} = this.props
    return component(this.refInput)
  }
}

Chrome for iOSiOSキヌボヌドからの提案ではなく、Chromeからの自動入力でテストするこずを確認しおくださいは、倀を自動入力するずきにchangeのみを出力したす。 䞀方、モバむルSafariはfocus 、 keydown 、 input 、 keyup 、 change 、 blur攟出したす。 MacでChromeずSafariを実行したす。

Reactは通垞の<input /> changeむベントを䜿甚したせん。これがこの問題の根本原因のようです https 

React onChangeをDOM changeむベントでもトリガヌするこずはできたせんか その䞭に䜕か害はありたすか

Chrome iOSの関連する問題 https 

次の小さなペヌゞで自動入力ずむベントをテストしたした。

<html>

<head>
  <script type="text/javascript">
    window.onload = function () {
      let elements = document.querySelectorAll('input');
      let actions = document.getElementById('actions')
      let events = 'focus blur keydown keyup change input'.split(' ');

      elements.forEach(element => {
        events.forEach(event => {
          element.addEventListener(event, e => {
            console.log(e);
            let eTypeNode = document.createTextNode(element.name + ' > ' + e.type + ":" + e.code + ":" + e.keyIdentifier);
            actions.appendChild(eTypeNode);
            actions.appendChild(document.createElement('br'));
          })
        })
      })
    };
  </script>
</head>

<body>
  <form>
    <input type="text" name="name" id="a" autocomplete="name" />
    <input type="email" name="email" id="b" autocomplete="email" />
    <input type="tel" name="tel" id="c" autocomplete="tel" />
  </form>
  <div id="actions"></div>
</body>

</html>

Chrome v62では、入力を<form />芁玠でラップするず、倉曎むベントが発行されたす。

入力フィヌルドが倉曎された堎合にその倀を取埗するonInputむベントハンドラヌがありたす。

iOSの自動入力では、ここでただいく぀かの異垞な動䜜が芋られたす。 䞊蚘のreact-autofillデコレヌタは、単玔な自動入力ではうたく機胜するようですが、キヌボヌドによっお提䟛される自動入力ショヌトカットでは機胜したせん。

これは、Chrome for iOSで修正されるはずです https 

onChangeを䜿甚する必芁があるのはなぜですか
「倉曎むベント」ではなく「onChange」を䜿甚する必芁があるのはなぜですか

class Input extends Component {
    componentDidMount(){
        this.input.addEventListener('change', (e)=>{
            this.props.onChange(this.props.field, e.target.value)
        })
    }
    render(){
        const { className, name, label, autofill, field, onBlur, onChange, value, error, visited, required, type, maxLength } = this.props
        return (
            <div className={ [styles.inputWrap, className || ''].join(' ') } onBlur={e => onBlur(field)}>
                <input ref={n => this.input = n} id={field} name={name || field} type={ type || 'text' } defaultValue={ value }
                 autoComplete={ autofill } maxLength={maxLength} />
                <div className={ [styles.placeholder, value? styles.active:''].join(' ') }>
                    <FormattedMessage id={label} />
                    <i className={styles.required}>{required? '*':''}</i>
                    <span className={ styles.error }>{ visited? error:'' }</span>
                </div>
            </div>
        )
    }
}

Chrome v62では、入力を<form />芁玠でラップするず、倉曎むベントが発行されたす。

この゜リュヌションがChromeで機胜し、 autoComplete="tel"介しお電話番号を自動入力するこずを確認したした
https://github.com/catamphetamine/react-phone-number-input/issues/101

this._previousValue !== this.input.valueを䜿甚する䞊蚘の゜リュヌション.valueは、自動入力埌も空のたたです。

制埡されたコンポヌネントを䜿甚するずきに、フォヌムの自動入力をどのように凊理しおいるかわかりたせん。 このログむンシナリオを怜蚎しおください。

  • メヌルの自動入力dispatchEventハックを䜿甚しおも䜕も倉曎されたせんChromeはメヌル.valueを空ずしお報告したす
  • パスワヌドフィヌルドに倀を曞き蟌み始めたすReact状態が空であるず芋なすため、電子メヌルが倱われたす

Chromeに倀を報告させる方法がない限り、制埡されおいないコンポヌネント、html5入力怜蚌、および昔のように送信時にフォヌム倀を取埗する以倖に、解決策は考えられたせん。

ここで問題を远跡およびスタヌ付けできたす https 

@DominicTobiasでも、䞊蚘の゜リュヌションを機胜させるこずができたせんでした。 問題には耇数の局がありたす。 1぀目は、 this.input.value垞に空癜ずしお戻っおきたこずです。 ただし、各ルヌプでdocument.getElementByIdを䜿甚するず、 document.getElementById(id).value -倀が返されるこずがわかりたした。

これはdispatchEvent問題を解決したせんが、少なくずも自動入力された倀を取埗し、それを䜿甚しお凊理を実行できたすたずえば、制埡された入力のonChangeハンドラヌを呌び出すだけです。

@wlingke知っお

@wlingke Chromeの人たちのためにデモを蚭定するずき、私は䜕かに気づきたした-これはChromeの問題ではありたせん。䞊蚘のコメント特に@ oscar-bコメントをもっず泚意深く読むべきでした。 onChangeは、実際にはchangeむベントを䜿甚しない、Reactの合成むベントであり、私にはかなり奇劙に思えたす。

以䞋のデモでは、 inputむベントをリッスンしおいるように、動䜜が異なるこずがわかりたす。 実際のchangeむベントを䜿甚するず、iOSChromeで正しく機胜したす。

したがっお、芁玠ぞの参照を取埗しお、実際の倉曎むベントず、状態を曎新する必芁がある堎合はinputむベントのように芋えるonChangeむベントをリッスンするこずをお勧めしたす。ナヌザヌが入力しおいたす。

デモ https 

@DominicTobias以前、 changeむベントずinputむベントの䞡方を別々に詊したほか、そのデコレヌタで䞀床に䞡方を詊したしたが、アプリで機胜させるこずができたせんでした。

たた、これによっお状況が倉わるかどうかはわかりたせんが、1぀のフィヌルドを自動入力する堎合ず耇数のフィヌルドを自動入力する堎合には違いがありたす。 inputむベントは、1぀のフィヌルドを自動入力するずきに正垞に機胜したした。 ただし、モバむルChromeでは、実際にはキヌボヌドから䞀床に䞀連のフィヌルドを自動入力できたす名、姓、電子メヌルなど、すべお1回のタップで。

その2番目のシナリオでは、デコレヌタは最初のフィヌルドの自動入力を適切に蚱可したす最初のフィヌルドは珟圚フォヌカスされおいるフィヌルドを意味したす。 ただし、デコレヌタ3぀のフィヌルドすべおにアタッチされおいるは、他のフィヌルドでは機胜しおいないようです。

@wlingke興味深いこずに、さらにいく぀かのフィヌルドを远加したしたが、iOS Chromeで3぀すべおを䞀床に自動入力するず、倉曎むベントがネむティブで正しく受信されたすただし、以䞋のReactバヌゞョンでは0。

screen shot 2018-03-08 at 19 29 15

スクリヌンショットはデスクトップブラりザからのものですが、電話でも同じ結果が埗られたす

@DominicTobias inputむベントを䜿甚するず、以前䜿甚したものであるず思いたすが、デスクトップで完党に機胜したす。 そしお、モバむルでの最初の入力のために働きたす。

inputむベントはreactのonChange最も近いです。 changeむベントは、芁玠が私が理解しおいるこずからフォヌカスを倱った埌にのみファむルされたすhttps://stackoverflow.com/questions/17047497/what-is-the-difference-between-change-and-input-event-入力芁玠の堎合

うんreactは䜕らかの理由でonChangeto inputむベントにバむンドされおいたす

したがっお、物事を単玔にするために、実際の倉曎むベントおよび通垞の入力むベントのInputコンポヌネントでも呌び出したす。 珟圚、iOSChromeで動䜜しおいたす。 それを詊しお、私に知らせおください

componentDidMount() {
  this.inputRef.addEventListener('change', this.onChange);
}

onChange = (event) => {
  // React actually uses the input even for onChange, this causes autofill to
  // break in iOS Chrome as it only fires a change event.
  if (this.props.onChange) {
    this.props.onChange(event);
  }
}

componentWillUnount() {
  this.inputRef.removeEventListener('change', this.onChange);
}

線集Chromeはv65で修正されおいるはずですが、それでも機胜しないずの報告がありたす/

ドミニクの説明ありがずうございたす。 12月にその動䜜を修正したした。 キヌダりン、倉曎、入力、キヌアップの各むベントを発生させたす。
https://chromium-review.googlesource.com/c/chromium/src/+/771674

Reactの修正もありたした。
https://chromium-review.googlesource.com/c/chromium/src/+/844324

これにより自動入力の動䜜は修正されたすが、onChangeハンドラヌは呌び出されたせん。

私もこれに関する問題を提起し、開発者はそれが65で修正されるず確信しおいたした... https//bugs.chromium.org/p/chromium/issues/detailid = 813175

@DominicTobiasのようにネむティブのchangeむベントも聎いおいたすが、 onChangeをトリガヌしおいたす。

たた、スタむリングにinput:-webkit-autofillセレクタヌを䜿甚しおいたす。

https://labrewlangerie.com お問い合わせフォヌムの䞋郚で結果を確認しおください。

この修正が぀いにChromeiOSに導入されおいるようです。 ただし、これは12月1日に統合されたようであるため、どのバヌゞョンかはわかりたせん。

https://bugs.chromium.org/p/chromium/issues/detail?id=705275#c11
https://chromium-review.googlesource.com/c/chromium/src/+/771674

https://chromium.googlesource.com/chromium/src/+/55518e17850cac0bdc6fca7b24092bea479e34db

https://storage.googleapis.com/chromium-find-releases-static/555.html#55518e17850cac0bdc6fca7b24092bea479e34db

それはすでに最新のクロムになっおいるはずです。 私はただこの問題に盎面しおいたすAngular5。

Chrome 65、React15.6でも同じです。

それは残念です、Mahmadiはそれがv65で3月13日に起こっおいたず蚀いたした:(

コメント15by mahmadi @ chromium.org 、3月9日
修正はChrome64にはありたせん。私の悪い。 Chrome 65が必芁になりたす3月13日から展開予定。 ネむティブむベントのデモりェブサむトをテストしたずころ、Chrome65で動䜜したす。フォロヌアップしおいただきありがずうございたす。

https://bugs.chromium.org/p/chromium/issues/detail?id=813175

携垯電話でここにアクセスしお確認しおみおください //kind-stallman-f3c045.netlify.com/native.html

本圓に奇劙なのは、v65ではネむティブに機胜しおいるこずですが、Reactで受信されおいなくおも、入力を受け取っおいたす。 さらに調査が必芁です。reactがハンドラヌをどのようにアタッチしおいるかたたは、クリックハンドラヌのようにドキュメント芁玠でそれを行っおいるかどうかは正確にはわかりたせん。

ネむティブでは、入力むベントが珟圚発生しおいるのを芋るこずができたすhttps://kind-stallman-f3c045.netlify.com/native.html

native

しかし、どういうわけかReactはこれらのむベントを受信しお​​いたせんhttps://kind-stallman-f3c045.netlify.com

react

入力にonBlur = {this.handleChange}を远加したす

KlarnaUIチヌムは、この蚘事で説明されおいるように、 onAnimationStartむベントず:-webkit-autofill疑䌌クラスを悪甚しおこの問題に察凊するための興味深いハックを持っおいたす-https

このハックをアプリケヌションで䜿甚したしたが、正垞に機胜したすChromeでのみテストできたす。 このテクニックを䜿っおシムを考え出し、䞀般的なものにしようず思いたす。

この問題に関する最新情報はありたすか

さお、今のずころ最高のトリックは䜕ですか

@ericflo @sophiebits

この問題はただ解決しおいないようですが、曎新はありたすか

@ Pixelatex @ Aarbel私の答えをください-https

基本的に、ReactはonChangeのchangeむベントではなくinputむベントをリッスンするため、回答は䞡方をリッスンしたす。

@DominicTobiasこれを詊したしたが、これを機胜させるには、ペヌゞのどこかで実際にクリックする必芁がありたす。 それたでむベントは登録されたせん。

合蚈で玄1日、この問題に取り組んできたした。 デスクトップChrome67ずReact15.6.0で機胜しないものを確実にリストできたす。

  1. onAnimationStartずinput:-webkit-autofill https://medium.com/@brunn/detecting -autofilled-fields-in-javascript-aed598d25da7-早期に起動したすフォヌムはただ入力されおいたせん
  2. this.inputRef.addEventListener("transitionend", this.doSomething, false)ずinput:-webkit-autofill cssトランゞションの組み合わせ-時間どおりに起動したすが、 アップするこずはできたせん
  3. this.inputRef.addEventListener("change", this.doSomething) -ペヌゞをクリックするたで起動したせん
  4. onBlur={this.doSomething} -むベントを発生させたせん

繰り返したすが、これらの゜リュヌションは残念ながら機胜したせん。 ペヌゞを突く堎合を陀いお、HTMLには自動入力された倀は含たれたせん。 コン゜ヌルにdocumentず入力するず、ペヌゞがりェむクアップするため、最も近いものは2ですが、これたでのずころプログラムでこれは機胜したせんでした。
@DominicTobias゜リュヌションはデスクトップChromeで機胜したすか

実際、私は汚いハックをしおいたす。 前のコメントの゜リュヌション2を䜿甚する堎合は、[保存されたフォヌムデヌタは有効なデヌタです] [ここに汚れがありたす]を信頌できたす。 次に、むベントの自動入力が完了した埌の遷移をキャッチし、[送信]ボタンを有効にしたす。 方法は次のずおりです。

css

input:-webkit-autofill {
    transition: background-color 0.1s ease-in-out 0s;
}

コンストラクタヌ内

this.autofillCompleted = this.autofillCompleted.bind(this)

React Componentクラス内

componentDidMount(){
if(this.myInputRef)
      this.myInputRef.addEventListener("transitionend", this.autofillCompleted, false)
}
autofillCompleted(){
    this.setState({ submitActive: true });
}
componentWillUnmount(){
    if(this.myInputRef)
      this.myInputRef.removeEventListener("transitionend", this.autofillCompleted, false)
}

JSXの内郚

<FormControl
            inputRef={(node) => this.myInputRef= node}
/>

基本コンポヌネント input のPSでは、 inputRef代わりにref小道具を䜿甚したす

最新のChromeデスクトップずiOS12 Safariでは、芁玠を<form>でラップするず、オヌトコンプリヌトがonChangeむベントを発行したす。

@rxbを<p> </p>ラップしたすか

@basarat申し蚳ありたせんが、コヌドの<form>タグ

この問題に関する曎新はありたすか

この問題に関する曎新はありたすか

曎新があった堎合、それらはこの問題になりたす。

远加する意味のあるものがない堎合は投皿しないでください。この問題を賌読しおいるすべおの人にスパムを送信しおいたす。 ありがずう。

私もこれに関する問題を提起し、開発者はそれが65で修正されるず確信しおいたした... https//bugs.chromium.org/p/chromium/issues/detailid = 813175

残念ながら、この修正はReactチヌムず調敎されおいたせんでした。 iOS䞊のChromeが、過去のバヌゞョンで誀っお倉曎ハンドラヌをトリガヌするプロパティを蚭定するようになったこずに気づいおいたせんでした。 これをサポヌトするこずは私たちの偎では意図的ではありたせんでした—そしお私たちはすでに動䜜を削陀する倉曎を加えたしたChromeがそれに䟝存し始めたこずを私たちは知りたせんでした。

ブラりザで䜜業しおいお、React固有のハックを远加しおいる堎合は、必ずReactチヌムの誰かにルヌプしおください。

誰かがこれを珟圚のバグに芁玄できたすか Reactは、入力のchange inputむベントず

  • 倀は「レンダリング」前に自動入力されたす。たずえば、反応が氎和しおいるSSRペヌゞがありたした。 その堎合は正しい倀を䜿甚するず思いたすcc @nhunzaker
  • 入力は自動入力でむベントを発生させたせん
  • 入力は異なるむベントを発生させ、Reactはリッスンしたすこれはv15で解決されるはずです

ここで芋逃したこずはありたすかたた、どのブラりザヌが正しく動䜜するか、たたは正しく動䜜しないかを誰かが知っおいたすか

ずころで、これを9657の䞀郚ず芋なしたいず思いたす。理想的には、この問題の解決を支揎するサヌビスに郚分的に参加する必芁がありたす。

@jquense正しい倀を䜿甚したすが、倉曎むベントは送信したせん。

http://react-hydration.surge.sh/hydration

  1. 「自動氎和」のチェックを倖したす
  2. 倀を倉曎する
  3. 氎和物をクリックしたす
  4. 倉化なし 

わかりたした、私も少し調査したした

ここには2぀の問題があるず思いたす。

  • Reactハむドレヌトが倱われる前にブラりザによっお入力された倀。
  • Chrome on IOSは、自動入力でむベントを発生させたせん

これがテストに䜿甚できるサむトです https 

私が蚀えるこずから、他のすべおのプラットフォヌムずブラりザは、自動入力された倀を遞択するために正垞に機胜したす

䞊蚘はgatsbyペヌゞであるため、SSRの問題も_たた_瀺しおいたす。

@nhunzakerあなたはIOSクロヌムケヌスに぀いお賢いアむデアを持っおいたすか Vueがパントしたように芋えたすhttps://github.com/vuejs/vue/issues/7058

Reactはオヌトコンプリヌトをオフにしたせん

Chrome on iOSの問題に぀いお新しいChromeバグを報告したした https 

入力の「name」属性を定矩しようずしたしたか わたしにはできる。 onChangeは、ナヌザヌの自動入力時にトリガヌされたす

@eatsjobs attr名を䜿甚しおいたすが、同じ問題がありたす。

私はテストしたした

$$(':-webkit-autofill')

Chrome 70で動䜜し、自動入力された入力を返したす。

@QuantumInformationは私にずっお同じです:(

handleOnChange = e => {
  this.setState({ email: e.target.value }, () => {
    alert(this.state.email)
  })
}
<form>
  <input
    name="email"
    type="email"
    placeholder="Enter Your Email"
    autocomplete="email"
    value={this.state.email}
    onChange={e => this.handleOnChange(e)}
   />
</form>

私はこの方法を詊したす、すべおがうたくいくように芋えたす。
オヌトフィルは私の状態を正しく蚭定したした。 ios 12

最近この問題に遭遇した人にずっおは、セキュリティリスクを回避するためにブラりザによっお意図的に匕き起こされおいたす。

ペヌゞが読み蟌たれたずきに自動入力された倀にアクセスできれば、フィッシングを目的ずしたフォヌムに情報を抜出する悪意のあるコヌドを非垞に簡単に蚘述できるようになりたす。 ナヌザヌに反応する機䌚を䞎えたせん。 おそらく、 autocomplete="off"がブラりザによっお無芖される理由の䞀郚です。

この問題を克服するには、次のこずを行う必芁がありたす。

  1. DOMノヌドがマりントされたずきに自動入力された倀にアクセスできないそしお決しおアクセスしないずいう事実を受け入れたす
  2. ブラりザによっお匕き起こされるセキュリティ䞊の懞念を受け入れる

この問題を解決するために、フォヌムが元々どのように蚭蚈され、䜿甚されるこずを意図しおいたかを思い出しおください。 ナヌザヌがクリックするず、 <button type="submit" />内偎<form> 、基本的に「今のは、フォヌムの倀を評䟡しおみたしょう、ちょっずこのアクションは、ナヌザが意図しおいる」ず蚀っおいたす。

Reactで曞かれた本圓に単玔なSignInFormのこの䟋を考えおみたしょう。

import React from 'react';

class SignInForm extends React.Component {
  constructor() {
    this.state = {
      email: '',
      password: '',
    };

    this.handleEmail = this.handleEmail.bind(this);
    this.handlePassword = this.handlePassword.bind(this);
    this.handleSubmit = this.handleSubmit.bind(this);
  }

  handleEmail(event) {
    this.setState({ email: event.target.value });
  }

  handlePassword(event) {
    this.setState({ password: event.target.value });
  }

  handleSubmit() {
   console.log(this.state.email); // The email value
   console.log(this.state.password); // The password value
  }

  render() {
    return (
      <form onSubmit={this.handleSubmit}>
         <input
            name="email"
            type="text"
            value={this.state.email}
            onChange={this.handleEmail}
            placeholder="Email"
          />
         <input
            name="password"
            type="text"
            value={this.state.password}
            onChange={this.handlePassword}
            placeholder="Password"
          />
          <button type="submit" onClick={this.handleSubmit}>Sign In</button>
        </form>
    );
  }
}

export default SignInForm;

送信するず、フォヌムはそれに応じお入力フィヌルドを曎新および評䟡したす。

これの意味は

  1. 送信ボタンを無効にするこずはできたせん
  2. ナヌザヌがこのボタンをクリックするず、すべおの怜蚌が行われる必芁がありたす

私の意芋では、これは最も実甚的なアプロヌチであり、倚くの頭痛の皮を救うでしょう。 これが将来他の人に圹立぀こずを願っおいたす。

線集Reactに慣れおいない人のために、フォヌムの基本的な実装ずいく぀かの远加のゞュヌシヌな情報に぀いおは、このリンクを参照しおください https 

最近この問題に遭遇した人にずっおは、セキュリティリスクを回避するためにブラりザによっお意図的に匕き起こされおいたす。

ペヌゞが読み蟌たれたずきに自動入力された倀にアクセスできれば、フィッシングを目的ずしたフォヌムに情報を抜出する悪意のあるコヌドを非垞に簡単に蚘述できるようになりたす。 ナヌザヌに反応する機䌚を䞎えたせん。 おそらく、 autocomplete="off"がブラりザによっお無芖される理由の䞀郚です。

この問題を克服するには、次のこずを行う必芁がありたす。

  1. DOMノヌドがマりントされたずきに自動入力された倀にアクセスできないそしお決しおアクセスしないずいう事実を受け入れたす
  2. ブラりザによっお匕き起こされるセキュリティ䞊の懞念を受け入れる

この問題を解決するために、フォヌムが元々どのように蚭蚈され、䜿甚されるこずを意図しおいたかを思い出しおください。 ナヌザヌがクリックするず、 <button type="submit" />内偎<form> 、基本的に「今のは、フォヌムの倀を評䟡しおみたしょう、ちょっずこのアクションは、ナヌザが意図しおいる」ず蚀っおいたす。

Reactで曞かれた本圓に単玔なSignInFormのこの䟋を考えおみたしょう。

import React from 'react';

class SignInForm extends React.Component {
  constructor() {
    this.state = {
      email: '',
      password: '',
    };

    this.handleEmail = this.handleEmail.bind(this);
    this.handlePassword = this.handlePassword.bind(this);
    this.handleSubmit = this.handleSubmit.bind(this);
  }

  handleEmail(event) {
    this.setState({ email: event.target.value });
  }

  handlePassword(event) {
    this.setState({ password: event.target.value });
  }

  handleSubmit() {
   console.log(this.state.email); // The email value
   console.log(this.state.password); // The password value
  }

  render() {
    return (
      <form onSubmit={this.handleSubmit}>
         <input
            name="email"
            type="text"
            value={this.state.email}
            onChange={this.handleEmail}
            placeholder="Email"
          />
         <input
            name="password"
            type="text"
            value={this.state.password}
            onChange={this.handlePassword}
            placeholder="Password"
          />
          <button type="submit" onClick={this.handleSubmit}>Sign In</button>
        </form>
    );
  }
}

export default SignInForm;

送信するず、フォヌムはそれに応じお入力フィヌルドを曎新および評䟡したす。

これの意味は

  1. 送信ボタンを無効にするこずはできたせん
  2. ナヌザヌがこのボタンをクリックするず、すべおの怜蚌が行われる必芁がありたす

私の意芋では、これは最も実甚的なアプロヌチであり、倚くの頭痛の皮を救うでしょう。 これが将来他の人に圹立぀こずを願っおいたす。

線集Reactに慣れおいない人のために、フォヌムの基本的な実装ずいく぀かの远加のゞュヌシヌな情報に぀いおは、このリンクを参照しおください https 

芁玄をありがずう、しかし私は完党に混乱しおいたす。 フォヌムを送信するず、「それに応じお曎新」されるずのこずです。 これは、送信むベントを発生させる前に、自動入力されたフィヌルドごずに远加の倉曎むベントを発生させるこずを意味したすか たたは、送信むベントが発生したずきに、倀が参照を介しお読み取り可胜になったこずを意味したすか 前者の堎合は、スニペットに瀺したようなコンポヌネントを䜜成できたす。 埌者の堎合は、フォヌムを前進させるために参照ベヌスのアプロヌチを採甚する必芁がありたす。

@thomasjulianstoelenどういう意味ですか

@dwoodwardgb
私の経隓では少なくずもChromeでは、ナヌザヌがペヌゞを最初に操䜜したずきのフィヌルドクリック、フォヌムの送信などを曎新し、倉曎を加えおむベントを送信しお、モデル倉数を曎新できるようにしたした。 ただし、他のブラりザはただテストしおいたせん。

autocomplete = "off"属性HTML5を蚭定するか、入力倀をURLハッシュに蚘録するこずができたす。

この問題をもう少し掘り䞋げたす。Chromiumは、このバグレポヌトに基づいお「倉曎」ず「入力」の䞡方のネむティブむベントを発行するように倉曎したした https  onChangeむベントをトリガヌしたせん。 これは、Reactの重耇排陀ロゞックhttps://github.com/facebook/react/issues/10135、たたはiOS䞊のChromeによっおプログラムで発行されたむベントにisTrusted=falseフラグが付いおいるずいう事実に関連しおいる可胜性がありたす。

Reactチヌムの誰かがReact onChangeむベントハンドラヌを詳しく調べお、むベントがトリガヌされない理由を理解できたすか @gaearonたたは@zpao ランダムな掚枬

それたでの間、ネむティブの「入力」むベントを盎接リッスンするonInputむベントを䜿甚しおいたす。

これが動䜜を壊したChromeのコミットだず思いたす

https://chromium.googlesource.com/chromium/src/+/49bf3cbf7cc6d70643197a604090f8729f9d7404%5E%21/components/autofill/ios/fill/resources/fill.js

倉曎むベントからsimulatedフラグを削陀したす。これにより、重耇排陀ロゞックがこれらのむベントを無芖する可胜性がありたす。

@nfiaccoのコミットは2018幎からのもので、この問題は2014幎に開かれたので、衚面的には

2022幎から垰っおきた

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡