我正在尝试为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的来源。
感谢任何帮助。谢谢!
大都市
答案 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';
}
)
);