一些好用的lib
心得筆記 2010/07/02 05:13Trackback Address :: http://diary.tw/allenliao/trackback/892
今天早上遇到一個AS無法成功執行JS的問題,
我想做的功能是,使用者瀏覽SWF然後點擊SWF裡的BTN之後,跳出詢問是否將某個網址設為該瀏覽器的首頁的對話框,實做的流程就是由AS的GETURL或EXTERNALINTERFACE去呼叫頁面上的JS,該JS在去實作將某個網址設為該瀏覽器的首頁的功能
再AS的語法如下
import flash.external.*;
yahoo.onRelease = function() {
ExternalInterface.call("hi","me");
//getURL("javascript:hi('hi')", "me");
//getURL("javascript:var newdiv=document.createElement('div');newdiv.id='divblock';document.body.appendChild(newdiv);newdiv.style.behavior='url(#default#homepage)';newdiv.setHomePage('twimtv.im.tv');");
};
在嵌入該SWF的HTML(main.html)語法如下
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=big5" />
<title>test</title>
<script language="javascript">
function hi(srt){
alert(srt);
var newdiv=document.createElement('div');
newdiv.id='divblock';
document.body.appendChild(newdiv);
newdiv.style.behavior='url(#default#homepage)';
newdiv.setHomePage('http://twimtv.im.tv');
}
</script>
</head>
<body>
<a href="javascript:"></a>
<input type="button" name="dd" onClick="javascript:hi('55')" value="bbfff"/>
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" width="550" height="400" id="IFCall" align="middle">
<param name="allowScriptAccess" value="always" />
<param name="movie" value="IFCall.swf" />
<param name="quality" value="high" />
<param name="bgcolor" value="#ffffff" />
<embed src="IFCall.swf" quality="high" bgcolor="#ffffff" width="550" height="400" name="IFCall" align="middle" allowScriptAccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />
</object>
</body>
</html>
用IE瀏覽main.html發現
點擊頁面上的bbfff這個按鈕(非SWF上的按鈕)是可成功執行的(代表這段JS在IE上是正確的)
點擊SWF上的YAHOO這個按鈕,ALERT有成功跳出(代表AS呼叫JS成功),可是卻沒有跑將某個網址設為該瀏覽器的首頁的功能...
上網GOOGLE了一下,看起來像是安全性的限制,看來非要使用者點擊了IE上的按鈕才會觸發這個功能,於是我將這個問題貼上AUG(前MMUG)的M群,經TICORE大的建議將 wmode 設為 opaque~~
對話內容如下:
{id: "Ticore"}; // 說:
或許可以試試看,將 wmode 設為 opaque~~
x:Allenliao...3.0...想學FMS的人密我~噹噹人 說:
我試試~^^
{id: "Ticore"}; // 說:
因為 wmode=window 模式, plugin 上的滑鼠事件與瀏覽器分開的
將 wmode 設為 opaque~
可能可以讓瀏覽器能抓到使用者點擊的事件
x:Allenliao...3.0...想學FMS的人密我~噹噹人 說:
成功了
將 wmode 設為 opaque~~
{id: "Ticore"}; // 說:
:D
於是乎~HTML改成:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=big5" />
<title>test</title>
<script language="javascript">
function hi(srt){
alert(srt);
var newdiv=document.createElement('div');
newdiv.id='divblock';
document.body.appendChild(newdiv);
newdiv.style.behavior='url(#default#homepage)';
newdiv.setHomePage('http://twimtv.im.tv');
}
</script>
</head>
<body>
<a href="javascript:"></a>
<input type="button" name="dd" onClick="javascript:hi('55')" value="bbfff"/>
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" width="550" height="400" id="IFCall" align="middle">
<param name="allowScriptAccess" value="always" />
<param name="wmode" value="opaque" />
<param name="movie" value="IFCall.swf" />
<param name="quality" value="high" />
<param name="bgcolor" value="#ffffff" />
<embed src="IFCall.swf" quality="high" wmode="opaque" bgcolor="#ffffff" width="550" height="400" name="IFCall" align="middle" allowScriptAccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />
</object>
</body>
</html>
就成功了!
讓我們來測看看FF...幹...失敗了
(待續)
實測發現,FF擋更兇,他管你是不是從頁面上點擊觸發的,一率都擋,所以已經和FLASH沒關係了
GOOGLE找到範例
HTML改成:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>test</title>
<script language="javascript">
function hi(srt){
alert(srt);
setHomepage('http://www.im.tv')
}
function setHomepage(pageURL)
{
if (document.all)
{
document.body.style.behavior='url(#default#homepage)';
document.body.setHomePage(pageURL);
}
else if (window.sidebar)
{
if(window.netscape)
{
try
{
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
}
catch (e)
{
alert( "瀏覽器拒絕此操作,請在地址欄內輸入 about:config 然後將 signed.applets.codebase_principal_support 設為true" );
}
}
var prefs = Components.classes['@mozilla.org/preferences-service;1'].getService(Components. interfaces.nsIPrefBranch);
prefs.setCharPref('browser.startup.homepage',pageURL);
}
}
</script>
</head>
<body>
<a href="javascript:"></a>
<input type="button" name="dd" onClick="javascript:hi('55')" value="bbfff"/>
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" width="550"
height="400" id="IFCall" align="middle">
<param name="allowScriptAccess" value="always" />
<param name="wmode" value="opaque" />
<param name="movie" value="IFCall.swf" />
<param name="quality" value="high" />
<param name="bgcolor" value="#ffffff" />
<embed src="IFCall.swf" quality="high" wmode="opaque" bgcolor="#ffffff" width="550" height="400" name="IFCall" align="middle" allowScriptAccess="always" type="application/x-
shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />
</object>
</body>
</html>
若偵測出被瀏覽器擋住這項操作,會ALERT出一個訊息教你調整FF
Trackback Address :: http://diary.tw/allenliao/trackback/706
Trackback Address :: http://diary.tw/allenliao/trackback/544
Trackback Address :: http://diary.tw/allenliao/trackback/537
工作上遇到的問題
狀況:
頁面上嵌了ㄧ個SWF,SWF上寫了個FLVPLAYBACK及ExternalInterface.addCallback用javascript去控制影片的載入、播放、暫停,swf是用swfObject(http://blog.deconcept.com/swfobject/) 嵌入頁面的,頁面上的javascript除了呼叫flash裡的程式之外,還做了切換SWF大小的CSS功能(大螢幕小螢幕),在IE上面所有功能完全沒問題,但是在FireFox,頁面ㄧ開始影片的載入、播放、暫停都OK,按下切換SWF大小的CSS功能的鈕之後,原先載好的影片消失了,整個SWF被重設(回到剛被載好SWF的樣子)
後來仔細檢查換SWF大小的CSS功能的javascript
發現用的是className的切換來改CSS於是改成用STYLE做CSS的切換
變成一下可以一下不行(不穩定)
後來又發現STYLE的CODE裡頭有ㄧ行float 屬性變動的CODE於是先MARK掉(其實整個過程都是用TRY AND ERROR的方式進行的Orz)
把所有有作display =none的CSS都MARK掉
可以了!但版型整個跑掉...
用了ㄧ些取代方式,版型是救回來了
整理ㄧ下被FF影響的元素如下:
同級的 DIV 做 display 屬性變動(display =none)
使用className切換CSS
float 屬性變動
Trackback Address :: http://diary.tw/allenliao/trackback/476
昨天遇到一個安全性的問題,HELP看了那麼多次,果然還是要遇到了才知道HELP中解釋的道理
情況是這樣的
我有一個SWF檔 a.swf 在 a22.com
另一個SWF檔 b.swf 在 b33.com
而 a.swf 執行的時候會用loadclip的方式l載入 b.swf並執行 b.swf中的function b_function()
結果載不出來,於是,我第一個反應是想到crossdomain.xml沒過
我在瀏覽器網址列寫下
b33.com/crossdomain.xml
果然,找不到檔案
後來我在b33.com主機的根目錄下加上了crossdomain.xml這個檔案
內文如下
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy
SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<allow-access-from domain="*" to-ports="*"/>
</cross-domain-policy>
在執行一次
a22.com/a.swf
load到了!
但是
a.swf 呼叫 b_function()的這行code卻沒有執行...
翻了翻HELP
我把b.swf 的第一個影格加上
System.security.allowDomain("*");
在執行一次
a22.com/a.swf
a.swf 成功呼叫b.swf 中的 b_function()
HELP上面還說除了function 變數也有跨domain的存取限制,
所以跨domain的存取變數和function 都要依賴System.security.allowDomain()這個公用函數才行!!
以上
Trackback Address :: http://diary.tw/allenliao/trackback/159