TypeError:SafariのNodeのインスタンスでのみNode.addEventListenerを呼び出すことができます

ジミー・ング

Reactコンポーネントに、「Enter」キーを無効にするこのコードがあります。

export const attachDisableEnterEvent = (ref) => {
  const node = ReactDOM.findDOMNode(ref);
  // Evergreen event listener || IE8 event listener
  const addEvent = node.addEventListener || node.attachEvent;
  addEvent('keypress', _disableEnter, false);
}

Chrome / Firefoxでは正常に動作しますが、Safariでは動作しません。Safariで私は得る:-

TypeError:NodeのインスタンスでのみNode.addEventListenerを呼び出すことができます


私はこれを行うことによってのみ(すべての面で)それを機能させることができました:-

addEvent.call(node, 'keypress', _disableEnter, false);

addEventListenerChromeとSafariでの実装が異なるのはなぜか疑問に思っています。ように思えるNode.addEventListenerChromeでだけで直感的に結合するthisことを定義したノードのインスタンスに。

ジョナサン・リン

それはおそらく私たちが以下を持っているのと同じ理由です:

var log = console.log;
log('foo') // TypeError

代わりに、次のことを行う必要があります。

var log = console.log.bind(console); // bind console.log function to it's proper context
log('foo') // 'foo'

あなたの場合、

addEvent('keypress', _disableEnter, false);

コンテキストを(暗黙的に)ウィンドウオブジェクトにします。

一般に、他の誰かに関数を渡す場合は、常に最初に関数を所有オブジェクトにバインドする必要があります。ブラウザの実装はブラウザごとに異なるため、それが均一に機能することを保証するための最良の方法です。

コンソールの場合、.logはコンソールオブジェクト自体の他のインスタンスメソッドを参照していると思います。そのため、Safariでは、node.addEventListener関数はでのみ定義された他の関数を必要とする方法で実装される可能性がnodeあり、おそらくより説明的なエラーメッセージもスローされます。

したがって、代わりに次のことを行う必要があります。

const addEvent = node.addEventListener || node.attachEvent;
const boundAddEvent = addEvent.bind(node);
// use boundAddEvent however you like anywhere, or .call like you did

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

addEventListener関数でthis.setStateを呼び出すことはできません

分類Dev

クラスのインスタンス変数を呼び出すことができませんか?

分類Dev

クラスのインスタンスを呼び出すことができるのはなぜですか?

分類Dev

addEventListenerで関数を呼び出すが、関数は1回しか機能しないため、再度呼び出すことはできません。

分類Dev

AWSCloudFormationはAWSAPIを呼び出すことができますか?

分類Dev

ajaxとphpを呼び出すことができません

分類Dev

JavaScriptの関数をObjectのインスタンスとして呼び出すことはできますか?

分類Dev

AnkoでStartActivityForResultを呼び出すことができません

分類Dev

SpringCloudでRestEndpointを呼び出すことができません

分類Dev

AngularでAPIを呼び出すことができません

分類Dev

CustomListAdapterでnotifyDataSetChangedを呼び出すことができません

分類Dev

NSStreamEventHasBytesAvailableを呼び出すことができません

分類Dev

jqueryajaxを呼び出すことができません

分類Dev

モデルを呼び出すことができません

分類Dev

ExoplayerはseekTo()を呼び出すことができません

分類Dev

UIKeyboardTaskQueueはメインスレッドからのみ呼び出すことができます

分類Dev

SetActive()は、メインスレッドからのみ呼び出すことができます

分類Dev

TypeError:ShallowWrapper :: renderProp()はカスタムコンポーネントでのみ呼び出すことができます

分類Dev

PowerShellを使用してC#DLLをインポートしています。インスタンスのgetterメソッドを呼び出すことはできますが、setterメソッドを呼び出すことはできません。

分類Dev

Node.js TypeError:未定義のメソッド 'write'を呼び出すことができません

分類Dev

この「InvalidOperationException:EnsureRunningOnMainThreadはメインスレッドからのみ呼び出すことができます」を処理する方法

分類Dev

Javascriptサブクラスのインスタンスメソッドは、その親の静的メソッドを呼び出すことができますか?

分類Dev

手動で呼び出さないと、関数の1つを呼び出すことができません

分類Dev

このインスタンスのonelinerでメソッドをインスタンス化して呼び出すことはできません

分類Dev

javascriptを介してhtml <input>画像を変更すると、メソッドaddEventListenerを呼び出すことができません

分類Dev

node.jsカスタムイベント:未定義のメソッド 'emit'を呼び出すことはできません

分類Dev

vue.js test:unit w test-utils&Jest:[vue-test-utils]:wrapper.destroy()はVueインスタンスでのみ呼び出すことができます

分類Dev

AngularJS:Promiseは別の関数を「呼び出す」ことができますか?

分類Dev

typescriptのconstructor()内でsuper()を呼び出すことができません

Related 関連記事

  1. 1

    addEventListener関数でthis.setStateを呼び出すことはできません

  2. 2

    クラスのインスタンス変数を呼び出すことができませんか?

  3. 3

    クラスのインスタンスを呼び出すことができるのはなぜですか?

  4. 4

    addEventListenerで関数を呼び出すが、関数は1回しか機能しないため、再度呼び出すことはできません。

  5. 5

    AWSCloudFormationはAWSAPIを呼び出すことができますか?

  6. 6

    ajaxとphpを呼び出すことができません

  7. 7

    JavaScriptの関数をObjectのインスタンスとして呼び出すことはできますか?

  8. 8

    AnkoでStartActivityForResultを呼び出すことができません

  9. 9

    SpringCloudでRestEndpointを呼び出すことができません

  10. 10

    AngularでAPIを呼び出すことができません

  11. 11

    CustomListAdapterでnotifyDataSetChangedを呼び出すことができません

  12. 12

    NSStreamEventHasBytesAvailableを呼び出すことができません

  13. 13

    jqueryajaxを呼び出すことができません

  14. 14

    モデルを呼び出すことができません

  15. 15

    ExoplayerはseekTo()を呼び出すことができません

  16. 16

    UIKeyboardTaskQueueはメインスレッドからのみ呼び出すことができます

  17. 17

    SetActive()は、メインスレッドからのみ呼び出すことができます

  18. 18

    TypeError:ShallowWrapper :: renderProp()はカスタムコンポーネントでのみ呼び出すことができます

  19. 19

    PowerShellを使用してC#DLLをインポートしています。インスタンスのgetterメソッドを呼び出すことはできますが、setterメソッドを呼び出すことはできません。

  20. 20

    Node.js TypeError:未定義のメソッド 'write'を呼び出すことができません

  21. 21

    この「InvalidOperationException:EnsureRunningOnMainThreadはメインスレッドからのみ呼び出すことができます」を処理する方法

  22. 22

    Javascriptサブクラスのインスタンスメソッドは、その親の静的メソッドを呼び出すことができますか?

  23. 23

    手動で呼び出さないと、関数の1つを呼び出すことができません

  24. 24

    このインスタンスのonelinerでメソッドをインスタンス化して呼び出すことはできません

  25. 25

    javascriptを介してhtml <input>画像を変更すると、メソッドaddEventListenerを呼び出すことができません

  26. 26

    node.jsカスタムイベント:未定義のメソッド 'emit'を呼び出すことはできません

  27. 27

    vue.js test:unit w test-utils&Jest:[vue-test-utils]:wrapper.destroy()はVueインスタンスでのみ呼び出すことができます

  28. 28

    AngularJS:Promiseは別の関数を「呼び出す」ことができますか?

  29. 29

    typescriptのconstructor()内でsuper()を呼び出すことができません

ホットタグ

アーカイブ