Атрибут Onchange не вызовет функцию
-
22-09-2019 - |
Вопрос
У меня есть документ 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, который имеет ваш текущий сценарий.