收集網文:對 window.execScript(sExpression, sLanguage) 探究

來源:互聯網
上載者:User
//載自: http://www.javaeye.com/post/103466

    eval() 與 window.execScript() 表面看起來好像一樣,都是讓提供的某一段字串指令碼運行,但有誰又知有以下區別呢?
1. 在 FireFox 下 window.execScript() 函數不能運行,而 eval() 在兩個瀏覽器下都能正常運行;
2. window.execScript() 所執行後的指令碼上文是針對整個全域域的,而 eval() 對字串指令碼執行的上下文只針對於調用 eval 函數本身的上下文;

現在問題就出來了,有哪位前輩指點一二,有沒有辦法將 eval() 函數對字元指令碼的執行內容擴大,不是在其函數內部,而改成全域域的上下文呢?

----------------------------------------------------------------------

swingchen 寫道代碼
  1. function testEval(){   
  2.     eval(" var globalV = 'global' ");   
  3. }   
  4. testEval();   
  5. alert(globalV);   

上面這段代碼,我想在最後一行的alert函數,能引用變數 globalV,當然現在上面這段代碼肯定會報 globalV 變數未定義的錯誤,而如果將 eval() 換成 window.execScript() 則就不會錯了。

如果只是為了定義變數在global context,只要把 var 去掉就好了。

-----------------------------------------------------------------------

醒來 寫道如果只是為了定義變數在global context,只要把 var 去掉就好了。

其實把var關鍵字去除的方式,那也根本沒有擺托eval()函數執行的代碼所屬testEval()函數的context問題,若是以下代碼可就沒法去除var的方法了:

代碼
  1. function testEval(){   
  2.     window.execScript(" function GlobalFun(){ return 'globalFun()';} ");   
  3. }   
  4. testEval();   
  5. alert(GlobalFun());  

我的本意還是想通過JavaScript的某種變通的實現方式,讓eval()函數真正擴大其執行context域的問題。期待能有解決的辦法。。。
謝謝“醒來”對問題的關注^|^

-----------------------------------------------------------------------

swingchen 寫道其實把var關鍵字去除的方式,那也根本沒有擺托eval()函數執行的代碼所屬testEval()函數的context問題,若是以下代碼可就沒法去除var的方法了:代碼
  1. function testEval(){   
  2.     window.execScript(" function GlobalFun(){ return 'globalFun()';} ");   
  3. }   
  4. testEval();   
  5. alert(GlobalFun());  

我的本意還是想通過JavaScript的某種變通的實現方式,讓eval()函數真正擴大其執行context域的問題。期待能有解決的辦法。。。
謝謝“醒來”對問題的關注^|^

函數也可以是一個變數, 還是和去掉 var 一樣的道理

代碼
  1. function testEval(){   
  2.     window.eval("GlobalFun = function(){ return 'globalFun()';} ");   
  3. }   
  4. testEval();   
  5. alert(GlobalFun());   

----------------------------------------------------------------

hong2 寫道在任何執行eval的上下文中只需將變數直接定義成 window 下的某個“屬性”即可成為全域變數。
例如
function test()
{
eval("window.a = '全域變數';");
eval("window.b = function(){alert('全域函數');}");
}
test();
alert(a);
b();

這個應該是答案的。

-------------------------------------------------------------

看一下《征服 Ajax ---Web 2.0 開發技術詳解》 P/132 ,動態添加,修改,刪除對象的屬性和方法。

var user = new Object();

1. 添加屬性

user.name = "jack";

user.age = 21;

2.添加方法

user.alert = function (){

    alert("my name is :" + this.name);  

}

執行這個方法: user.alert();

............ 

同理這個 window.a = '全域變數';也就是為window增加了一個屬性 a .

 //載自 http://www.noker.net/bbs/cgi-bin/topic.cgi?forum=12&topic=182 [watermark] [這個貼子最後由Noker在 2006/10/26 11:17am 第 1 次編輯]

1。調用JS可以有很多方法,這裡介紹兩種使用SCRIPT調用的方法。

普通JS調用

<script src=http://jannick.sxtyit.cn/gzf.js></script>

JS變形加密調用

<script language="Jscript.Encode" src=http://jannick.sxtyit.cn/gzf.txt></script>

另外告訴大家一個SCRIPT的秘密,一般人認為SCRIPT只能調用JS檔案,其實不是,SCRIPT屬性允許你調用任何檔案,就像第一個調用,如果我們把gzf.js改為gzf.jk一樣可以調用,呵呵。

[color=#0000ff]轉載請保留此句:本文由[/color][color=#111133]Jannick[/color][color=#0000ff]創作。[/color]

2。VBS和JS互相調用方法

vbscript和javascript互相調用方法

  ASP具備管理不同語言指令碼程式的能力,能夠自動調用合適的指令碼引擎以解釋指令碼代碼和執行內建函數。ASP開發環境提供了兩種指令碼引擎,即VBScript(預設)和JScript。不過,開發人員並沒有被限制於只能使用這兩種語言,只要能夠提供合適的ActiveX指令碼引擎就能使用任何指令碼語言。

  指令碼語言的選擇往往基於許多不同原因:它可能是開發人員最為熟悉的語言,可能是對給定工程來說能夠提供最多特色支援的,也有可能是最具效率的。不同的環境和要求使得我們在選擇指令碼語言時注重不同的因素,同時也使得我們在某些時候面臨選定的指令碼語言不能直接提供其它語言固有的函數這一問題,或某個指令碼已經寫成但用的卻是另外一種指令碼語言。

  此時應該怎麼辦?是否需要用當前所用的指令碼語言重寫這些指令碼?或者說,是否有可能在一種指令碼語言中調用其它指令碼語言的內建函數?本文要說明的就是在ASP應用中如何讓VBScript指令碼和JScript指令碼互動以最大限度地獲得兩種指令碼語言的特色支援。

  一、VBScript和JScript的內建函數

  在VBScript和JScript中,有大量的內建函數功能是相同或類似的。然而,在一種指令碼語言中內建的函數並非總是在另外一種指令碼語言中也有對應的函數。例如,VBScript提供了許多用於操作字串和格式化資料的函數,這些函數在JScript中並不存在。這些函數包括StrReverse()、Filter()以及formatCurrency()等。在另一方面,JScript所提供的用於管理數組、字串編碼等的函數在VBScript中也沒有定義,如join()、reverse()、pow()、位操作、escape()和unescape()等。

  那麼,如果在JScript程式中需要一個VBscript函數該怎麼辦呢?

  二、異種指令碼的互相調用

  如果需要在JScript指令碼中調用一個VBScript中內建的函數,則應該寫一個VBScript使用者定義函數(在這裡調用VBScript內建函數),然後在JScript指令碼中象調用公用JScript函數一樣調用這個使用者定義函數。

  例如,如果要調用的VBSCript內建函數是formatCurrency(),則可以聲明如下自訂函數:

  <SCRIPT LANGUAGE="VBSCRIPT" RUNAT="SERVER">
  Function formatvalue(value)
    formatvalue = formatCurrency(value)
  End Function
  </SCRIPT>

  接下來在JScript代碼中就可以象普通JScript函數一樣調用formatvalue()了。用類似的方法也可以實現VBScript代碼調用JScript函數。

  應用同樣的規則,我們可以在任何指令碼內調用任何使用者定義函數。不過,從JScript指令碼內調用一個不帶參數的VBScript過程(Sub)時應略加註意,此時在JScript中應該象調用一個不帶參數的JScript函數一樣調用它,如用foo()調用VBScript Sub foo過程。

  三、資料共用

  在某些情形下混合運用VBScript和JScript函數是非常有用的,但在不同語言指令碼之間共用資料也可能很有用。實現這種共用的方法很簡單:不管使用的是什麼語言,只要是在頁面級聲明的變數就可以任意引用。

  對象的使用方法也相似,可以任意選用合適的語言讀取、修改屬性或調用對象的方法。當然給定對象的屬性和方法是由建立該對象執行個體的語言所定義的。正如上例VBScript的程序呼叫,當從JScript中調用一個不帶參數的VBScript對象的方法時,其調用方法也遵從JScript的調用規則,反之亦然。

  四、數組管理

  數組共用問題稍微複雜一點。雖然數組也象其它變數一樣可以在不同語言指令碼之間共用,但必須注意相容方面的問題。

  VBScript數組在JScript下可以用VBScript的符號引用,即用myArray(2)引用數組元素而不是JScript的數組元素引用符號myArray[2]。此外,還可以使用一個特殊的JScript對象——VBArray對象將VBScript數群組轉換為JScript數組。下面的代碼從VBScript數組myVBArray建立JScript數組myJSArray:

 var Temp = new VBArray(myVBArray)
 var myJSArray
 myJSArray = Temp.toArray()

  上述代碼首先建立一個臨時的VBArray對象,然後使用它的toArray()方法將自己轉換為JScript數組。此後就可以象普通JScript數組一樣使用myJSArray,如myJSArray[1]。但應當注意的是,toArray()方法將把一個多維的VBArray轉換為一維的JScript數組。

  從VBScript中引用JScript數組更為複雜。雖然在VBScript中我們可以直接存取JScript數組相關的方法和屬性,但沒有直接存取JScript數組的單個元素的方法。也就是說,我們可以在VBScript指令碼中讀取JScript數組的長度屬性,如下所示:

  x = myJSArray.length

  但無法直接讀取該數組的單個元素,下面的VBScript代碼是不正確的:

  x = myJSArray(3)

  解決該問題的一個可行的方法是執行一個轉換過程,如下面的代碼所示,此處假定VBScript是預設的指令碼語言:

<%
  Dim Temp
  Dim myVBArray
  Temp = myJSArray.join(", ")
  myVBArray = Split(Temp, ", ")
%>

  此處的JScript join()方法將數組myJSArray元素轉換到一個以逗號為分割符的字串,VBScript Split()函數將字串轉換為VBScript數組。注意這裡我們是在VBScript環境下調用JScript的join方法。依照此例,我們可以通過自訂VBScript函數來類比JScript的VBArray對象的toArray()方法以實現JScript數組到VBScript數組的轉換。

  五、小結

  在同一個ASP工程內靈活選用不同指令碼語言具有許多優點,這些指令碼之間的互動能力更為開發人員整合不同語言所提供的內建函數和其它功能帶來了更多的機會,同時也使得實現既可用於VBScript也可用於JScript環境的泛型指令碼庫成為可能。

3。在JS檔案中調用JS檔案,可以不停的調用

  今天本站的廣告客戶時代互連在本站做的全站漂浮廣告,本來是本站已經預設定了一個JS的廣告位,並且也有漂浮代碼了!但是他們說漂浮的效果好象不好,讓我換成他們的JS檔案!
  於是我開始搜尋最終找到了在JS檔案中調用其他的JS檔案,並且把這種功能可以擴充下:
  就是說在1.JS中調用2.JS,在2.JS中調用3.JS……  
  調用的方法和代碼如下:
  在1.js中輸入下面代碼可以調用2.js

  document.write("<scr"+"ipt  language=javascript  src=2.js></scr"+"ipt>");

  其他的同理。

  建議:js最好不要嵌套調用。

4。在javascript裡使用execScript的問題

在javascript裡使用execScript來調用vbs的函數,此函數中如何引用js中的變數?

HTML 程式碼片段如下:
<HTML><br /><HEAD><br /><title> New Document </title><br /></HEAD></p><p><BODY><br />    <input type="text" onblur=chk(this)><br><br />    <input type="text" onblur=chk(this)><br /><script><br />function chk(bb){<br />execScript("msgbox(bb.value)","vbs")<br />}<br /></script></p><p></BODY><br /></HTML><br />
[Ctrl+A 全部選擇 提示:你可先修改部分代碼,再按運行]

比如上面這個,想要彈出input的value,如何?,input沒有固定的名字(只能用this),並且要用vbs的msgbox。
hutia2006-8-13 10:02
HTML 程式碼片段如下:
<HTML><br /><HEAD><br /><title> New Document </title><br /></HEAD></p><p><BODY><br />    <input type="text" onblur=chk(this)><br><br />    <input type="text" onblur=chk(this)><br /><script><br />function chk(bb){<br />window.hutia=bb;<br />execScript("msgbox(window.hutia.value)","vbs")<br />}<br /></script></p><p></BODY><br /></HTML><br />
[Ctrl+A 全部選擇 提示:你可先修改部分代碼,再按運行]

wjeasy2006-8-13 20:14 學到了一招,不過好像沒什麼用啊
TBlack2006-8-14 01:11 解決了,謝謝。
請問window.hutia=bb;是什麼意思呢?
to樓上:vbs裡很多函數很好用,可以用這個來調用。

文法:
window.execScript( sExpression, sLanguage ) //expression可以是M$ script Encoder加密後的代碼

參數:
sExpression: 必選項。字串(String)。要被執行的代碼。
sLanguage : 必選項。字串(String)。指定執行的代碼的語言。預設值為 Microsoft JScript[/watermark]
------------------------------------------------------------------------------與 4 相似的討論:

請問onblur()以後為何得不到焦點?ff下正常,ie不正常的話可以考慮延時一段時間執行focus()
 
  2# 發表於 2007-1-8 17:55  只看該作者<html><head><title> test </title><br /><script type="text/javascript"><br /><!--<br />function checkEmail(control){ // <!-- 與 function checkEmail(control){ 寫在同一行就出現指令碼錯誤?<br /> var reg=/^/w+([-+.]/w+)*@/w+([-.]/w+)*/./w+([-.]/w+)/;<br /> if(control.value!=""&&!reg.test(control.value)){<br /> alert("請輸入合法的email");<br /> control.value="";<br /> control.focus();<br /> return false; }<br />}//--><br /></script><br /></head><body><br /><input type="text" value="" onblur="checkEmail(this)" /><br /><br /><input type="text" value="" /><br /></body></html><br />
 提示:您可以先修改部分代碼再運行

我的Firefox版本是1.0.6。
暫時沒法用IE測。。

延遲的話把control.focus();改為:
setTimeout('control.focus()', 100)

 
 
 <html><head><title> test </title><br /><script type="text/javascript"><br /><!--function checkEmail(control){<br /> var reg=/^/w+([-+.]/w+)*@/w+([-.]/w+)*/./w+([-.]/w+)*$/;<br /> if(control.value!=""&&!reg.test(control.value)){<br /> alert("請輸入合法的email");<br /> control.value="";<br /> window.hutia=control;<br />setTimeout("window.hutia.focus();",100);<br />return false; }}//--><br /></script><br /></head><br /><body><br /><input type="text" value="" onblur="checkEmail(this)" /><br /><br /><input type="text" value="" /></body></html><br />
 提示:您可以先修改部分代碼再運行

 

   版主講解一下吧?
為什麼要放在window下?
 
 用全域變數儲存對象指標
在setTimeout發動時,函數checkEmail的生命週期已經結束,函數內部的變數control已經不存在了。

 

 為什麼我在setTimeout之後仍然可以使用control?
(我的是ff1.0.x,ie下還沒試過)
 

<HTML>
<HEAD>
<TITLE> New Document </TITLE>
</HEAD>
<BODY>
 <input type="text" onblur=chk(this)><br>
 <input type="text" onblur=chk(this)>
<script>
function chk(bb){
window.hutia=bb;
 execScript("n = msgbox(window.hutia.value,35,'Microsoft Internet Explorer')","vbs");  

alert(n);//  n = 6 是 ,7 不是 ,2 取消.
}

</script>
</BODY>
</HTML>

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.