iOS JS Class Object注入WebView

时间:2014-04-15 16:38:09

标签: javascript ios uiwebview

我试图将JS注入UIWebView。在某种程度上,一切都像魅力一样:


viewDidLoad中,我将一个HTML按钮加载到WebView:

NSString *loadedHTML = <input type='button' onclick='test();' value='test'/>;
[_webView loadHTMLString:loadedHTML baseURL:nil];

所以我只需点击按钮即可测试我的JS功能是否有效。在webViewDidFinishLoad:webView我注入了一个JS函数:

NSString *jsScript = 
@"var test = function() {alert('not in class')};"
@"document.getElementsByTagName('head')[0].appendChild(test);";

[webView stringByEvaluatingJavaScriptFromString:jsScript];

这很有效。


现在我需要创建一个类似的函数,但它必须在一个对象中。我试过的是:

更改HTML,因此按钮调用对象函数:

loadedHTML = <input type='button' onclick='myObject.test();' value='test'/>;

更改JS,因此它会在其中创建一个对象和一个函数:

jsScript = 
@"var myObject = new function() {"
@"var test = function() {alert('not in class')};"
@"document.getElementsByTagName('head')[0].appendChild(myObject);";
@"}";

它什么都不做。我尝试在three different ways中创建对象,将myObject.test附加到文档中 - 没有任何帮助。我在这做错了什么?

2 个答案:

答案 0 :(得分:4)

工作中发生了什么,就是创建一个像这样的JS对象:

var myObject = {
   test: function() {alert('in class!')}
}

然后,调用myObject.test()函数。

答案 1 :(得分:1)

这里有一些适合我的代码:

NSString *jsScript =
@"var script = document.createElement('script');"
@"    script.type = 'text/javascript';"
@"    script.text = '"
@"        var myObject = (function() {"
@"            return {"
@"                test: function() {"
@"                    alert(\"foo\");"
@"                }"
@"            }"
@"        })();"
@"';"
@"document.getElementsByTagName('head')[0].appendChild(script);";

NSString *result = [self.webMain stringByEvaluatingJavaScriptFromString:jsScript];

差异(主要)是创建要添加到DOM的脚本元素。我使用了一种我更喜欢带有方法的对象的样式,对JS代码本身进行了一些小改动。

但是,我将提出的一个建议是从资源加载Javascript文件。如果这对您有用,那么从单独的文件中读取和调试Javascript要简单得多,而不是将它与在Objective-C中内嵌嵌入时发生的所有混乱引用一起编写。