JavaScript - onclick ハンドラーを実行できない場合のトラブルシューティング

okwaves2024-01-25  9

この質問にはすでに答えがあります: JavaScript における変数のスコープは何ですか?

(回答数 27)

3 年前

に閉店しました。

このページを読むと、ここで設定したハンドラーのような「onclick」ハンドラーを実行できないことがわかりました。

function handler() {
  console.log(5);
}
<button onclick="handler()"></button>

これは私が使用する唯一のモジュールです: <script type="module&引用; src="../js/js_test.js"></script>。ヘッダーにあります。

これは私が受け取るエラーです:

これをモジュールに含めると機能します:

let button = document.querySelector('button');
button.onclick = handler;

何かアイデアはありますか?

追記コンソール上のモジュールに書き込んだ変数にアクセスできません。一度はこれができると思っていました。役立つかどうかはわかりません。

スクリプト ファイルがそのページに読み込まれていることを確認しますか?スクリプトはページの先頭に追加されますか?

– いつも助けてくれる

2020 年 9 月 5 日午前 1 時:22

モジュールの紹介をご覧ください。一部のエクスポートとインポートが不足しています。

– ドミニク・フォルティン

2020 年 9 月 5 日 1:24

@AlwaysHelping はい

– トニトーン120

2020 年 9 月 5 日 1:24

1

(1) Inline ハンドラーはグローバル変数のみを参照できます (2) モジュールのトップレベルはグローバルではありません。したがって、別の方法を見つける必要があります。できればインライン ハンドラーを回避することです。 JS 経由でリスナーをアタッチします。代わりに、.onclick = handler を割り当てるか、button.addEventListener('click', handler) を使用して、最後のコード スニペットを使用してください。これにより、スコープの問題が正常に回避されます。

– あるパフォーマンス

2020 年 9 月 5 日 2:03

1

トップレベルの変数は次のとおりですグローバル識別子 (どの変数名がどの値にバインドされているかを確認するときに JS が参照する最上位の LexicalEnvironment に入れられます)、その結果、ページ上のあらゆるものから参照できるようになります。変数がvarで宣言されている場合、または関数宣言である場合は、グローバルオブジェクト(ウィンドウ)のプロパティとしても自動的に追加されます。ウィンドウ上のプロパティは「グローバル」です。つまり、どこでも参照できるということです。これはグローバル ID とまったく同じというわけではありませんが、ほとんどの場合は同じであると考えられます。

– あるパフォーマンス

2020 年 9 月 5 日 2:22



------------------------

エクスポートとインポートを使用することもできます。関数をエクスポートして別のファイルにインポートする

1

何をエクスポートすることをお勧めしますか?また、どこにインポートすることをお勧めしますか?

– トニトーン120

2020 年 9 月 5 日 1:35



------------------------

js_test.js では次のようにします

export function handler() {
  console.log(5);
}

HTML 内で行う

<html>
</head>
  <script type="module" src="../js/js_test.js"></script>

  <script type="module">
    import {handler} from '../js/js_test.js';

    document.onload = function(){
      document.getElementById('myButton').addListener("click", handler);
    };

  </script>
</head>
<body>
   <button id="myButton"></button>
</body>
</html>

Aks Jacoves の提案に従って編集

モジュールを実行する古い方法は次のとおりです

js_test_old.js では次のようにします

(function _module_x (global) {

  global.myNamespace = global.myNamespace || {};

  global.myNamespace.handler = _handler_;

  function _handler_ () {
    console.log(5);
  }
})(window);  // or })( (function(){return this;})() ); // this works for both Node.js and html

HTML 内で行う

<html>
</head>
  <script src="../js/js_test_old.js"></script>
</head>
<body>
   <button onclick="myNamespace.handler()"></button>
</body>
</html>

4

ありがとう。 「モジュール外の import ステートメントは使用できません」というエラーが発生する

– トニトーン120

2020 年 9 月 5 日 1:39

タイプ="モジュール" を追加します。 2 番目のタグ <script>

– アクス・ジェイコブス

2020 年 9 月 5 日 1:41

私の投稿と同じエラーがまだ発生します。モジュールの場合、.html ファイル内の属性の値としてハンドラーを参照することは、ハンドラーが「インライン」として存在する場合にのみ機能することを意味するのでしょうか。 javascript (.html ファイル内の script タグの内容)?それは迷惑そうですね!モジュールを通常のスクリプトに変換すると機能するようになります

– トニトーン120

2020 年 9 月 5 日 1:47

@tonitone120 はい、ハンドラーはスクリプト タグ内でのみ表示されます。ただし、リスナー (つまり、イベント ハンドラー) を追加できます。

– ドミニク・フォルティン

2020 年 9 月 5 日 2:46



------------------------

HTML 要素の読み込みが完了したら、必ずリスナーを追加してください

document.onload = function(){
   function handler(){
     console.log(5);
   }
}

1

これは明らかに機能しません。ハンドラは onload の外部では表示されません。

– ドミニク・フォルティン

2020 年 9 月 5 日 1:20

総合生活情報サイト - OKWAVES
総合生活情報サイト - OKWAVES
生活総合情報サイトokwaves(オールアバウト)。その道のプロ(専門家)が、日常生活をより豊かに快適にするノウハウから業界の最新動向、読み物コラムまで、多彩なコンテンツを発信。