2014-04-15 40 views
4

我试图将JS注入到UIWebView中。直到某个时刻,一切工作般的魅力:将iOS JS对象注入到WebView中


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附加到文档 - 没有任何帮助。我在这里做错了什么?

回答

4

发生了什么工作,是创建一个JS对象那样:

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

然后调用myObject.test()功能工作。

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中时发生的所有混乱的引用中。

+1

将脚本放在单独的资源中是我在最后完成的。不管怎么说,还是要谢谢你。 – Mateusz