2015-06-11 2 views
0

Эй У меня есть следующий код, который работает правильно, как дело с аудио событий, однако это не работает в плавающем фрейме:JS Event Listener в плавающем фрейме

var sounds = document.getElementsByTagName('audio'); 
/* Loop through the nodelist - this is **not** an array */ 
for(var i = 0; i < sounds.length; i++){ 
/* Get the item in your nodelist. This **is** an element. */ 
var sound = sounds.item(i); 
/* Now add your event listener here - You can only add one at a 
* time, though. So I decided to make the event a separate 
* function and attach it multiple timers. */ 
function eventHandler(){ 
    document.title = document.title.replace('\u25B6', '') 
    if (!sound.paused) { 
     document.title = '\u25B6 ' + document.title.replace('\u25B6 ', '') 
     return false; 
    } 
} 
sound.addEventListener('play', eventHandler, false); 
sound.addEventListener('pause', eventHandler, false); 
sound.addEventListener('ended', eventHandler, false); 
} 

Таким образом, я использовал следующий код, но это приходит с ошибкой: «неопределенный не является функция (оценка„iframe.contentWindow.getElementsByTagName (“аудио„)“)»

var iframes = document.getElementsByTagName('iframe'); //all iframes on page 
for(var i=0; i<iframes.length; i++){ 
var iframe = iframes.item(i); 
var sounds = iframe.contentWindow.getElementsByTagName('audio'); 
/* Loop through the nodelist - this is **not** an array */ 
for(var i = 0; i < sounds.length; i++){ 
/* Get the item in your nodelist. This **is** an element. */ 
var sound = sounds.item(i); 
/* Now add your event listener here - You can only add one at a 
* time, though. So I decided to make the event a separate 
* function and attach it multiple timers. */ 
function eventHandler(){ 
    document.title = document.title.replace('\u25B6', '') 
    if (!sound.paused) { 
     document.title = '\u25B6 ' + document.title.replace('\u25B6 ', '') 
     return false; 
    } 
} 
} 
    sound.addEventListener('play', eventHandler, false); 
    sound.addEventListener('pause', eventHandler, false); 
    sound.addEventListener('ended', eventHandler, false); 
} 
+0

Привет! Просто мои два пенсов, но я думаю, вам нужно выбрать документ перед вызовом каких-либо элементов getters: 'iframe.contentWindow.document.getElementsByTagName ('audio');' - это помогает? – somethinghere

ответ

0

Я просто сделал небольшой тест и все, что вам не хватает зовут getElementsByTagName функции на iFrames 'document, как contentWindow - элемент iFrames window (аналогично элементу window на родительской странице).

Вы не можете использовать iFrames в фрагментах кода здесь, поэтому я не могу показать вам реализацию, но это должно работать (оно работало в моем тестировании (хотя я пробовал его с загрузкой CNN.com и подсчитывал число div s возвращаемый getElementByTagName, и работал)..

var iframe = iframes.item(i); 
iframe = iframe.contentWindow.document; 
var sounds = iframe.getElementsByTagName('audio'); 

Имейте в виду что content-origin ограничения применяются здесь Если ты noit экземпляр IFRAME или его не на том же домене, могут возникать ошибки

+0

Привет, я пробовал это раньше, и попробовал еще раз: Я получаю эту ошибку: TypeError: undefined не объект (оценка «iframe.contentWindow») Чтобы убедиться, что я ничего не пропустил, здесь: https://jsfiddle.net/#&togetherjs=GFDUhLhfUt – user1887683

+0

В вашей скрипке нет 'iframe'. Также обратите внимание, что я не уточнил ваш 'iframe', я продолжал от него. 'var iframe = iframes.item (i);' было правильным. Это дает вам элемент 'iframe', тогда' contentWindow' дает вам элемент 'window' страницы внутри' iframe', а затем 'document' дает вам' document' внутри этого элемента 'window'. – somethinghere

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