jQuery对话框上的Flash

17

我知道很多人已经问过这个问题,但我认为我的情况有点不同。

我有一个网站,其中有一些广告是Flash隐藏在div中,因为xhtml/html兼容性问题。但Flash元素位于我的jQuery对话框的顶部,这并不理想。

有些解决方案建议将wmode设置为opaque,但我不能这样做,因为我的广告是输出Flash元素的脚本。

另一个解决方案建议在显示对话框时隐藏广告。所以我的问题是:是否有一种方法可以在jQuery对话框可见的情况下将flash内容置于其后面,而不改变flash代码?

最好的问候, Lasse Espeholt

更新: 我现在用赏金重新打开了这个问题。目前为止,我在“显示对话框”时隐藏了所有Flash广告。但这仍然不是最佳解决方案。因此,我正在寻找一种脚本,可以使每个Flash动画变为opaque(最好是jQuery解决方案,但纯JavaScript解决方案也可以)。或者如果还有其他未在此问题中讨论的解决方案,我很乐意听到它们 :)

更新2: 到目前为止,我已经制作了这个脚本:

function opaqueAllFlashMovies() {
    // Embed Flash movies
    $('embed[wmode!="opaque"]').attr('wmode', 'opaque').wrap('<div>');

    // Object flash movies with a wmode param
    $('object[classid$="-444553540000"] parem[wmode]').attr('value', 'opaque');
    // Object flash movies without a wmode param
    $('object[classid$="-444553540000"]').not('param[wmode]').append('<param name=\'wmode\' value=\'opaque\'/>').wrap('<div>');
}

代码在Firefox和Chrome中有效,但在IE中无效。显然,.append 函数失效了。有什么想法吗?

5个回答

13

除非您将wmode设置为opaque(或transparent),否则不能在Flash前面放置HTML标签。

使用默认的wmode(“window”),Flash播放器会接管其区域中的所有渲染和用户交互。因此,浏览器无法在该区域显示任何HTML内容。 wmode =“ opaque”(或wmode =“ transparent”)的作用是禁用此默认行为,并将Flash播放器区域集成到浏览器的常规渲染和分层中。

但是,您不需要更改任何Flash内容来设置wmode,因为它是在HTML中完成的(或通过SWFObject或其他插入Flash对象元素的脚本)。因此,如果您控制“输出Flash元素的脚本”,则可以在那里处理wmode设置。


我对脚本没有控制权。 它们是提供的,如果需要,可以每秒更改。我将我的脚本放在“iframes” <object type="text / html"/>标签中。 我可以设置jQuery以编辑每个Flash对象中的wmode,包括“iframes”内部的Flash对象吗? - Lasse Espeholt
好的,那太糟糕了。我不知道你是否能让jQuery动态修改Flash对象的HTML代码,但是一旦Flash加载完成后进行修改可能需要重新加载Flash,这样每个广告都会被加载两次。目前来看,在显示对话框时隐藏广告似乎是最好的解决方案。 - Lars Blåsjö
当乔布斯表示不会支持Flash时,实际上有人抱怨。真是令人扶额。 - Winfield Trail
@Kerin,这与浏览器插件有关,而不是Flash,同样的问题也可能出现在其他插件中,比如Unity播放器和Java小程序(但是苹果在iOS中也不支持它们)。 - Lars Blåsjö

2
我认为我有一个解决方案。使用jQuery-UI对话框,我花了数小时的时间试图弄清这个问题 - 对我很有效。
我的逻辑是:如果我不能使jQuery在前面显示,那么就让所有Flash内容在后面显示。我的研究带我到了这个链接 - 最终终于它起作用了。 如何以编程方式设置所有<object>的wmode为opaque?
function makeObjectsOpaque3() {
    var elementToAppend = document.createElement('param');
    elementToAppend.setAttribute('name', 'wmode');
    elementToAppend.setAttribute('value', 'opaque');
    var objects = document.getElementsByTagName('object');
    for(var i = 0; i < objects.length; i++) {
        var newObject = objects[i].cloneNode(true);
        elementToAppend = elementToAppend.cloneNode(true);
        newObject.appendChild(elementToAppend);
        objects[i].parentNode.replaceChild(newObject, objects[i]);
    }
}

window.onload = makeObjectsOpaque3;

并且

if(window.onload) {
    var onLoad = window.onload;
    window.onload = function() {
        onLoad();
        makeObjectsOpaque3();
    };
} else {
    window.onload = makeObjectsOpaque3;
}

嗨,你看到詹姆斯在同一页面上的评论了吗?如果这不会影响它,我会再试一遍 :) - Lasse Espeholt

1
我刚刚阅读了这篇文章,并尝试在对象标签中添加参数wmode="opaque"。它对于IE 8有效。如果我的帖子太晚了,我很抱歉。

1
是的,这个可以工作。但正如我所说,我需要它能够在我无法控制脚本的广告中工作。 - Lasse Espeholt

1

在 Flash 加载完后,手动使用 JavaScript 将 wmode 设置为不透明,这样怎么样?


0

在谷歌上搜索“iframe shim”。

基本上将一个 iframe 放在 HTML 后面会将其覆盖在 Flash 内容之上(忽略 wmode 设置)。

再见。


这是其中一个结果:http://www.udm4.com/demos/extension-iframeshim.php。您可以复制他的方法来解决问题... - pincopallo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接