2014-04-11 4 views
0

Я унаследовал некоторый код, мне не разрешено слишком сильно меняться, так как мой босс считает, что это будет слишком много работы (сайт действительно, действительно ужасный). Существует функция javascript, которая предназначена для воспроизведения звука onclick, который отлично работает в первый раз, когда он вызывается, а второй я получаю ошибку Uncaught TypeError: object is not a function.Uncaught TypeError: объект не является функцией во втором вызове

Вот код, переменные чудовищно по имени, к сожалению:

function FP_playSound(path) { 
    var b, d = document, e, es, i, se = "<EMBED SRC='" + path + "' HIDDEN=TRUE LOOP=FALSE AUTOSTART=TRUE>"; 
    if (d.body) 
     b = d.body; 
    if (d.getElementsByTagName) { 
     es = d.getElementsByTagName('embed'); 
     for (i = 0; i < es.length; i++) { 
      e = es(i); 
      if (e.src == path) { 
       if (e.removeNode) e.removeNode(); 
       break; 
      } 
     } if (b != null && b.insertAdjacentHTML) b.insertAdjacentHTML("beforeend", se); 
    } 
} 

и вот один из вызовов:

<img id="img1" alt="" onclick="FP_playSound(/*url*/'sound/nikon-shutter.wav'); menue01_click(); " onmouseout="FP_swapImgRestore()" onmouseover="FP_swapImg(1,1,/*id*/'img1',/*url*/'images/menue01_ro.png')" class="style2" src="images/menue01.png" /> 

Там нет никакого конфликта с именованием функции и любой идентификаторы. Это что-то, о чем я должен знать в javascript? Нужно ли мне изменять функцию или вызовы?

ответ

4

Проблема эта линия:

e = es(i); 

Это пытается вызвать es как функцию, но es не функция, это NodeList.

Оно должно быть:

e = es[i]; 

... который извлекает запись из списка для индекса i.

Это не вызывает проблем в первый раз, поскольку в первый раз список пуст, и мы никогда не добираемся до этой строки кода. Во второй раз, поскольку вы добавили элемент embed в первый раз, список не пуст, и мы дойдем до этой строки, что вызывает ошибку (по уважительной причине).

+1

Спасибо! Я заметил аналогичную проблему для кого-то другого на днях (в Python), очень раздражающего, что я его пропустил. Я приму свой ответ, как только смогу. Ура! –

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