Вопрос

У меня есть документ HTML (здесь), который создает медиаплеер на основе IFRAME для коллекции песен в альбомах (я только что использовал буквы, чтобы определить эти альбомы и песни в Mymusic Array, для простоты).

Сосредоточив внимание на 3 лучших iframes, как я издал взаимодействие с пользователем, - это генерировать HTML для форм доступных альбомов и песен с использованием JavaScript и написать их на iframes в теле. Если вы запустите его и сделаете выбор в Альбомы меню, вы увидите, что варианты в Песни меню соответствует mymusic массив, так что это работает.

Однако, когда я выбираю песню, функция nowplaying(trackindex,albumindex) Следует вызвать с помощью onchange событие в Песни форма, так же, как в форме, генерируемой с использованием showinitial() ... но функция не вызывается.

Я исключил кодирование nowplaying сам по себе, потому что даже когда я меняю nowplaying к alert("hello"), это не вызывается. Так что это заставляет меня думать, что проблема с onchange Атрибут в «что -нибудь», но я не вижу проблемы. То, как я кодировал, это ничем не отличается раньше, и это работало нормально, так почему это не работает?

Любая помощь приветствуется!

Это было полезно?

Решение

Firebug - твой друг ....

Я не определен

function onchange (event) {parent.nowplaying (this.selectedIndex, i); }(сдача )

Онкондж вызывается, но я не определяется при вызове NowPlaing.

Это результат этой линии:

p+="<html><head></head><body><form><select onchange='parent.nowplaying(this.SelectedIndex,i);' size='"; 

который использует «i» в строке, когда он должен добавить его как переменную:

p+="<html><head></head><body><form><select onchange='parent.nowplaying(this.SelectedIndex," + i + ");' size='"; 

Чтобы уточнить, я определяется, когда называется что -нибудь (i), но вы не пишете I в код, просто букву i. Когда сейчас называется теперь, когда я больше не определен, я больше не определяется, потому что вы больше не находятся внутри функции Anhous (). Вам нужно расширить I, когда вы добавляете HTML к P, чтобы значение было, а не переменной i.

Другие советы

function anything(i){
    p+="...<select onchange='parent.nowplaying(this.SelectedIndex,i);'...";

Ваш обработчик событий OnChange установлен из строки. При запуске он не будет иметь доступа к i, которая является локальной переменной из anything функция, которая давно ушла.

Простое исправление будет:

    p+="...<select onchange='parent.nowplaying(this.SelectedIndex,'+i+');'...";

который поворачивает текущее значение i во время строки в целочисленном буквальном литературе внутри строки.

Однако, как правило, не очень хорошая идея - создавать код из строк. Обычно лучше написать обработчик событий как обычный объект функции:

// You will need the below workaround to get the iframe document in IE too
//
var iframe= document.getElementById('songs');
var idoc= 'contentDocument' in iframe? iframe.contentDocument : iframe.contentWindow.document;

idoc.open();
idoc.write(s);
idoc.close();

idoc.getElementsByTagName('select')[0].onchange= function() {
    // This is a closure. The 'i' variable from the parent 'anything' function is
    // still visible in here
    //
    parent.nowplaying(this.selectedIndex, i);
};

Однако, как правило, вы хотели бы избежать установки обработчиков из одного кадра на другой. Я не совсем уверен, что iframes набирают вас здесь, кроме головных болей. Почему бы просто не использовать позиционированные DOV с переполнением? Вы все еще можете переписать их контент через innerHTML Если вам нужно ... хотя я бы предпочел заполнить их, используя методы DOM, чтобы избежать всех проблем с инъекцией HTML, который имеет ваш текущий сценарий.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top