2014-10-26 20 views
5

Ho creato un browser Web iOS con codice lingua rapido. E aggiungere un ulteriore pulsante per iniettare uno script su quella pagina web, ma in crash sempre quando provo questo:Iniettare un codice JavaScript in Webview iOS

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

Qualsiasi idea di come risolvere questo problema? E come leggere il codice JavaScript da un file e quindi inserirlo in quell'elemento webview.

io uso lo stile codice come questo esempio, ma con WKWebView: https://github.com/rshankras/WebViewDemo

Se si riesce a risolvere questo problema ho bisogno di un codice di lavoro di base nella risposta. E la soluzione per come caricare il codice JavaScript da un file. E iniettare quel codice nell'elemento WKWebView.

+0

Potete fornire alcune informazioni circa l'incidente che avete? – delannoyk

+0

"Thread 1: signal SIGABRT" – user1731468

+0

Stai usando 'WKWebView' o' UIWebView'? – mustafa

risposta

2

Non vedo il metodo che si sta utilizzando (evaluateJavaScript) nell'attuale UIWebView API docs ma è nello WKWebView docs. Forse stai usando l'API sbagliata? Forse provare a utilizzare stringByEvaluatingJavaScriptFromString(_:) invece:

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

Inoltre, non sono sicuro se il "!" è necessario (l'intuizione mi dice che non lo è), in quanto non esiste un contesto attorno al tuo codice. Quindi forse prova entrambe le versioni.

Ottenere una stringa da un file è qualcosa di simile:

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

Caricamento da disco ha un sacco di variabili intorno a come il tuo file sia copiato e conservato così la vostra intenzione di avere a che fare un certo lavoro per adattarsi al path variabile per la tua struttura.

+0

Ancora errore, puoi fornirmi un esempio di codice di base – user1731468

+0

ho appena aggiunto un esempio di codice alla risposta – mattr

+0

Io uso WKWebview e mi danno questo errore: 'WKWebView' non ha un membro chiamato 'stringByEvaluatingJavaScriptFromString' – user1731468

0

Se si utilizza WKWebView, ecco una soluzione.

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

Quando faccio clic sul pulsante (con questo codice). Tutto è sparito, non vedo elementi della vista web, solo una pagina bianca con una lunga barra di scorrimento. – user1731468

+0

ancora niente visibile qui. – user1731468

2

Questo funzionerà con WKWebView. Non dimenticate di aggiungere lavoro della struttura WebKit in alto sulla vostra definizione della classe

 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) 
    } 

Esempio codice JavaScript per l'iniezione

//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

capito di lavoro utilizzando seguito. String utilizzato al posto di NSString utilizzare nativo rapida 2. codice Javascript per iniettare deve essere in hidesections.js il file

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!) 
Problemi correlati