2015-04-09 3 views
2

Я получаю предупреждающее сообщение и не скомпилирован при оптимизации моего JS до closure-compiler в расширенном режиме.Как передать параметр по переменной в JAVASCRIPT

JSC_TYPE_MISMATCH: фактический параметр 1 из Document.prototype.getElementById не соответствует формальному параметру

моих JS функции для изменения класса для DIV

for (kx = 1; kx <= 5;kx=kx+1) { 
document.getElementById(kx).className='newclass'; 
    } 

в HTML I содержит пять DIV следующим образом

<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> 

этот код работает в нормальном случае (без сжатия/оптимизации), но при попытке оптимизировать его, показывая предупреждение/ошибку, как я могу его исправить?

+1

Я считаю это ошибкой в ​​Closure, потому что то, что вы делаете, будет отлично работать в реальном браузере. В пред-HTML5-спецификациях утверждалось, что свойства «id» должны быть действительными идентификаторами, но в HTML5 (и во всех современных браузерах) это не так - любая строка без встроенных пространств действительна. – Pointy

+0

@Pointy Я думаю, что это больше связано с [типом аргумента] (http://stackoverflow.com/a/29539934/621962). – canon

+1

@canon Да, согласен, но я хочу сказать, что предупреждение - это просто шум, поскольку (как вы заметили) код будет работать. – Pointy

ответ

4

Закрытие ожидает, что вы пройдете string до document. getElementById(), а не number.

JSC_TYPE_MISMATCH: фактический параметр 1 из Document.prototype.getElementById не соответствует формальному параметру
найдено: количество
Требуется: строка
в строке 3 символов 24

document.getElementById(kx).className='newclass';

Таким образом, явное преобразование kx в string следует удалить это предупреждение:

for (kx = 1; kx <= 5; kx++) { 
    document.getElementById(kx.toString()).className='newclass'; 
}

Я не знаю, что я бы заморачиваться, хотя; оригинал фактически компилируется. У вас есть предупреждение, а не ошибка (я подозреваю), потому что числовой аргумент просто будет принуждаться к строке. Тем не менее, если ваша среда способствует предупреждению об ошибках, непременно ... прыгайте через обручи.

Стоит отметить, что вы можете преобразовать число в строку, просто конкатенации с пустой строкой, т.е .: ''+kx, и позволяя type-coercion делать свое дело. Я решил использовать Number.prototype. toString(), потому что для использования примера вызов метода более четко демонстрирует намерение.

Смежные вопросы