IEでjavascript関数の初期値
あるJavaScriptの関数でchromeやfirefoxは正常に動いたけどIE11のみ動かないという現象が発生した。F12キーで開発者ツールからコンソールを確認しましたところ「')'がありません」との表示がされ、さらにその関数を動かすと「'関数名'は定義されていません。」と表示された。
症状
aタグリンクからonclickでtest_func関数を動かしたとする。ソースとしては以下のようなもの。
<html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>title</title> </head> <body> <a href="javascript:void(0);" onclick="return test_func(1)">test</a> <script> function test_func( score, flg = true ){ if( flg ){ alert(1); } } </script> </body> </html>
これをchromeやfirefoxではaタグを叩くと「1」のアラートが表示されるが、IE11では何も動作しなかった。コンソールを追うとページを開いた時点で「')'がありません」と表示、aタグを叩くと「test_funcは定義されていません。」と表示された。
原因
明確な原因は正直分からなかったんだけど、関数の初期値(デフォルト引数)がひっかかっているっぽい。初期値を設定せず、またonclickで関数を叩く際に引数をきちんと渡すと正常に動いた。以下のような形。
<html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>title</title> </head> <body> <a href="javascript:void(0);" onclick="return test_func(1, true)">test</a> <script> function test_func( score, flg ){ if( flg ){ alert(1); } } </script> </body> </html>
その他
JavaScriptでデフォルト引数を使うのは遠慮しておいた方が良さそう。使うとしても関数の中で「if(typeof param === 'undefined') param = デフォルト値;」とチェックして代入するような形で使うようにする。
関連記事
-
-
jQueryでformの各種パーツ(テキストボックス等)の操作まとめ
jQueryでフォームのセレクトメニューやラジオボタン等、各種パーツを操作するこ ...
-
-
JavaScriptでAjaxを使わずにクロスドメインから変数を取得する
JavaScriptの配列形式で出力するファイルを作成しておき、 動的にソースに ...
-
-
javascriptで月末日を取得
以前、PHPで月末日を取得したけれども javascriptで月末日を扱いたいケ ...
-
-
JavaScriptでinputタグのtypeを変更
チェックボックスの状態によってinputタグのtypeをtext⇔passwor ...
-
-
PHPでAPIを作成しJavaScript(jQuery無し)からリクエストする方法
管理画面等から何らかのデータをMySQLに登録し、そのデータをPHPで作成したA ...
-
-
JavaScriptで文字列から数値へ変換時の注意
JavaScriptで文字列から数値へ変換時に思った挙動と異なることがあった。具 ...
-
-
amazon等のECサイトによくにあるアイテムの満足度を星マークで送信・表示する方法
amazon等のECサイトによくにあるアイテムの満足度を星マークかつ5段階で送信 ...
-
-
ページのリロード、ページの戻る
ブラウザのリロードと同じようなボタンを作成してほしいとの 要望があって色々あった ...
-
-
NicEdit(WYSIWYGエディタ)に画像アップロード機能を追加する方法
NicEdit(ウィジウィグエディタ)に画像アップロード機能を追加したかった。本 ...
-
-
formで複数選択可能なセレクトメニュー(プルダウン)を実装する方法(select2)
フォームで複数選択可能なセレクトボックス(プルダウン)を実装したい。ただHTML ...
- PREV
- 複数の方法で301リダイレクト
- NEXT
- VPSに無料SSLのLet's Encryptを導入