2009-11-25 106 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注入问题。