避免发生与安全有关的javascript错误

會產生 JavaScript錯誤:

eval() 函數

setTimeout() 和 setInterval()

Function 建構函式

此外,使用下列類型的 JavaScript 陳述式也會失敗,並且不會產生不安全的 JavaScript 錯誤:

javascript: URL

在 innerHTML 和 outerHTML 陳述式中透過事件之特質指定的事件回呼

載入位於應用程式安裝目錄以外的 JavaScript 檔案

document.write() 和 document.writeln()

在 load 事件傳送之前或在 load 事件處理常式期間初始化的同步 XMLHttpRequest

動態建立的 Script 元素

備註: 在某些受到限制的情況下,可以執行評估字串作業。如需詳細資訊,請參閱不同安全執行程序中內容的程式碼限制。
Adobe 已整理出一份支援應用程式安全執行程序的 Ajax 架構清單,請造訪 http://www.adobe.com/go/airappsandboxframeworks_tw 以取得這份清單。

下列幾節將說明如何重新撰寫 Script 來避免這些不安全的 JavaScript 錯誤和不會產生訊息的錯誤,以便在應用程式安全執行程序中執行程式碼。

將應用程式內容對應至不同的安全執行程序
在大部分情況下,您都可以重新撰寫應用程式或重新建立其架構,避免發生與安全性有關的 JavaScript 錯誤。不過,在無法重新撰寫或重新建立架構的情況下,您可以使用將應用程式內容載入至非應用程式安全執行程序中所述的技巧,將應用程式內容載入至不同的安全執行程序中。如果該項內容也必須存取 AIR API,您可以如設定安全執行程序橋接介面中所述,建立新的安全執行程序橋接。

eval() 函數
在應用程式安全執行程序中,eval() 函數只能在網頁的 load 事件傳送之前,以及在 load 事件處理常式執行期間使用。網頁完成載入之後,呼叫 eval() 將不會執行程式碼。不過,在下列情況中,您可以重新撰寫程式碼以避免使用 eval()。

將屬性指定給物件
請不要透過下列所示方式剖析字串來建置屬性存取子:

eval("obj." + propName + " = " + val);請改以方括號標記法來存取屬性:

obj[propName] = val;使用可以在內容中使用的變數來建立函數
請將下列陳述式:

function compile(var1, var2){
eval("var fn = function(){ this."+var1+"(var2) }");
return fn;
}取代成為:

function compile(var1, var2){
var self = this;
return function(){ self[var1](var2) };
}使用類別名稱做為字串參數來建立物件
假設使用下列程式碼定義假設性的 JavaScript 類別:

var CustomClass =
{
Utils:
{
Parser: function(){ alert('constructor') }
},
Data:
{

}
};
var constructorClassName = "CustomClass.Utils.Parser";建立實體的最簡單方式,就是使用 eval():

var myObj;
eval('myObj=new ' + constructorClassName +'()')不過,您可以剖析該類別名稱的其中每一個字元,並使用方括號標記法建置新物件,以避免呼叫 eval():

function getter(str)
{
var obj = window;
var names = str.split('.');
for(var i=0;i<names.length;i++){
if(typeof obj[names[i]]=='undefined'){
var undefstring = names[0];
for(var j=1;j<=i;j++)
undefstring+="."+names[j];
throw new Error(undefstring+" is undefined");
}
obj = obj[names[i]];
}
return obj;
}若要建立實體,請使用:

try{
var Parser = getter(constructorClassName);
var a = new Parser();
}catch(e){
alert(e);
}setTimeout() 和 setInterval()
請以函數參考或物件取代傳遞做為處理常式函數的字串。例如,將下列陳述式:

setTimeout("alert('Timeout')", 10);取代成為:

setTimeout(alert('Timeout'), 10); 或者,當這個函數需要由呼叫者來設定 this 物件時,將下列陳述式:

this.appTimer = setInterval("obj.customFunction();", 100);取代成為:

var _self = this;
this.appTimer = setInterval(function(){obj.customFunction.apply(_self);}, 100);Function 建構函式
對 new Function(param, body) 的呼叫可以取代為行內函數宣告,或者只在處理 load 事件之前使用這個呼叫。

javascript: URL
在應用程式安全執行程序中,使用 javascript: URL 配置在連結中定義的程式碼會遭忽略,這不會產生不安全的 JavaScript 錯誤。您可以將如下所示使用 javascript: URL 的連結:

<a href="javascript:code()">Click Me</a>取代成為:

<a href="#" οnclick="code()">Click Me</a>在 innerHTML 和 outerHTML 陳述式中透過事件之特質指定的事件回呼
當您使用 innerHTML 或 outerHTML 將元素加入至文件的 DOM 時,所有在陳述式中指定的事件回呼 (例如 onclick 或 onmouseover) 都會遭忽略,這不會產生安全性錯誤。您可以改為將 id 特質指定給這些新元素,並使用 addEventListener() 方法設定這些事件處理常式回呼函數。

舉例來說,您可以在文件中指定某個目標元素,如下所示:

<div id="container"></div>將下列陳述式:

document.getElementById('container').innerHTML =
'<a href="#" οnclick="code()">Click Me.</a>';取代成為:

document.getElementById('container').innerHTML = '<a href="#" id="smith">Click Me.</a>';
document.getElementById('smith').addEventListener("click", function() { code(); });

原文:http://help.adobe.com/zh_TW/AIR/1.1/devappsflash/WS5b3ccc516d4fbf351e63e3d118666ade46-7f0e.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值