2009-11-25 98 views
0

我有一個HTML文檔(here),它創建一個基於iframe的媒體播放器,用於專輯中的歌曲集合(我只是用字母來定義mymusic數組中的這些專輯和歌曲,爲簡單起見)。onchange屬性不會調用函數

關注前3個iframe,我設定用戶交互的方式是使用Javascript爲可用專輯和歌曲的形式生成HTML,並將它們寫入正文中的iframe。如果您運行它並在專輯菜單中進行選擇,您將看到歌曲菜單中的選項與mymusic陣列相對應,所以這可以工作。

然而,當我選擇一首歌曲,該功能nowplaying(trackindex,albumindex)應該使用onchange事件在歌曲形式,以同樣的方式在使用showinitial()產生的形式被稱作......但功能不會被調用。

我已經排除了nowplaying本身的原因,因爲即使我將nowplaying更改爲alert("hello"),它也不會被調用。所以這導致我認爲問題在於「任何事情」中的onchange屬性,但我看不到問題。我編寫它的方式與之前沒有什麼不同,而且工作得很好,所以爲什麼它不工作?

任何幫助將不勝感激!

回答

3

Firebug是你的朋友....

我沒有定義

功能 的onchange(事件){ parent.nowplaying(this.SelectedIndex, 我); }(更改)

onchange正在調用,但我在調用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)被調用,但是你沒有把我寫入代碼,只是寫我的信。當正在播放(this.SelectedIndex,i)被調用時,我不再被定義,因爲你不在any()函數內。當您將html附加到p時,您需要展開i,以便該值在那裏而不是變量i。

+0

但是「i」被定義了...這是我傳遞給「任何」功能的價值嗎? – Deacon 2009-11-25 21:13:58

+2

問題是,您使用「我」作爲字符串而不是變量。你在做p + =「blah blah i blah」,而不是p + =「blah blah」+ i +「blah」。查看我的編輯。 – 2009-11-25 21:16:25

+0

謝謝。我現在試着用這個編輯來試試,並且我得到錯誤控制檯說「mymusic [aluminiumdex] .tracks [trackindex] .tracktitle is undefined」...但是我不明白它是如何定義爲mymusic和tracks數組被定義,並且albumindex和trackindex都應該取數值的值傳入函數 – Deacon 2009-11-25 21:22:49

0
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); 
}; 

但是你一般要避免從一個機架上的不同的一個設置處理程序。我不確定除了頭痛之外,iframe在這裏獲得了什麼。爲什麼不只是簡單地使用定位的div與溢出?如果您需要......您仍然可以通過innerHTML重寫他們的內容,儘管我更願意使用DOM方法填充它們,以避免您當前腳本存在的所有HTML注入問題。