jQuery appendTo在IE中给出了无效参数

时间:2010-01-05 15:56:03

标签: jquery append swfobject arguments

我正在尝试为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)参数没有任何意义,因为我之前没有遇到任何问题。另外,我使用的是jQuery DOMEC扩展,它是$ .create的来源。

感谢任何帮助。谢谢!

大都市

3 个答案:

答案 0 :(得分:1)

您可能想重新考虑一下您的方法。如果您需要在Flash Player不可用时显示JS生成的备用内容,我建议在尝试创建alt内容之前进行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;

    }

答案 1 :(得分:1)

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

示例:如果您尝试执行此类操作。

$(#testDIV).replaceWith(testData);

然后确保'testData'具有这种格式。

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

这样,即使你使用replaceWith,也不会让你失去DIV。

答案 2 :(得分:0)

在您的文档就绪处理程序中,您正在使用名为containerID的变量调用setupAlternateContent - 这个变量是否曾在任何地方定义过?如果没有,那么你将在函数内appendTo('#'),如果它导致错误,我不会感到惊讶。容器的id是什么以及在文档准备好之前设置的位置是什么?

您可以在alert(containerId)内尝试setupAlternateContent,看看您是否正在将您认为自己的内容传递给该功能......


(添加新信息后编辑)

我不知道$ .create方法可以,但如果您可以尝试使用内置DOM创建的jQuerys: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'; 
        }
    )
);