- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:JavaScript 関数名)
関数名のルールによって動作しないJavaScriptの問題
このQ&Aのポイント
- JavaScriptの参考書を読みながら、フォームのボタンがクリックされると、新しいウィンドウで別のページを開くといった簡単なものを書いているところです。
- 関数名をclickとした場合、ボタンがクリックされたらonclick="click()"で関数が呼び出されるようにしましたが、上手く動作しません。
- 色々と試していくうちに、関数名を変えると動作することがわかりましたが、関数名をclickとする場合だけ上手く動作しないのはなぜでしょうか?関数名の付け方のルールも守っているように思います。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
質問者氏は悪くありません。仕様の「バグ」です。 <form action="#"> <p><input onclick="click();"></p> </form> このように書いた場合、まず input.click() を実行しようとします。そして実際、input.click() は存在しますので、これが実行されます。すると onclick の無限ループになりそうですが、そこはブラウザがうまいこと止めてくれます。 もし仮に、ここで input.click() がなければ、今度は form.click() を実行しようとします。click() ではなく submit() にすると分かりやすいでしょう。以下の例は form.submit() が実行されます。 <form action="#"> <p><input onclick="submit();"></p> </form> もし仮に form.submit() がなければ document.submit() を、それもなければ、やっと window.submit() を実行します。 何でこんな仕様になっているのか。昔の IE がそう実装し、多くの人がそれを使い、他のブラウザも追随したからです。昔のスクリプトを動かすためにも、今さら変えられないわけで。わずかな字数を惜しんだ結果、将来に禍根を残した例のひとつと言えます。 そういうわけで、関数名や変数名を考えるときは、どのオブジェクトも持ちそうにない名前にして下さい。こういうのを避けるため、名前空間代わりのオブジェクト(例えば myfunctions = { })を設け、これのメソッドとして関数を定義するといった形もあります。
お礼
くわしい回答ありがとうございます。 プログラミング初心者で名前空間というもの知らなかったので、 そちらも勉強してみようと思います。 ありがとうございました。