GAJavaScript是一个使从原生代码中操作JavaScript变得更简单的Cocoa Touch库。它有几个重要的设计目标
JavaScript通过UIWebView从Cocoa Touch进行访问。GAJavaScript有一个“脚本引擎”的概念,它提供了对UIWebView内部JavaScript运行时的主要接口。实质上,UIWebView是该库的一个实现细节,但您可能想要管理脚本引擎使用的UIWebView实例。
该类为库的主要接口。它接受或创建一个UIWebView并将其准备用于库。它实现了UIWebViewDelegate,以便在WebView加载时加载库的JavaScript文件,并实现了从JavaScript调用Objective-C方法的支持。它还添加了创建新对象的方法,无论是简单的“new Object”还是使用构造函数。以这种方式创建新对象时,其生命周期与返回的GAScriptObject的生命周期绑定,除非您将其分配为另一个对象的属性。
通常,iOS应用程序将有一个GAScriptEngine实例。您可以将实例保存在全局可访问的地方,例如UIApplication代理,或者与负责管理隐藏的UIWebView的对象/views一起保存。
此类别添加了对HTML文档中在WebView中加载的“document”和“window”对象的访问器。然后您可以使用任何GAScriptObject功能对它们进行操作。
此对象在UIWebView中提供了一个JavaScript对象的包装。它提供了一个KVC视图用于JavaScript对象,因此您可以像使用其他Objective-C类一样使用[NSObject valueForKey:]
和[NSObject setValue:forKey:]
来获取和设置对象的属性。只有非函数属性通过KVC暴露。
GAScriptObject处理语言之间的数据传输。它将处理字符串的引号,传递日期值,处理子对象和数组。
有三种“callFunction”方法可以用来调用对象上的函数,可以是无参数、一个参数或一组参数。KVC代码支持的所有数据类型都可以用作函数参数和返回类型。
GAScriptObject实现了NSFast Enumeration,以便您可以编写迭代脚本对象属性名称和值的循环。
在“/Tests”文件夹中有单元测试,展示了如何使用各种功能(并且确保功能工作!)。
开始的一个简单方法是
[GAScriptEngine initWithWebView:]
。[GAScriptEngine newScriptObject:]
创建自己的对象。如果您在JavaScript中有一个命名空间对象(例如,“mycompany.lib”),您可以使用GAScriptEngine方法([GAScriptEngine scriptObjectWithReference:@"mycompany.lib"]
)为它创建一个GAScriptObject包装器。
您可以使用返回的GAScriptObject访问子对象或调用函数。
GAJavaScript的一个有趣特性是将GAScriptObject上的任意消息调用转换为JavaScript调用。这意味着您可以使用“常规”Objective-C调用语法调用JavaScript,而不是使用[GAScriptObject callFunction:]
。这是通过GAScriptObject实现NSObject方法的调用转发来实现的。所需的所有只是定义与JavaScript函数签名匹配的选择器和方法签名。
如果您查看“GAScriptMethodSignatures.h”,您将看到一个对象,它定义了一套用于常用的JavaScript函数和DOM接口的选择器。如果您将此头文件包含到使用脚本对象的源代码中,您可以直接调用这些函数。例如,假设您有一个表示HTML "document"对象的GAScriptObject实例
// Get the "document" object from the script engine
id document = [scriptEngine documentObject];
// Get a GAScriptObject that represents the DOM element with id="myelement"
id myElement = [document getElementById:@"myelement"];
// The above is the same as this, but nicer to read and write
id myElement2 = [document callFunction:@"getElementById" withObject:@"myelement"];