🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

15547閲覧

javascript: Uncaught SyntaxError: Identifier 'FN' has already been declared

nanase21

総合スコア144

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2019/11/05 03:40

編集2019/11/05 03:55

困っている事

Uncaught SyntaxError: Identifier 'Ok' has already been declaredの解決方法が分からなく困っています。
エラーとしては、変数を再定義にしたことによって起きています。
原因としては、jsを共通化しようと2つのファイルで同じjsのソースを使用しようとしたところエラーが発生しました。
エラーが起きるタイミングとしては、登録フォーム途中で離脱してから再度登録フォームに戻る時に発生します。
リロードすると直るのですがリロードしなくてもエラーが起きないようにしたいです。

js

1let FN = document.getElementById("firsname"); 2let LN = document.getElementById("lastname"); 3 4const Ok = 'God'; 5const Bad = 'Bad'; 6 7 8(function () { 9 'use strict'; 10 let inputText = document.getElementById("first_name"); 11 12 inputText.addEventListener('keyup', function() { 13 let s = inputText.value; 14 if(!!s){ 15 FN.textContent = Ok; 16 ChangeGS(FN); 17 }else{ 18 FN.textContent = Bad; 19 ChangeBS(FN); 20 } 21 }, false); 22})(); 23 24(function () { 25 'use strict'; 26 let inputText = document.getElementById("last_name"); 27 28 inputText.addEventListener('keyup', function() { 29 let s = inputText.value; 30 if(!!s){ 31 LN.textContent = Ok; 32 ChangeGS(LN); 33 }else{ 34 LN.textContent = Bad; 35 ChangeBS(LN); 36 } 37 }, false); 38})(); 39

質問に対する返答

「statusOk」は変数名をわかりやすくするために「ok」に変えたのですが、エラー文の中身が未修正でした。

ググった情報

私なりに調べてみたところ。letconstで宣言されているのが原因で、それらは再定義できないためエラーが起きているとのことでした。解決策としては、varを使用するとで解決できましたがES6での書き方においてvarを使用しても大丈夫なのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kei344

2019/11/05 03:48

「StatusOk」という変数があるはずですが、提示のものにはありません。また、「遷移した時」とありますが、vue.jsやturbolinksやPjaxなどを使用しているならそれも提示してください。
nanase21

2019/11/05 03:59

遷移したときっているのは私の表現の誤りでvue.jsなどは使用しておりません。遷移の意味としては、入力途中にユーザーが離脱して他のページに移った時を指しています。 他のページに移った後にもう一回登録フォームに戻った時にエラーが発生します。 質問ないにも追記しましたが、letを使用して変数を宣言している箇所をvarに変更したところエラーを回避する事ができました。ただし、気になる点があって、ES6においてvarを使った変数宣言をまだしても大丈夫なのでしょうか? ご教示いただけると幸いです。
x_x

2019/11/05 05:18

タイトルでは 'FN' となっていますが本文では 'Ok' となっています。どちらが正しいのでしょうか?
nanase21

2019/11/06 01:12

申し訳ございません。 Okです。
guest

回答2

0

ベストアンサー

同じスクリプトが2回呼ばれる(読み込まれる)書き方になっているはずなので、それを解消しましょう。

投稿2019/11/05 03:59

kei344

総合スコア69596

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nanase21

2019/11/06 01:15

ご教示いただきありがとうございます。 jsファイルの呼び出しをhtmlテンプレートの一番下に置いているので、そのページに飛ぶとどうしても重複して呼ばれるようになっているのですが2回呼ばれる書き方についてもう少し具体的にご教示いただけないでしょうか? 書き方の参考などがあれば、ご教示いただけると幸いです。
kei344

2019/11/06 02:05

スクリプトをどうやってHTML内に表示させるようになっているのかを提示してください。 また、「jsを共通化しようと2つのファイルで同じjsのソースを使用しようとしたところ」とありますが、それだと共通化になっていないのでは。(同じコードが複数書かれているのは共通化に失敗しています)
kei344

2019/11/09 03:57

To: nanase21 さん 結局どのように解決したか回答欄にお書きいただけませんか?このページに辿り着いた同じ疑問を持つ人のために、ぜひお願いします。
nanase21

2019/11/09 10:39 編集

申し訳ございませんでした。 今、私が解決した方法を回答に載せました。 >スクリプトをどうやってHTML内に表示させるようになっているのかを提示してください。 に関しては、ソースコードが長すぎてアップ出来ないので端的に説明させていただきますと、bodyの一番下に外部のjsファイルを呼び出すようにしています。
guest

0

ES6から導入されたletconstといった変数で宣言すると、再読み込み時に再定義出来ずにエラーになるので、今回はvarを使った変数宣言をすることで上記のエラーを解決する事ができました。
おそらく、他にもっとよりよい解決方法があると思いますが私はこの方法で解決できたので一旦質問を閉じさせていただきます。

投稿2019/11/09 10:36

nanase21

総合スコア144

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問