2017-05-09 18 views
0

次のコードにボタンを置いたときに問題があります。 このJavascriptプログラムと私は言ってコンソールにエラーメッセージが表示されます。この機能は、私の目の前にあるときボタンがJavaScriptで消えています

ReferenceError: myClickFunc is not defined 

。以下は関連するコードです。

最近似たような投稿をしましたが、回答は得られませんでしたが、いくつかのヒントがあり、問題を解決するためにいくつかの調査を行いました。ここで私は午前中に現在の状況がある

行の前に次のコードでボタン:

dbRef.on("value", function(snapshot) 

作品、それは必要がありますが、非常にすぐに消えるよう。他のボタン(ループ内)は、上記のエラーメッセージを生成します。私が気づいたもう一つのことは、ページが読み込みを終了しないように見えるということです。

<!DOCTYPE html> 
<html lang="en"> 
<head> 
<meta charset="utf-8"> 
<title>Web application</title> 
</head> 

<body> 

<script src="https://www.gstatic.com/firebasejs/3.9.0/firebase.js"></script> 

<script> 

function someCallingFunc(timeRef,work) 
{/* Beginning of someCallingFunc */ 
var workRef = timeRef.child(work) 

workRef.on("value", function(workSnapshot) { 
    var rcdData = workSnapshot.val(); 
    document.write("English name: " + rcdData["engName"] + "<br/>\n"); 
    document.write("<input type='Submit' value='Edit' onClick='myClickFunc()'><br/>\n"); 
}); 

}/* End of someCallingFunc */ 


function myClickFunc() 
{/* Beginning of myClickFunc */ 
window.open("http://www.google.com"); 
}/* End of myClickFunc */ 


var config = { 
    apiKey: ".........", 
    authDomain: "..........firebaseapp.com", 
    databaseURL: "..........firebaseio.com", 
    projectId: ".........", 
    storageBucket: "..........appspot.com", 
    messagingSenderId: "........." 
}; 
firebase.initializeApp(config); 

var dbRef = firebase.database().ref().child('DataList'); 

// This button works but only appears for half a second, then disappears. 
document.write("<button onClick='myClickFunc()'>EDIT</button><br/>\n"); 

dbRef.on("value", function(snapshot) { 

for (number in snapshot.val()) { 
    document.write("Year " + number + " :<br/>\n"); 
    var numberRef = dbRef.child(number) 
    numberRef.on("value", function(numberSnapshot) { 
     for (work in numberSnapshot.val()) { 
     someCallingFunc(numberRef,work); 
     document.write("<br/>\n"); 
     } 
    }); 
}}); 
</script> 

</body> 
</html> 

myClickFunc()の場所をさまざまな方法で変更しようとしましたが、成功しませんでした。

JSでの経験はあまりありませんが、私は初心者の間違いをしなければなりません。しかし、そのミスはどこですか?

+0

イベントハンドラで 'document.write'を使用しています。このイベントハンドラは、ページがロードされ、 'document'が閉じられた後に呼び出されます。このため、この時点で 'document.write'を呼び出すと、既存のコンテンツが追加されるのではなく上書きされます。 –

答えて

1

問題は、イベントハンドラでdocument.writeを使用していることです(dbRef.on("value", ...)。したがって、非同期に呼び出すと、この時点で文書が閉じていることを意味します。したがって、document.writeは暗黙的にdocument.openを呼び出し、現在のページをクリアし、そこにあるすべてのもの(特にあなたのボタン)を削除します。

document.writeを使用してドキュメントにコンテンツを追加する代わりに、DOM操作を使用します。

var p = document.createElement("p"); 
p.innerHTML = "Hello <b>world!</b>"; 
document.body.appendChild(p); 
1

https://developer.mozilla.org/en-US/docs/Web/API/Document/write

最初のノートを見てみましょう。:」クローズ(ロード)文書上の...呼び出しのdocument.writeたとえば、ページに新しい段落を追加するために、あなたはこれを行うことができます自動的にdocument.openを呼び出し、ドキュメントをクリアします。 "

イベントハンドラは、ページがロードされた後にしばらく呼び出されます。つまり、documentが閉じられています。

document.writeを使用する代わりに、document.createElement()という要素を作成し、.appendChild()を付けてDOMを直接操作する必要があります。
のボタンを追加するには、ページが読み込まれている間にdocumentがまだ開いているので、一般的にはdocument.writeを避けることをお勧めします。そのため、DOM操作で追加することを検討する必要があります。

関連する問題