2014-10-26 75 views
5

我使用swift語言代碼創建了一個iOS Web瀏覽器。並添加一個額外的按鈕,該網頁上注入一個腳本,但是當我嘗試這一點,總是崩潰:在Webview中注入JavaScript代碼iOS

webView!.evaluateJavaScript("document.body.style.background = 'red';", nil) 

任何想法如何解決這一問題?以及如何從文件中讀取JavaScript代碼,然後將其注入到該webview元素。

我使用的代碼風格爲這個例子,但與WKWebViewhttps://github.com/rshankras/WebViewDemo

如果你能解決這個問題,我需要在回答一個基本的工作代碼。以及如何從文件加載JavaScript的解決方案。並在WKWebView元素中注入該代碼。

+0

您能提供一些關於您遇到的崩潰的信息嗎? – delannoyk 2014-10-28 13:50:02

+0

「線程1:信號SIGABRT」 – user1731468 2014-10-28 13:55:06

+0

您是使用'WKWebView'還是'UIWebView'? – mustafa 2014-10-30 14:23:20

回答

2

我在當前的UIWebView API docs中看不到您正在使用的方法(evaluateJavaScript),但它在WKWebView docs中。也許你正在使用錯誤的API?也許嘗試使用stringByEvaluatingJavaScriptFromString(_:),而不是:

let script = "document.body.style.background = 'red'" 
if let result = webView.stringByEvaluatingJavaScriptFromString(script) { 
    println("result is \(result)") 
} 

此外,我不知道如果「!」是需要的(預感告訴我這不是),因爲你的代碼沒有上下文。所以也許試試兩個版本。

獲取從一個文件中的字符串是一樣的東西:

let path = NSBundle.mainBundle().pathForResource("jsFileName", ofType: "js") 
if let content = String.stringWithContentsOfFile(path, encoding: NSUTF8StringEncoding, error: nil) { 
    println("js content is \(content)") 
} 

從磁盤加載有很多圍繞着如何你的文件正在被複制的變量和存儲讓你將不得不做一些工作,以適應path變量爲您的結構。

+0

仍然錯誤,你能給我提供一個基本的代碼示例 – user1731468 2014-10-29 11:05:46

+0

剛剛添加代碼示例到答案 – mattr 2014-10-29 12:38:21

+0

我使用WKWebview,並給我這個錯誤:'WKWebView'沒有名爲'stringByEvaluatingJavaScriptFromString'的成員 – user1731468 2014-10-29 20:31:16

0

如果您使用的是WKWebView這裏是一個解決方案。

if let scriptFile = NSBundle.mainBundle().pathForResource("script", ofType: "js") { 
    var error: NSError? 
    let scriptString = NSString(contentsOfFile: scriptFile, encoding: NSUTF8StringEncoding, error: &error) 
    if let error = error { 
     println("Error: Could not load script file => \(error)") 
    } else { 
     if let scriptString = scriptString { 
      let script = WKUserScript(source: scriptString, injectionTime: .AtDocumentEnd, forMainFrameOnly: true) 
      let controller = WKUserContentController() 
      controller.addUserScript(script) 

      let configuration = WKWebViewConfiguration() 
      configuration.userContentController = controller 

      let webView = WKWebView(frame: self.view.bounds, configuration: configuration) 
      self.webView = webView 
      self.view.addSubview(webView) 
     } 
    } 
} 
+0

當我點擊按鈕(與此代碼)。一切都消失了,我看不到網頁視圖元素,只有一個帶有長滾動條的白頁。 – user1731468 2014-10-30 22:19:34

+0

在這裏仍然不可見。 – user1731468 2014-11-02 20:54:15

2

這將與WKWebView一起使用。不要忘了在上面的類定義添加的WebKit框架工作

 var webView: WKWebView! 

func loadWebViewWithCustomJavaScript { 
    //Create Preferences 
    let preferences = WKPreferences() 
    preferences.javaScriptEnabled = true 
    //Initialise javascript file with user content controller and configuration 
    let configuration = WKWebViewConfiguration() 
    let scriptURL = NSBundle.mainBundle().pathForResource("Your File Name", ofType: "js") 
    var scriptContent = "" 
    do { 
     scriptContent = try String(contentsOfFile: scriptURL!, encoding: NSUTF8StringEncoding) 
    } catch{ 
    print("Cannot Load File") 
    } 
    let script = WKUserScript(source: scriptContent, injectionTime: .AtDocumentStart, forMainFrameOnly: true) 
    configuration.userContentController.addUserScript(script) 
    configuration.preferences = preferences 
    //Create WebView instance 
    webView = WKWebView(frame: CGRectMake(0,0, self.view.frame.size.width, self.view.frame.size.height), configuration: configuration) 
    view.addSubview(webView) 
    //Finally load the url 
    let url = NSURL(string:"your URL") 
    let urlRequest = NSURLRequest(URL: url!) 
    webView.loadRequest(urlRequest) 
    } 

示例JavaScript代碼注入

//Hides name of "background1" element on the page 
var styleTag = document.createElement("style"); 
styleTag.textContent = 'div#background1, .after-post.widget-area  {display:none;}'; 
document.documentElement.appendChild(styleTag); 
1

得到它的工作使用以下。使用String而不是NSString來使用native swift 2.要注入的Javascript代碼必須位於hidesections.js文件中

let jsPath = NSBundle.mainBundle().pathForResource("hidesections", ofType: "js"); 
    let jsContent: String? 
    do 
    { 
     jsContent = try String(contentsOfFile: jsPath!, encoding: NSUTF8StringEncoding) 
    } 
    catch _ 
    { 
     jsContent = nil 
    } 
    webView.stringByEvaluatingJavaScriptFromString(jsContent!)