要素の ID と同じ名前の JavaScript 関数を定義すると、予期しないエラーが発生する可能性があります。起こる。この記事では、この競合の根本的な理由を調査し、そのような状況に関する JavaScript の仕様や制限について調査します。
JavaScript には、初期バージョン (1.0 から 1.3 まで) に起因するレガシー スコープ チェーンの問題があります。 )。フォームの一部であるフォーム コントロールのイベント ハンドラー属性値では、フォームを表す Form オブジェクトはスコープ チェーンの 2 番目から次のオブジェクトとしてアクセス可能になりますが、フォーム コントロール オブジェクト自体は 2 番目から次です。
Form オブジェクトは、それに含まれるフォーム コントロールの名前を表すプロパティを持っています。これにより、次の構文を使用してフォーム コントロール オブジェクトにアクセスできるようになります:
myForm.border
これは標準準拠の構文の短縮形です:
document.forms["myForm"].elements["border"]
その結果、フォーム コントロールの使用時にイベント ハンドラー属性値に name を指定すると、Form オブジェクトの対応するプロパティを参照することと同じになります。このフォーム コントロールの名前がユーザー定義関数と一致する場合、呼び出し不可能なフォーム コントロール オブジェクトが実行されます。これにより、「TypeError: [関数名] は関数ではありません。」というエラーが発生します。
既存の DOM 実装を標準化した DOM レベル 2 HTML 仕様では、追加の機能が導入されました。特徴。これは、ブラケット プロパティ アクセサー構文 [...] を使用して、HTMLCollection の項目に名前または ID でアクセスできることを指定しました。
フォームおよびフォーム コントロールのコンテキストでは、これにより、アクセス方法が拡張され、次の要素が含まれるようになりました。 IDも同様に。その結果、前述の競合が ID を持つ要素にも適用されるようになり、関数名が要素の ID と競合すると同じエラーが発生します。
この従来の問題を理解するには、JavaScript の歴史的進化に関する知識が必要です。とその DOM API への影響。フォーム コントロールと関数の間の名前の競合を回避したり、ID を使用したりするなど、ベスト プラクティスに従うことで、この問題を軽減し、予期しないエラーを防ぐことができます。
以上がJavaScript 関数名が要素 ID と衝突するとエラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。