JSContext 類別
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
封裝了一個 JavaScript 引擎。
[Foundation.Register("JSContext", true)]
public class JSContext : Foundation.NSObject
[<Foundation.Register("JSContext", true)>]
type JSContext = class
inherit NSObject
- 繼承
- 屬性
備註
the JSContext 是命名空間的 JavaScriptCore 中心物件。 它 JSContext 維護一個 JavaScript 環境(由屬性 Item[NSObject] 操作),並用該 EvaluateScript(String, NSUrl) 方法評估腳本。
應用程式開發者通常會希望在 ExceptionHandler 屬性上指派一個代理,以便在 Xamarin.iOS 程式碼中存取 JavaScript 領域中提出的例外。
以下範例展示了 的基本 JSContext用法。 情境會被實例化,並指派一個簡單的例外處理程序。 其中一個 From(NSObject, JSContext) 方法的超載用於為 JavaScript 變數 arg1arg2和 分配值。
EvaluateScript(String, NSUrl) 方法會評估 JavaScript 並回傳結果,然後再用 ToInt32() 方法將結果轉換回 .NET 物件。
jsContext = new JSContext();
jsContext.ExceptionHandler = (context, exception) => {
Console.WriteLine(exception);
};
jsContext[new NSString("arg1")] = JSValue.From(2, jsContext);
jsContext[new NSString("arg2")] = JSValue.From(2, jsContext);
var jsResult = jsContext.EvaluateScript("arg1 + arg2;");
var four = jsResult.ToInt32();
包含 JSContext 全域 JavaScript 上下文,包括由 JavaScript 計算設定的變數,如下範例所示:
jsContext.EvaluateScript("sum = 2 + 2;");
var four = jsContext[(NSString)"sum"].ToInt32();
呼叫 JavaScript 中的 C# 程式碼
開發者可以擴充介面 IJSExport ,定義可從 JavaScript 呼叫的方法。 開發者必須以 ProtocolAttribute 屬性標記該介面,並以屬性標記可呼叫 JavaScript 的方法 ExportAttribute 。 他們也必須在專案檔案中將 MSBuild 屬性 Registrar 設定為「靜態」或「管理靜態」。 例如:
[Protocol ()]
interface IMyJSVisibleProtocol : IJSExport {
[Export ("myFunc")]
int MyFunc ();
[Export ("Arity2:With:")]
NSObject Arity2With(NSObject arg1, NSObject arg2);
}
class MyJSExporter : NSObject, IMyJSVisibleProtocol
{
public int MyFunc ()
{
Console.WriteLine ("Called!");
return 42;
}
public NSObject Arity2With(NSObject arg1, NSObject arg2)
{
Console.WriteLine ("Arity 2 function called with " + arg1 + " " + arg2);
return (NSNumber) 42;
}
}
上述例子:
-
定義
IMyJSVisibleProtocol為擴展 IJSExport;: - 裝飾及其方法
MyFunc,與ProtocolAttributeExportAttribute屬性;IMyJSVisibleProtocol - 實作介面:
為了讓 JavaScript 暴露, IMyJSVisibleProtocol 開發者可以用如下程式碼在 ViewDidLoad() 他們的 UIViewController方法中:
webView = new UIWebView(UIScreen.MainScreen.Bounds);
var context = (JSContext) webView.ValueForKeyPath ((NSString) "documentView.webView.mainFrame.javaScriptContext");
context.ExceptionHandler = (JSContext context2, JSValue exception) =>
{
Console.WriteLine ("JS exception: {0}", exception);
};
var myExporter = new MyJSExporter ();
context [(NSString) "myCSharpObject"] = JSValue.From (myExporter, context);
webView.LoadRequest(NSUrlRequest.FromUrl(new NSUrl("MyHtmlFile.html", false)));
上述 C# 程式碼:
- 建立一個UIWebView將顯示給最終使用者的 ;
- 取得JSContextUIWebView物件主框架的 ;:
- 新增例外處理程式,使 JavaScript 問題對 Xamarin 專案可見;:
-
實例化一個新
MyJSExporter物件,如前所述,實IMyJSVisibleProtocol作 ;: -
將該物件加到 JSContext ,名稱為
myCSharpObject;: - 載入一個 HTML 檔案(見下文):
最後,載入 UIWebViewJSContextMyJSExporter 和 的 HTML 檔案可從 JavaScript 內存取該物件:
<html>
<head>
<title></title>
<script type="text/javascript">
function callXamObject() {
// `myCSharpObject` injected into JS context by C# code `context [(NSString) "myCSharpObject"] = JSValue.From (...etc...`
var resultCalculatedInCSharp = myCSharpObject.myFunc();
document.getElementById("Output").innerHTML = resultCalculatedInCSharp;
}
function callArity2Method() {
//Note how this is mapped by [Export ("Arity2:With:")]
var result = myCSharpObject.Arity2With("foo", "bar");
}
</script>
</head>
<body>
<div onclick="callXamObject()" class="button">
Click Me
</div>
<div id="Output">Value</div>
</body>
</html>
為了匯出一個 C# 物件使其對 JavaScript 可視,開發者必須將參數加入 --registrar:static 所 mtouch使用的參數中。 在 Xamarin Studio 中,這是在 Project 選項對話框的建置選項 / iOS 建置面板中完成的:

另一種從 Xamarin.iOS 呼叫 C# 程式碼的技巧是使用 REST,如下所示:
在 JavaScript 程式碼中,使用 XMLHttpRequest 標準 JSON 技術來發布並解析查詢給本地裝置上運行的 REST 服務:
<html>
<head>
<title></title>
<script type="text/javascript">
function callCSharp(msg) {
var request = new XMLHttpRequest();
request.open('GET','http://127.0.0.1:1711/', false);
request.send();
if(request.status == 200){
alert(JSON.parse(request.responseText));
}else{
alert("Error");
}
}
</script>
</head>
<body>
<div onclick="callCSharp('this is a test')" class="button">
Click Me
</div>
</body>
</html>
在應用程式中,請使用 HttpListener 來聆聽並回應該請求:
//Wire up listener
listener = new HttpListener();
listener.Prefixes.Add("http://*:1711/");
listener.Start();
listener.BeginGetContext(new AsyncCallback(Callback), listener);
//....etc...
void Callback(IAsyncResult result)
{
//Get the listener context
var context = listener.EndGetContext(result);
//Start listening for the next request
listener.BeginGetContext(new AsyncCallback(Callback), listener);
var response = CalculateResponse();
var responseBytes = System.Text.Encoding.UTF8.GetBytes(response);
context.Response.ContentType = "text/json";
context.Response.StatusCode = HttpStatusCode.OK;
context.Response.ContentLength64 = responseBytes.Length;
context.Response.OutputStream.Write(responseBytes, 0, responseBytes.Length);
context.Response.OutputStream.Close();
}
最後,第三種技術是輪詢 , JSContext 以取得 JavaScript 計算所設定的旗標。
建構函式
| 名稱 | Description |
|---|---|
| JSContext() |
封裝了一個 JavaScript 引擎。 |
| JSContext(JSVirtualMachine) |
封裝了一個 JavaScript 引擎。 |
| JSContext(NativeHandle) |
一種用於建立未受管理物件的受管理表示的建構器。 由執行時呼叫。 |
| JSContext(NSObjectFlag) |
用來呼叫衍生類別跳過初始化,僅僅配置物件。 |
屬性
| 名稱 | Description |
|---|---|
| AccessibilityAttributedUserInputLabels |
封裝了一個 JavaScript 引擎。 (繼承來源 NSObject) |
| AccessibilityRespondsToUserInteraction |
封裝了一個 JavaScript 引擎。 (繼承來源 NSObject) |
| AccessibilityTextualContext |
封裝了一個 JavaScript 引擎。 (繼承來源 NSObject) |
| AccessibilityUserInputLabels |
封裝了一個 JavaScript 引擎。 (繼承來源 NSObject) |
| Class |
封裝了一個 JavaScript 引擎。 (繼承來源 NSObject) |
| ClassHandle |
Objective-C 類別是這個類別的處理方式。 |
| CurrentArguments |
封裝了一個 JavaScript 引擎。 |
| CurrentCallee |
封裝了一個 JavaScript 引擎。 |
| CurrentContext |
封裝了一個 JavaScript 引擎。 |
| CurrentThis |
封裝了一個 JavaScript 引擎。 |
| DebugDescription |
封裝了一個 JavaScript 引擎。 (繼承來源 NSObject) |
| Description |
封裝了一個 JavaScript 引擎。 (繼承來源 NSObject) |
| Exception |
封裝了一個 JavaScript 引擎。 |
| ExceptionHandler |
封裝了一個 JavaScript 引擎。 |
| ExposedBindings |
封裝了一個 JavaScript 引擎。 (繼承來源 NSObject) |
| GlobalObject |
封裝了一個 JavaScript 引擎。 |
| Handle |
Handle(指標)指向未管理物件表示。 (繼承來源 NSObject) |
| Inspectable |
封裝了一個 JavaScript 引擎。 |
| IsDirectBinding |
取得或設定一個值,指示此實例是否使用直接 Objective-C 綁定。 (繼承來源 NSObject) |
| IsProxy |
封裝了一個 JavaScript 引擎。 (繼承來源 NSObject) |
| Item[NSObject] |
封裝了一個 JavaScript 引擎。 |
| JSGlobalContextRefPtr |
封裝了一個 JavaScript 引擎。 |
| Name |
封裝了一個 JavaScript 引擎。 |
| RetainCount |
封裝了一個 JavaScript 引擎。 (繼承來源 NSObject) |
| Self |
封裝了一個 JavaScript 引擎。 (繼承來源 NSObject) |
| Superclass |
封裝了一個 JavaScript 引擎。 (繼承來源 NSObject) |
| SuperHandle |
用 handle 表示此 NSObject基底類別中的方法。 (繼承來源 NSObject) |
| VirtualMachine |
封裝了一個 JavaScript 引擎。 |
| Zone |
封裝了一個 JavaScript 引擎。 (繼承來源 NSObject) |