I have a code like this:
<html>
<head>
<script language="javascript">
window.onload = function() {
for(i = 0; i < 26; i++) {
var x = document.createElement("INPUT");
x.setAttribute("type", "button");
x.setAttribute("value", String.fromCharCode(i + 65));
x.setAttribute("id", String.fromCharCode(i + 65));
x.setAttribute("onclick", "isTOF(self.id)");
document.body.appendChild(x);
}
}
function isTOF(v) {
alert(v);
}
</script>
</head>
<body>
</body>
</html>
I wanted to make it alert its own alphabet(value), but it doesn't work.
So for example, when I click A Button, the program should alert 'A'.
But it alerts 'undefined'.
I don't know what the problem is.
I want to make my code work properly.
How can I make it?
The problem you are having is caused by self not being defined. Instead, you should use the value that you already set, and pass in this to isTOF:
<html>
<head>
<script language="javascript">
window.onload = function() {
for(i = 0; i < 26; i++) {
var x = document.createElement("INPUT");
x.setAttribute("type", "button");
x.setAttribute("value", String.fromCharCode(i + 65));
x.setAttribute("id", String.fromCharCode(i + 65));
x.setAttribute("onclick", "isTOF(this)");
document.body.appendChild(x);
}
}
function isTOF(v) {
alert(v.value);
}
</script>
</head>
<body>
</body>
</html>
This way, you are passing a reference to the element to isTOF in case you want to do anything with it or just for purely information purposes.
Hope this helps!
The problem is:
x.setAttribute("onclick", "isTOF(self.id)");
There's no variable named self in scope at that point. Perhaps you meant to use this, which would work:
for (i = 0; i < 26; i++) {
var x = document.createElement("INPUT");
x.setAttribute("type", "button");
x.setAttribute("value", String.fromCharCode(i + 65));
x.setAttribute("id", String.fromCharCode(i + 65));
x.setAttribute("onclick", "isTOF(this.id)");
document.body.appendChild(x);
}
function isTOF(v) {
alert(v);
}
But since you have a direct reference to the element already, rather than assign a string attribute in the HTML to be turned into a handler (which is basically eval in the form of an HTML attribute), it would be better to attach the listener properly using Javascript - which will make things easier, because then the id, if you set a variable to it beforehand, can simply be referenced again in the handler, rather than having to check this.id. In addition, you can often use dot notation rather than setAttribute, which is more concise and easier to read, so it's probably preferable in most cases:
for (let i = 0; i < 26; i++) {
const x = document.createElement("INPUT");
x.type = 'button';
const id = String.fromCharCode(i + 65);
x.value = id;
x.id = id;
x.onclick = () => isTOF(id);
document.body.appendChild(x);
}
function isTOF(v) {
console.log(v);
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With