-1

我有一个 HTML 文档(此处),它为专辑中的歌曲集合创建了一个基于 iframe 的媒体播放器(为简单起见,我只是使用字母来定义 mymusic 数组中的这些专辑和歌曲)。

关注前 3 个 iframe,我设置用户交互的方式是使用 Javascript 为可用专辑和歌曲的形式生成 HTML,并将它们写入正文中的 iframe。如果您运行它并在“专辑”菜单中进行选择,您将看到“歌曲”菜单中的选项与mymusic数组相对应,因此可以正常工作。

但是,当我选择一首歌曲时,nowplaying(trackindex,albumindex)应该使用Songsonchange表单中的事件调用该函数,与使用 ... 生成的表单中的方式相同,但该函数不会被调用。showinitial()

我已经排除了将nowplaying自身编码作为原因的可能性,因为即使我更改nowplayingalert("hello"),它也不会被调用。所以这让我认为问题出onchange在“任何东西”中的属性上,但我看不到问题所在。我编码它的方式与以前没有什么不同,而且效果很好,那为什么这不起作用呢?

任何帮助将非常感激!

4

2 回答 2

3

萤火虫是你的朋友....

我没有定义

函数 onchange(event) { parent.nowplaying(this.SelectedIndex, i); }(改变 )

onchange 被调用,但i调用时未定义nowplaying

这是这一行的结果:

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='"; 

澄清一下,ianything(i)被调用时定义,但你没有写入i代码,只是字母“i”。何时nowplaying(this.SelectedIndex,i)被调用,i不再定义,因为您不再在anything()函数内部。i将 html 附加到 时需要展开p,以便值存在而不是变量i

于 2009-11-25T21:10:03.017 回答
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 注入问题。

于 2009-11-25T21:22:31.567 回答