I am getting warning message and not compiled while optimizing my JS through closure-compiler in advanced mode.
JSC_TYPE_MISMATCH: actual parameter 1 of Document.prototype.getElementById does not match formal parameter
my js function to change class for div
for (kx = 1; kx <= 5;kx=kx+1) {
document.getElementById(kx).className='newclass';
}
in HTML I having five div as follows
<div id='1' class ='first'> contents </div>
<div id='2' class ='first'> contents </div>
<div id='3' class ='first'> contents </div>
<div id='4' class ='first'> contents </div>
<div id='5' class ='first'> contents </div>
this code working in normal case (without compress / optimization), but while trying to optimize it showing warning/error, How can I fix it?
Closure expects you to pass a string
to document.getElementById()
rather than a number
.
JSC_TYPE_MISMATCH: actual parameter 1 of Document.prototype.getElementById does not match formal parameter
found : number
required: string
at line 3 character 24document.getElementById(kx).className='newclass';
So, explicitly converting kx
to a string
1 should remove that warning:
for (kx = 1; kx <= 5; kx++) {
document.getElementById(kx.toString()).className='newclass';
}
I don't know that I'd bother, though; the original actually compiles. You got a warning rather than an error (I suspect) because a numeric argument will simply be coerced into a string. That said, if your environment promotes warnings to errors, by all means... jump through the hoops.
1 It's worth noting that you can convert a number to a string by simply concatenating with an empty string, i.e.: ''+kx
, and allowing type-coercion to do its thing. I've elected to use Number.prototype.toString()
because, for the purspose of the example, the method call more clearly demonstrates the intent.