打开FLASH(SWF)失败,提示Error #2046的解决办法汇总

RSL编译方式的FLEX站点出现#2046错误的解决办法

先简单解释下背景知识:
从FLEX4开始,所有web程序都默认使用RSL的编译方式。那用RSL编译的FLEX站点和普通FLEX站点有什么区别呢?简单的说就是,flash player会在你第一次访问任何一个这种FLEX站点时,缓存下大约1M的类库在系统里。下次用户访问这个站点或者任何其他flex站点时都不用再下载类库这部分文件。RSL编译方式就是在编译时把类库都分离出去了。这种编译方式,在同类flash程序通常大小要接近1M的情况下,可以编出100K左右的整站程序,比一张图片都小。好处自然是非常节省带宽和加载时间。我现在做的几个FLEX站点都采用这种编译方式,加上皮肤也采用全矢量绘图,编译出来的整站程序都保持在100K左右,有效的解决了FLASH加载慢的最大问题。

但问题出来了,有一小部分用户第一次访问站点时,总是出现无法缓存类库的问题,表现就是报错”ERROR:#2046″。或者有些用户原来能够访问成功(说明已经成功缓存过类库了),但突然也开始报错了。直接导致的后果就是根本不能加载程序,想要节省加载时间反而导致不能加载,让我一直很苦恼。从做第一个FLEX4程序开始,我就发现了这个问题,当时只有我的电脑不能访问我写的站点,而大家都能,并且我重装了系统几次,都不行。后来不知道怎么的,我又突然就能访问了,就没有太在意这个问题。现在想想,那时候我干了一件他们都没干的事:我修改过系统时间。调整到2008年了。

正好最近又无意中在论坛上看到高人解答,原来报错的用户也都存在同样的问题:系统时间出错了。因为用户系统的时间早于缓存的类库的有效签名时间,被flash player拒绝加载了。那时我刚好在实验室,又这么刚好就有台电脑就不能访问,查下它的时间是2000年。旁边的电脑都能访问。就修改了下时间测试,马上加载成功了~

困扰我很久的问题终于解决了,非常之高兴,遂写了个js脚本加在网页里,加载前先判断下服务器和客户机的时间差。如果太大就弹出提示。让用户把时间改正确,或者就直接跳转到我准备好的无类库缓存版站点。我有给每个flex站点都加上这种无缓存的版本,供应急用。就是简单再写一个full.html,把引用的程序改成对应的非RSL编译方式生成的swf即可。访问方法为:URL后加上full.html,使用上不会有任何差别。
那么RSL的问题算是完美解决了,顺便也把另一个问题解决了吧:在FLEX站点访问时,还会出现另一个问题,就是很多客户机的FLASH PLAYER版本过低,导致FLEX程序不加载,表现为一片空白,不提示任何信息(只有没有安装FP时,浏览器才会自动提示)。这会让用户误以为站点不能访问了。解决办法也是加上个JS脚本,判断一下FP的版本先。下面附上两个JS脚本,在IE/Firefox/chrome测试均完美通过。

脚本及引用地址:http://blog.csdn.net/chen98qqkk/article/details/5916002

——————————————————
Flash出现Error #2046常用解决办法
1、查看本机时间是否是或接近于internet时间,时间的差错会导致Error #2046的出现
2、清除浏览器缓存,swf文件的更改会导致Error #2046的出现,清除缓存可以读取最新的swf文件
3、Flash过低的版本可能会导致Error #2046的出现(建议解决方案)
4、恶意软件可能会导致Error #2046的出现
5、浏览器崩溃可能会导致Error #2046的出现
6、访问站点维护可能会导致Error #2046的出现

引用地址:http://aajiang.lin.blog.163.com/blog/static/750980312013102395628728/

———————————————————–

打开FLASH(SWF)失败,提示Error #2046的解决办法。

猎豹浏览器:
C:\Users\玛\AppData\Local\liebao\User Data\用户名\Pepper Data\Shockwave Flash\CacheWritableAdobeRoot\AssetCache\?????\*.SWZ

Chrome:
C:\Documents and Settings\Administrator\Local Settings\Application Data\Google\Chrome\User Data\Default\Pepper Data\Shockwave Flash\CacheWritableAdobeRoot\AssetCache\……

百度浏览器:
C:\Users\玛\AppData\Roaming\baidu\browser\profile\Pepper Data\Shockwave Flash\CacheWritableAdobeRoot\AssetCache

百度浏览器(WinXP)
C:\Documents and Settings\Administrator\Application Data\Baidu\browser\profile\Pepper Data\Shockwave Flash\CacheWritableAdobeRoot\AssetCache

其他
C:\Users\玛\AppData\Roaming\Adobe\Flash Player\AssetCache

C:\Documents and Settings\Administrator\Application Data\Adobe\Flash Player\AssetCache

根据不同浏览器,位置略有不同,但在都是AssetCache目录下有个临时目录,把这个目录下面的文件删除后就可以正常了。

部分路径会是这个:
%appdata%\Adobe\Flash Player
%appdata%\Macromedia\Flash Player

引用地址:http://blog.sina.com.cn/s/blog_50d48c190102vvhb.html

———————————————-
注:本人最后解决问题用的是最后一个方法,删除%appdata%\Adobe\Flash Player\AssetCache目录下面的文件,然后再用ie访问时就不会报#2046错误了

 

IE里Iframe的Cookie问题

引用地址:http://www.cnblogs.com/cuihongyu3503319/archive/2009/05/12/1455063.html

当利用IFRAME时,记得要在相应的动态页的页头添加一下P3P的信息,否则IE会自觉的把IFRAME框里的COOKIE给阻止掉,产生问题.本身不保存自然就取不到了.这个其实是FRAMESET和COOKIE的问题,用FRAME或者IFRAME都会遇到.

只需要设置 P3P HTTP Header,在隐含 iframe 里面跨域设置 cookie 就可以成功。他们所用的内容是:

P3P: CP=’CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR’

ASP直接在头部加了头部申明,测试有效。
<%Response.AddHeader “P3P”, “CP=CAO PSA OUR”%>

php的话,应该是如下写法:
header(‘P3P: CP=CAO PSA OUR’);   //IE8
header(‘P3P:CP=”IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT”‘);  //IE7

ASP.NET的话
通过在代码上加Response.AddHeader(“P3P”, “CP=CAO PSA OUR”)或者在Window服务中将ASP.NET State Service 启动。

JSP:
response.setHeader(“P3P”,”CP=CAO PSA OUR”)

让JavaScript和PHP通用值为中文的cookie

引用地址:http://vseb.blog.sohu.com/67136922.html

这是一个哪里都能找到的操作cookie的JavaScript函数:


很遗憾,如果让PHP设定cookie的值为中文,然后让这个JavaScript读取,就会出现乱码:



反之,如果让JavaScript设定了一个中文cookie值,由PHP进行读取,也会出现乱码:



观察上面的乱码,你会发现% u4E2D% u6587刚好是“中文”两个汉字的unicode编码,第一个想法是直接解码,但是PHP里面似乎没有可以把unicode编码转换为汉字的便捷方法。(WordPress倒是不错,不加空格倒是给解码出来了!)

在《JavaScript: The Definitive Guide, 4th Edition》中写到:

In client-side JavaScript, a common use of escape( ) is to encode cookie values, which have restrictions on the punctuation characters they may contain.
在客户端脚本程序中,escape( )函数可以被用作对具有不规范标点的cookie进行编码。(就像我们函数中所用到的一样)

Although the escape( ) function was standardized in the first version of ECMAScript, it has been deprecated and removed from the standard by ECMAScript v3. Implementations of ECMAScript are likely to implement this function, but they are not required to. In JavaScript 1.5 and JScript 5.5 and later, you should use encodeURI( ) and encodeURIComponent( ) instead of escape( ).
虽然escape( ) 已经在ECMAScript中被标准化,但是在ECMAScript v3中,escape( ) 被剔出,如果需要在JavaScript 1.5 和JScript 5.5以后的版本中使用这个函数,建议使用encodeURI( )和encodeURIComponent( )。

按照手册的建议,我修改了JavaScript函数中的escape()和unescape()为encodeURI()和decodeURI(),结果异常的顺利,下面给出修改后的代码和调试程序:







word-wrap:break-word在firefox下对table无效的解决方法

引用地址:http://www.firefly365.com/question/css/201007091937527643.html

word-wrap:break-word对于ie很早以前就支持了,但是firefox是从3.5开始支持的,不过,对于div标签有效,对于td标签好像无效,请看下面示例:

firefox下的效果:div中有效,td无效(ie也无效,不过ie下可以加上word-break:break-all)

div
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

table
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

解决方法:给table加上table-layout:fixed

div
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

table
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

js中showModalDialog和open子窗口向父窗口传值方法

showModalDialog:

父窗口:

 function addresswindow(){
  var adr=window.showModalDialog(‘index.php’,”,’dialogWidth:400px;dialogHeight:200px;center:Yes;resizable:no;status:no;scroll:no;’);
  if (adr != null && adr != “”) {
             var strs = new Array();
             strs = adr.split(“,”);
             window.document.getElementsByName(“address1”)[0].value = strs[0];
             window.document.getElementsByName(“address2”)[0].value = strs[1];
            window.document.getElementsByName(“address3″)[0].value = strs[2];
         }

 }

子窗口:

<base target=”_self” />   ——加上这一句话可以在子窗口进行一些操作,要是不加的话,比如查询会另弹出一个页面来
<script>
function backparent(){
    var adr=’1111111,22222222,33333333′;
    window.returnValue = adr;
    window.close();

}
</script>

其中adr变量为两个窗口之间传值的桥梁。

使用open方法打开的窗口可以用window.opener.document.getElementById(‘id’).value=’1111′;来向操作父窗口。

************************************

附1:Window.ShowModalDialog参数详解

基本介绍:
         showModalDialog()                              (IE 4+ 支持)
         showModelessDialog()                         (IE 5+ 支持)
         window.showModalDialog()                 方法用来创建一个显示HTML内容的模态对话框。
         window.showModelessDialog()            方法用来创建一个显示HTML内容的非模态对话框。
使用方法:
         vReturnValue = window.showModalDialog(sURL [, vArguments] [,sFeatures])
         vReturnValue = window.showModelessDialog(sURL [, vArguments] [,sFeatures])
参数说明:
        sURL                —   必选参数,类型:字符串。用来指定对话框要显示的文档的URL。
        vArguments   —    可选参数,类型:变体。用来向对话框传递参数。传递的参数类型不限,包括数组等。对话框通过window.dialogArguments来取得传递进来的参数。
        sFeatures       —    可选参数,类型:字符串。用来描述对话框的外观等信息,可以使用以下的一个或几个,用分号“;”隔开。
—————-
1.   dialogHeight:   对话框高度,不小于100px
2.   dialogWidth:   对话框宽度。
3.   dialogLeft:    离屏幕左的距离。
4.   dialogTop:    离屏幕上的距离。
5.   center:         { yes | no | 1 | 0 } :             是否居中,默认yes,但仍可以指定高度和宽度。
6.   help:            {yes | no | 1 | 0 }:               是否显示帮助按钮,默认yes。
7.   resizable:      {yes | no | 1 | 0 } [IE5+]:    是否可被改变大小。默认no。
8.   status:         {yes | no | 1 | 0 } [IE5+]:     是否显示状态栏。默认为yes[ Modeless]或no[Modal]。
9.   scroll:           { yes | no | 1 | 0 | on | off }:是否显示滚动条。默认为yes。

下面几个属性是用在HTA中的,在一般的网页中一般不使用。
10.   dialogHide:{ yes | no | 1 | 0 | on | off }:在打印或者打印预览时对话框是否隐藏。默认为no。
11.   edge:{ sunken | raised }:指明对话框的边框样式。默认为raised。
12.   unadorned:{ yes | no | 1 | 0 | on | off }:默认为no。

 ************************************

附2:window.open参数详解

window = object.open([URL ][, name ][, features ][, replace]]]])
URL:新窗口的URL地址
name:新窗口的名称,可以为空
featurse:属性控制字符串,在此控制窗口的各种属性,属性之间以逗号隔开。
fullscreen= { yes/no/1/0 } 是否全屏,默认no
channelmode= { yes/no/1/0 } 是否显示频道栏,默认no
toolbar= { yes/no/1/0 } 是否显示工具条,默认no
location= { yes/no/1/0 } 是否显示地址栏,默认no
directories = { yes/no/1/0 } 是否显示转向按钮,默认no
status= { yes/no/1/0 } 是否显示窗口状态条,默认no
menubar= { yes/no/1/0 } 是否显示菜单,默认no
scrollbars= { yes/no/1/0 } 是否显示滚动条,默认yes
resizable= { yes/no/1/0 } 是否窗口可调整大小,默认no
width=number 窗口宽度(像素单位)
height=number 窗口高度(像素单位)
top=number 窗口离屏幕顶部距离(像素单位)
left=number 窗口离屏幕左边距离(像素单位)

Discuz和jQuery冲突的解决方法

引用地址:http://hi.baidu.com/mimimo/blog/item/2840768dd7048915b31bbadb.html

Discuz和jQuery的冲突有两点,在/include/javascript/common.js文件的57~64之间有如下代码:

Array.prototype.push = function(value) {
this[this.length] = value;
return this.length;
}

function $(id) {
return document.getElementById(id);
}

Discuz为了兼容低版本的IE,重写了Array对象的push方法,但在重写之前没有做任何判断,有点太XX了~,改为一下形式:

if(typeof Array.prototype.push === ‘undefined’) {
Array.prototype.push = function(value) {
this[this.length] = value;
return this.length;
}
}

第二点就是Discuz也有$()函数,就只是为了实现getElementById?功能没有人家强大就别学人家用美元符号嘛,占用符号资源。应该学学百度,人家就用一个字符G,多低调不和别人争美元。
关于$()函数的冲突,jQuery中给出了解决方法,jQuery.noConflict(),把美元让给你(看看人家多大肚)。

我们的jQuery代码可以这样写:

var jq = jQuery.noConflict(); //把$让给第一个实现它的库,用jq代替
jq(function()
{
//**********************
}
);

这样就完美解决了两者的冲突

用HTML5消磨时光

引用地址:http://www.chinaz.com/Design/Pages/0RQ295002010.html

HTML5 渐入佳境,它强大的功能正被逐渐挖掘出来,各种实验性应用层出不穷,本文介绍几个由 Hakim El Hattab 设计的 HTML5 趣味小应用,它们非常有趣,我刚刚在它们身上消磨了两个小时。当你体验完这几个小应用,会发现 HTML5 比你想象的更强大。

Sinuous

在浩瀚的星系间履行,小心装上些红色的星球,绿色的星球可以吃掉,可以增加体能。

开始体验 >>

Bakemono

鼠标在页面空白位置点击,这个小怪物会扑过去。

开始体验>>

Keylight

我太喜欢这个小程序了,在一个空房间,双击鼠标,会放置上一个小球,当放进两个小球的时候,一道粒子束在两个球之间撞击,并发出悦耳的声音,随着小 球的增多,粒子束在每个小球之间穿梭撞击,离你越近的小球,声音越清脆,音调越高,这样就形成了连续的音乐。

开始体验>>

Blob

一些果冻样的东西,会滑向你鼠标点击的位置,在果冻球体中间点击,会将它扯成两半,它们在到处滑动的时候,还会再溶合到一起。

开始体验>>

Magnetic

 

也是我最爱的一个小程序。鼠标在夜空中双击,可以创造一颗恒星,同时创造出十几颗卫星绕着它转,你可以创造很多这样的恒星系,当它们中的某些靠近到 一起形成质量比较大的恒星系的时候,可以吸引更多的卫星绕着它们转。

开始体验>>

Trail

五颜六色的彩带,随着鼠标飘动,鼠标不动的时候,便围着鼠标箭头旋转,非常简单,但很流畅,视觉效果很漂亮。

开始体验>>

Particle Depth

很 Cool 的三维效果。

开始体验>>

Wave

水面随着鼠标形成波浪,水面的浮球也随着沉浮,效果非常棒。

开始体验>>

Particles

粒子在屏幕上飘动,遇到鼠标的时候膨胀。

开始体验>>

译者注

这组 HTML5 实验应用加载速度非常慢,初以为是 HTML5 本身性能的问题,研究过源代码才发现,原来页面上调用了 Twitter 的饰件(http://platform.twitter.com/widgets.js), 因为世界上压根没有 Twitter,我们早就知道,但这些网页不知道,所以还傻傻地去连接,浪费了大量的时间。使用 Godaddy 的服务器测试,每个页面大约需要 0.2 秒就打开了。有人说,他们代表先进生产力。

php、js中的replace函数

PHP

str_replace(find,replace,string,count)

find 必需。规定要查找的值。
replace 必需。规定替换 find 中的值的值。
string 必需。规定被搜索的字符串。
count 可选。一个变量,对替换数进行计数。

例:str_replace("world","John","Hello world!"); 返回Hello John!

今天用这个函数来替换字符串里的换行符 \n ,str_replace("\n","<br>",$str);貌似不起作用,之前用过是可以的,郁闷。不过后来发现php里面自带了一个替换换行符的函数nl2br(),这个函数的作用是在字符串中的每个新行 (\n) 之前插入 HTML 换行符 (<br />)。用法nl2br(string)

JS

stringObject.replace(regexp/substr,replacement)
regexp/substr 必需。规定子字符串或要替换的模式的 RegExp 对象。请注意,如果该值是一个字符串,则将它作为要检索的直接量文本模式,而不是首先被转换为 RegExp 对象。
replacement 必需。一个字符串值。规定了替换文本或生成替换文本的函数。

js中直接使用str.replace(“a”,”b”)时,只会把str中第一个出现的a替换为b,如果要替换所有的a需要用到正则表达式:str.replace(/a/gi,”b”)这样写就可以了。

js中onmouseout问题

js的onmouseout有很奇怪的一个问题。例如


我们预期只有当鼠标从div中移开的时候才会触发onmouseout事件,可是,事实上,当我们移到div中的元素时,例如本例中的a标签时,就会触发onmousout事件。也就是说,移到对象的子对象上,也算onmouseout了。这往往会让我们预期的效果达不到。下面是一种解决方法,兼容IE和FF。


faddsf

另外,JQ中关于这个问题,已经有了一个好的解决办法了.jquery中定义了一种事件叫做”mouseleave”,用这个事件做事件句柄的话,就可以解决这个问题。具体使用方法可以参考这里 http://www.w3school.com.cn/jquery/event_mouseleave.asp