3

我正在创建一个脚本,该脚本应该创建嵌入式 SWF,并且如果用户没有可用的 Flash,则还使用图像作为后备。由于我不允许使用任何其他库,例如 SWFobject,因此我无法使用诸如 createElement/appendChild/setAttribute 之类的 DOM 技术。

我一直在使用这篇很棒的博客文章: http: //pipwerks.com/2011/05/30/using-the-object-element-to-dynamically-embed-flash-swfs-in-internet-explorer/作为指导方针,并且我在我测试过的所有浏览器中都启动并运行了 Flash,但它不包括任何解决方案来解决我如何将链接/图像组合注入到 Internet Explorer 8 中的对象中。

使用 createElement("a") 并同样用于图像并将其添加到任何其他 Div 元素都可以正常工作,但如果我尝试将其注入对象 MSIE8 会抛出“无效参数”。

我还尝试创建一个带有 id 的虚假参数,并尝试用我的链接/图像组合替换它,这在我测试过的其他浏览器中有效,但在 IE8 中无效。对此的任何想法将不胜感激。

这是我的代码(我使用 js 和 PHP 的组合来创建脚本):

var alink = document.createElement("a");
alink.setAttribute("href", "URL_TO_TARGET_SITE_OR_CLICK_COUNTER");

var alinkImage = document.createElement("img");
alinkImage.setAttribute("src", "URL_TO_IMAGE");
alinkImage.setAttribute("alt", "");
alinkImage.setAttribute("width", "IMAGE_WIDTH");
alinkImage.setAttribute("height", "IMAGE_HEIGHT");

alink.appendChild(alinkImage);

if(!IE8) {
    flashObject.appendChild(alink);
    document.getElementById('ad_filler_placeholder').appendChild(flashObject);
} else {
    /* this code will be executed if IE8 or lower, sadly appending alink into flashobject fails */
    flashObject.appendChild(alink);
    document.getElementById('ad_filler_placeholder').appendChild(flashObject);
}
4

1 回答 1

0

好的,所以我不得不稍微调整我的脚本以匹配 pipwerks 博客文章中所述的最终结果。在检查 IE 时,我用 innerHTML 声明了 flashObject,如下所示:

var fallback=false;

flashObject = (isIE) ? createIeObject() : document.createElement("object");

if(!isIE) {
   flashObject.setAttribute("type", "application/x-shockwave-flash");
   flashObject.setAttribute("data", "URL_TO_SWF");
   fallback = true;
}

createIeObject 函数执行此操作:

function createIeObject(){
   var div = document.createElement("div");
   div.innerHTML = "<object classid='clsid:D27CDB6E-AE6D-11cf-96B8-444553540000'><param name='movie' value='URL_TO_SWF'><a href='URL_FOR_CLICK'><img src='URL_TO_FALLBACK_IMAGE' alt='' width='WIDTH' height='HEIGHT' border='0' /></a></object>";
   return div.firstChild;
}

请注意,我在此段中添加了后备。而且我还必须在图像上使用宽度、高度和边框,否则 IE 会在所有内容周围添加一个烦人的蓝色边框。好的,一切都会按我的计划进行吗..?当然不是 =) IE8(可能还有其他版本)不能将任何子元素附加到我最初使用 document.write 创建的 div 中,因为在该状态下 DOM 未完全加载。这可以解决整个(几乎)的事情:

onload = function(){}

我确实通过 DFP 尝试过,它至少可以在 IE7 及更高版本上运行。如原始问题中所述,其他优秀的浏览器通过常规 appendChild 添加了他们的fallbakc,我只是将它移到了 if 语句中,因为如果 IE 它将过时。

于 2012-10-23T13:50:52.343 回答