1

我正在尝试为http://code.google.com/p/swfobject/上的 swfobject 创建一个接口。当用户没有安装 Flash 播放器时,我正在构建所需的替代内容。这在 FF 中运行良好,但由于某种原因在 IE 中运行良好。我以前用同样的方法做了一百万次,它一直有效,我不知道为什么这次我会收到这个错误。

基本上,当页面加载时,它会调用构建替代内容的函数 $.SWFObject.embedSWF() 并调用 swfobject.embedSWF 函数。替代内容是使用如下所示的就绪函数构建的。

当调用 setupAlternateContent 函数时,错误发生在 ('#' + containerID)。

embedSWF: function(flashFilename, containerID, width, height, minFlashVersion, flashvars, params, attributes) {
   //If the flashvars, params, or attributes variables were passed in and are objects, then save them, otherwise they will be empty.
   settings.flashvars = (flashvars && typeof(flashvars) == 'object') ? flashvars : {};
   settings.params = (params && typeof(params) == 'object') ? params : {};
   settings.attributes = (attributes && typeof(attributes) == 'object') ? attributes : {};

   //Setup the alternate content that will be used if the user does not have flash installed
   $(document).ready(function() { setupAlternateContent(containerID); });

   //Call the embedSWF function which is found in the swfobject core file
   swfobject.embedSWF(flashFilename, containerID, width, height, minFlashVersion, flashUpdater, settings.flashvars, settings.params, settings.attributes);
}

function setupAlternateContent(containerID) {
    //Create the innerContainer div element
    var innerContainer = $.create('div', {
    }).appendTo('#' + containerID).css({
        font: '18px Arial, Verdana, sans-serif',
        height: '130px',
        width: '240px',
        paddingTop: '35px',
        margin: '0px auto'
    });

    //Put the flash image inside the innerContainer
    $.create('img', {
        src: SWFOBJECT_FOLDER_LOCATION + 'flash_icon.png',
        alt: 'Install Flash'
    }).appendTo(innerContainer).css({cursor: 'pointer'}).click(function() { window.location = 'http://get.adobe.com/flashplayer'; });

    //Add a message bellow the flash icon
    $.create('p', {}, 'Install Adobe Flash Player').appendTo(innerContainer);
}

IE 不喜欢 ('#' + containerID) 参数,它没有任何意义,因为我之前已经这样做了,没有问题。另外,我正在使用 $.create 来自的 jQuery DOMEC 扩展。

任何帮助表示赞赏。谢谢!

都会

4

3 回答 3

1

您可能需要重新考虑您的方法。如果您需要在 Flash Player 不可用时显示 JS 生成的替代内容,我建议您在尝试创建替代内容之前swfobject.hasFlashPlayerVersion("9")进行检查。可以在 DOM 加载之前执行此检查。

请注意,swfobject.embedSWF 被包装在它自己的 domready 样式事件中,因此不需要被包装在 jQuery 的 $(document).ready 事件中。

简单的例子:

var hasFlash = swfobject.hasFlashPlayerVersion("9");
if(hasFlash){
   swfobject.embedSWF( ... ); 
} else {
   //Create alt content right away (no need to wait for dom to load)
   var altcontent = setupAlternateContent();
   //When DOM is ready, append alt content to page
   $(document).ready(function () { altcontent.appendTo("mycontainer") });
}

这种方法加快了速度(无需等待 DOM 加载只是为了弄清楚需要做什么),并且还可以防止在不需要时生成 alt 内容。

按照这个逻辑,我会将您的代码重构为这样的(请原谅任何拼写错误):

embedSWF: function(flashFilename, containerID, width, height, minFlashVersion, flashvars, params, attributes) {

   if(swfobject.hasFlashPlayerVersion(minFlashVersion)){

      //If the flashvars, params, or attributes variables were passed in and are objects, then save them, otherwise they will be empty.
      settings.flashvars = (flashvars && typeof(flashvars) == 'object') ? flashvars : {};
      settings.params = (params && typeof(params) == 'object') ? params : {};
      settings.attributes = (attributes && typeof(attributes) == 'object') ? attributes : {};

      //Call the embedSWF function which is found in the swfobject core file
      swfobject.embedSWF(flashFilename, containerID, width, height, minFlashVersion, flashUpdater, settings.flashvars, settings.params, settings.attributes);

    } else {

       //Create alt content right away (no need to wait for dom to load)
       var altcontent = setupAlternateContent();

       //When DOM is ready, append alt content to page
       $(document).ready(function() { altContent.appendTo(containerID); });

    }

    function setupAlternateContent(containerID) {

        //Create the innerContainer div element
        var innerContainer = $.create('div').css({
            font: '18px Arial, Verdana, sans-serif',
            height: '130px',
            width: '240px',
            paddingTop: '35px',
            margin: '0px auto'
        });

        //Put the flash image inside the innerContainer
        $.create('img', {
            src: SWFOBJECT_FOLDER_LOCATION + 'flash_icon.png',
            alt: 'Install Flash'
        }).appendTo(innerContainer).css({cursor: 'pointer'}).click(function() { window.location = 'http://get.adobe.com/flashplayer'; });

        //Add a message bellow the flash icon
        $.create('p', {}, 'Install Adobe Flash Player').appendTo(innerContainer);

        return innerContainer;

    }
于 2010-01-05T21:29:29.597 回答
1

我只在 IE 中遇到相同的错误,在任何其他浏览器中都没有。我用 .replaceWith() 替换了 .html() 并且它起作用了。使用 .replaceWith 时,它会替换整个 DIV。因此,在您要替换的内容中,再次添加 div,这样您就不会丢失它。

示例:如果您正在尝试做这样的事情。

$(#testDIV).replaceWith(testData);

然后确保“testData”是这种格式。

<div id='testDiv'>
This is new content.
</div>

这样,即使您使用 replaceWith,也不会丢失您的 DIV。

于 2011-12-14T17:10:52.620 回答
0

看起来在您的文档就绪处理程序中,您正在使用一个名为的变量调用 setupAlternateContent containerID- 这个变量是否曾经在任何地方定义过?如果不是,那么您将在函数内部执行appendTo('#')此操作,如果它导致错误,我不会感到惊讶。容器的 id 是什么,在文档就绪触发之前它在哪里设置?

你可以尝试一个alert(containerId)内部setupAlternateContent,看看你正在将你认为的东西传递给函数......


(添加新信息后编辑)

我不知道 $.create 方法可以,但是如果您可以尝试使用 jQuerys 内置在 DOM 创建中:var innerContainer = $('<div />').appendTo(....或者:

var innerContainer = $('<div />').css({
    font: '18px Arial, Verdana, sans-serif',
    height: '130px',
    width: '240px',
    paddingTop: '35px',
    margin: '0px auto'
});
$('#' + containerID).append(innerContainer);

甚至一次全部:

$('#' + containerID).append(
    $('<div />').css({
        font: '18px Arial, Verdana, sans-serif',
        height: '130px',
        width: '240px',
        paddingTop: '35px',
        margin: '0px auto'
    }),
    $('<img />').attr({
        src: SWFOBJECT_FOLDER_LOCATION + 'flash_icon.png',
        alt: 'Install Flash'
    }).css({
        cursor: 'pointer'
    }).click(
        function() { 
            window.location = 'http://get.adobe.com/flashplayer'; 
        }
    )
);
于 2010-01-05T16:48:56.860 回答