一看就明白:
window.onbeforeunload=function (){alert(“关闭”)};
测了下,IE9下没问题,其他浏览器没测。
一看就明白:
window.onbeforeunload=function (){alert(“关闭”)};
测了下,IE9下没问题,其他浏览器没测。
if (Capabilities.playerType == 'ActiveX') {ExternalInterface.call("window.open","http://www.adamstudo.cn/blog");}
else {navigateToURL(new URLRequest("http://www.adamstudo.cn/blog"),"_blank");
}
在SwfObject解决Html与Flash之间传递参数问题中已经简要介绍了如何使用SwfObject在页面中插入Flash,如何在初始时由JS向Flash传递参数,以及运行时Flash如何调用JavaScript中函数。这里主要介绍运行时JavaScript如何互相传递参数, 并控制Flash的播放。
其实JS能直接控制Flash的播放,主要通过下列方法实现:
Play() —————————————- 播放动画
StopPlay()————————————停止动画
IsPlaying()———————————– 动画是否正在播放
GotoFrame(frame_number)—————- 跳转到某帧
TotalFrames()——————————- 获取动画总帧数
CurrentFrame()——————————回传当前动画所在帧数-1
Rewind()————————————-使动画返回第一帧
SetZoomRect(left,top,right,buttom)——-放大指定区域
Zoom(percent)——————————改变动画大小
Pan(x_position,y_position,unit)————使动画在x,y方向上平移
PercentLoaded()—————————-返回动画被载入的百分比
LoadMovie(level_number,path)———– 加载动画
TGotoFrame(movie_clip,frame_number)- movie_clip跳转到指定帧数
TGotoLabel(movie_clip,label_name)—— movie_clip跳转到指定标签
TCurrentFrame(movie_clip)————— 回传movie_clip当前帧-1
TCurrentLabel(movie_clip)—————–回传movie_clip当前标签
TPlay(movie_clip)—————————播放movie_clip
TStopPlay(movie_clip)———————-停止movie_clip的播放
GetVariable(variable_name)—————–获取变量
SetVariable(variable_name,value)———–变量赋值
TCallFrame(movie_clip,frame_number)—call指定帧上的action
TCallLabel(movie_clip,label)—————-call指定标签上的action
TGetProperty(movie_clip,property)——–获取movie_clip的指定属性
TSetProperty(movie_clip,property,number)-设置movie_clip的指定属性
AS3中使用navigateToURL取代了getURL,个人感觉navigateToURL最大的好处就是方便了传递参数,不足的地方嘛,据说弹出的新窗口会被浏览器拦截。需要使用:ExternalInterface.call(“window.open”,winurl,”");来避免,但是这是采用了调用JS来做,是必须在浏览器支撑并且JS可以使用的情况下(没有测试)。
另外发现在Adobe AIR中使用navigateToURL打开连接时,只能在新窗口中打开(不会被浏览器拦截),”_self”,”_parent”,”_top”都没有用.而且都是调用浏览器,而不是在AIR中打开.
具体用法如下:
package {
import flash.display.Sprite;
import flash.net.navigateToURL;
import flash.net.URLRequest;
import flash.net.URLVariables;
public class NavigateToURLExample extends Sprite {
public function NavigateToURLExample() {
var url:String = “http://www.adobe.com”;
var variables:URLVariables = new URLVariables();
variables.exampleSessionId = new Date().getTime();
variables.exampleUserLabel = “Your Name”;
var request:URLRequest = new URLRequest(url);
request.data = variables;
try {
navigateToURL(request);
}
catch (e:Error) {
// handle error here
}
}
}
}
关于WordpressReader的制作,包源文件和成品文件的下载,在AIR读取Blog RSS – Adobe AIR Beta2 实践一文中已经详细罗列了.但有一个问题没有解决,那就是:
在Wordpress中,文章Rss是由”wp-rss2.php”产生的,我在IE中打开这一页(http://www.adamstudio.cn/blog/wp-rss2.php),然后察看源代码,把源代码直接存到”content.xml”中。”content.xml”上穿到服务器后,WordpressReader就可以很顺利的读取最新的RSS了。
但是如果直接去读取”wp-rss2.php”就会出错”TypeError: None value”。
今天很偶然地发现问题出在Wordpress的缓存插件WP-Cache上,只要不缓存wp-rss2.php这一页就可以了,哈哈!到此为止,WordpressReader就完全拥有了实用价值,只要打开它就可以看到blog中的最新文章,而不用再打开浏览器,输入网址。当然目前浏览器也带有Rss浏览和收藏的功能,但是用AIR来制作RSS聚合功能可以利用Flash的各种动画效果,可以实现更为丰富的交互体验.
安装文件下载: http://www.adamstudio.cn/blog/download/WordpressReader_1.1.air
十一的时候Adobe AIR升级到Beta 2了,借这个机改进了一下读取RSS的应用。
比较早之前做的RSS阅读器
(参看:AIR 新闻阅读器),在其中实现了读取XML文档,自动升级等功能,但存在以下问题:
1 当时尝试直接从word press的数据库中读取最新的帖子,但因为编码的问题没有解决,最后只能手动录入新闻到xml文档;
2 中文字体可以显示,但非常难看(参看:AIR 新闻阅读器)。
用AIR Beta 2 重新构建后
1 直接用我的Blog系统word press中的rss生成功能产生的xml文档,不用再拷贝粘贴了,因此该名为“WordPressReader”;
2 中文字体已经好看多了,实际上已经更IE中的显示效果相当了!
3 去掉了自动升级功能,因为当初做这个功能就是为了测试。既然能够实现,我就不在这上面废太多时间了。
另外发现Beta2的描述文档application.xml结构变化很大。
仍然存在的问题
在Wordpress中,文章Rss是由”wp-rss2.php”产生的,我在IE中打开这一页(http://www.adamstudio.cn/blog/wp-rss2.php),然后查看源代码,把源代码直接存到”content.xml”中。”content.xml”上穿到服务器后,WordpressReader就可以很顺利的读取最新的RSS了。
但是如果直接去读取”wp-rss2.php”就会出错”TypeError: None value”。其实两个文档的代码是一模一样的,不知道为什么php格式的就读不出来?我正在研究,如果发现问题所在会贴在这里,如果哪位高手知道,请指点一下迷津!
安装程序:http://www.adamstudio.cn/blog/download/WordpressReader_1.0.air
源文件:http://www.adamstudio.cn/blog/download/rss.rar
程序截图:
在SwfObject解决Html与Flash之间传递参数问题一文中已经介绍了SwfObject的用法,但今天发现so.write(“flashcontent”);中如果”flashcontent”为table的id,那么在IE中无法加载Flash.这个问题很好解决,只要建一个一行一列的table,把id加到单元格上就不会出问题了。
注:”flashcontent”为表格或div的id。运行时带有该id的表格或者div的内容将会被Flash替代。
在彻底摒弃Adobe的激活ActiveX控件的方法一文中已经详细分析了使用Adobe提供的AC_RunActiveContent.js导致HTML与Flash之间不能传递参数的问题。经过Adobe论坛里GWD的提示,我转而寻求SwfObject的帮助。发现SwfObject是一个很好的解决方案。
SwfObject英文介绍:http://blog.deconcept.com/swfobject/
SwfObject中文翻译:http://www.awflasher.com/flash/articles/swfobj.htm
源文件:SWFObject 1.5
关于SwfObject的介绍上面两篇文章已经讲的很详细了。我这里只列一段标准的应用和一些上面两篇文章没有提到的问题.
Html中的JS代码
<script type="text/javascript" src="swfobject.js"></script>
<script type="text/javascript">
// <![CDATA[
var so = new SWFObject("asCallJs.swf", "MyDemo", "500", "400", "9", "#FF6600");
so.addVariable("param1", "Parameter1"); // this line is optional, but this example uses the variable and displays this text inside the flash movie
so.addVariable("param2", "Parameter2");
so.useExpressInstall('expressinstall.swf');
so.write("flashcontent");
// ]]>
</script><!--被AS调用的JS函数-->
<script language="Javascript">
// <![CDATA[
// adds two numbers, and sends the result back to ActionScript
function addNumbers(num1, num2)
{
result=num1 + num2;
alert("3+7=" + result);
return (result);
}
// ]]>
</script> <a href="http://www.adamstudio.cn/index.php/2007/swfobject_solve_html_flash_parameter_tranfer/#more-29" class="more-link">Continue reading SwfObject解决Html与Flash之间传递参数问题</a>
大家知道,在IE中只有激活了ActiveX控件,Flash才能够与浏览者交互,否则得手动点一下激活。Flash也提供了一个很“方便”的解决方案,就是在发布swf文件的同时,发布html文件即可。这样Flash会在生成一个swf文件,一个包含swf的Html文件,和一个“AC_RunActiveContent.js”文件。Html文件通过调用AC_RunActiveContent.js,实现激活ActiveX控件。这一切都很便捷,直到你希望在html和Flash之间传递参数。
问题出现
在很多商业网站中,都涉及到用同一个Flash来显示大量不同的内容(图片,视频或产品信息等),这就需要向这个Flash传递参数。常见的传参方法有三种,但都会受到AC_RunActiveContent.js的不良影响。
1 ExternalInterface: 这是困扰我最久的一个问题。据Adobe的描述,这是最好的传参方法,能都非常自由和直接地在AS和JS之间互相传递参数或者互相调用函数。但我在使用Adobe的示例文件时发现,在IE中AS无法得到JS的返回值(ExternalInterface在IE中的Bug),经过不断的尝试才发现是AC_RunActiveContent.js在捣鬼,只要把它和html中对应代码以及<noscript></noscript>删除就一切正常了。
请看示例:
Player8,AS2: http://www.adamstudio.cn/lab/var/test/test_v8.html
Player9,AS3: http://www.adamstudio.cn/lab/var/test/test_v9.html
如果带有激活ActiveX控件的那段JS代码,IE中就无法得到返回值,请看:
http://www.adamstudio.cn/lab/var/test/test_error.html
所有源文件:http://www.adamstudio.cn/lab/var/test/test.rar
2 FlashVars:
3 URL传递参数
后两种方法受AC_RunActiveContent.js的影响更大,因为这两种方法都是在<noscript></noscript>之间加入代码,而在JS能运行的浏览器当中(绝大多数浏览器都能运行JS),这些代码根本就不会运行。所以无论在Firefox或者IE中都不起任何作用!
也就是说常用的三种在Html与AS之间传递参数的方法均受到激活ActiveX控件的那段代码的影响。所以要想在html和Flash之间传递参数,就必须摒弃Flash自带的激活ActiveX控件的方案!
替代方案:SwfObject 请参考SwfObject解决Html与Flash之间传递参数问题