2017-04-25 18 views
10

मैं क्यों मेरे सवाल this one की डुप्लीकेट के रूप में चिह्नित किया गया है, पहले मैं जावास्क्रिप्ट कोड evaluateJavaScript साथ सवाल शीर्षक से पता चलता है जो यह है कि quesiton से जाहिरा तौर पर अलग है के रूप में निष्पादित नहीं में काम नहीं कर। मैंने और क्या देखा है कि मैंने अपने प्रश्न निकाय के अंत में बिना किसी सफलता के उस प्रश्न में उत्तर देने का प्रयास किया है।चेतावनी() WKWebview evaluateJavaScript()

मैं स्विफ्ट 3 के wkwebview में जावास्क्रिप्ट निष्पादित करने के लिए wkwebview.evaluateJavaScript() funciton का उपयोग करता हूं। लेकिन alert() ने चेतावनी संवाद नहीं खोल दिया। और कोई त्रुटि नहीं है और समस्याएं दिखाती हैं। जबकि मैं पृष्ठ सामग्री को संशोधित करने के लिए जावास्क्रिप्ट कोड निष्पादित करने के लिए evaluateJavaScript() का उपयोग कर सकता हूं।

class WebViewController: UIViewController, WKScriptMessageHandler, WKNavigationDelegate, WKUIDelegate, UIScrollViewDelegate { 
    var wk:WKWebView! 
    self.wk.navigationDelegate = self 
    self.wk.uiDelegate = self 
    self.wk.scrollView.delegate = self 
    self.wk.customUserAgent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:53.0) Gecko/20100101 Firefox/53.0" 

    ... 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     ... 
     let config = WKWebViewConfiguration() 
     self.wk = WKWebView(frame: CGRect(x: frame.minX, y: frame.minY+20, width: frame.width, height: frame.height-70), configuration: config) 
     self.wk.navigationDelegate = self 
     ... 
    } 


    ... 
    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { 
     print("Finished navigation to url \(String(describing: webView.url))") 
     //self.wk.evaluateJavaScript("document.getElementById('test').innerHTML = 'sssssssssssssss';", completionHandler: nil)   //this works well 
     self.wk.evaluateJavaScript("alert('aaaaaaa');", completionHandler: nil)  //this not show the alert dialog 
    } 
    ... 
} 

मैं भी इस post और answer का उल्लेख करते हुए कहा कि सवाल evaluateJavaScript पर नहीं है। मैं अपने WebViewController के लिए WKUIDelegate जोड़ता हूं और self.wk.uiDelegate = self को अपने viewDidLoad() पर जोड़ता हूं, लेकिन कुछ भी नहीं बदलता है।

जोड़ा गया, console.log() के नीचे लॉग को कंसोल में डाल दिया गया, जबकि अलर्ट() संवाद को पॉप अप नहीं करता है। और UIAlertController भी काम करता है।

self.wk.evaluateJavaScript("alert('aa');console.log('1234');var rect = document.getElementById('liveMovie').getBoundingClientRect();[rect.left, rect.top];") { 
    (result, error) -> Void in 
    if((result) != nil) 
    { 
     self.player?.view?.frame.origin.x = (result as! Array)[0] 
     self.player?.view?.frame.origin.y = (result as! Array)[1] 
    } 
} 

let alertController = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet) 
alertController.addAction(UIAlertAction(title: "OK", style: .default, handler: { (action) in 
    if(true) 
    { 
    } 
})) 
+1

आप 'runJavaScriptAlertPanelWithMessage' प्रतिनिधि विधि का कोई जिक्र नहीं किया है। क्या वह कोड आपके प्रश्न में जोड़ सकता है? – Onato

+0

मैंने अपने कोड में उस विधि का उपयोग नहीं किया था। 'UIAlertController' मेरे कोड में काम कर सकता है, लेकिन 'मूल्यांकन जावास्क्रिप्ट' चेतावनी नहीं दे सकता()' –

+1

यही कारण है कि यह तब काम नहीं करता है। जब जावास्क्रिप्ट आग और 'चेतावनी()' इस विधि को बुलाया जाता है। इस विधि में यह तय करने के लिए कि आप इसके बारे में क्या करना है, यह आपके ऊपर है। नीचे दिए गए उत्तर में उदाहरण देखें। – Onato

उत्तर

4

this answer में एक कामकाजी उदाहरण है। ऐसा लगता है कि आपने WKUIDelegate विधि को सही ढंग से लागू नहीं किया हो सकता है।

1

यह मेरी गलती है। मुझे WKWebview के साथ अधिक अनुभव नहीं है। मैंने एंड्रॉइड के XWalkview के साथ अनुभव किया है, और वहां alert को जावा कोड के साथ alert लागू करने की आवश्यकता नहीं है। तो यहां मैंने यह भी सोचा कि मुझे alertdelegate को स्विफ्ट के साथ कार्यान्वित करने की आवश्यकता नहीं है।

answer of Onato से, मुझे पता चला है कि कैसे तेजी से alertprompt और confirm निष्पादित, मैं इन प्रतिनिधि के कार्यान्वयन खो दिया है। तो मैं this answer का संदर्भ देता हूं, कार्यान्वयन नीचे जोड़ें, सबकुछ काम करता है।

func webView(_ webView: WKWebView, runJavaScriptAlertPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, 
      completionHandler: @escaping() -> Void) { 

    let alertController = UIAlertController(title: nil, message: message, preferredStyle: .actionSheet) 
    alertController.addAction(UIAlertAction(title: "OK", style: .default, handler: { (action) in 
     completionHandler() 
    })) 

    present(alertController, animated: true, completion: nil) 
} 


func webView(_ webView: WKWebView, runJavaScriptConfirmPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, 
      completionHandler: @escaping (Bool) -> Void) { 

    let alertController = UIAlertController(title: nil, message: message, preferredStyle: .actionSheet) 

    alertController.addAction(UIAlertAction(title: "OK", style: .default, handler: { (action) in 
     completionHandler(true) 
    })) 

    alertController.addAction(UIAlertAction(title: "Cancel", style: .default, handler: { (action) in 
     completionHandler(false) 
    })) 

    present(alertController, animated: true, completion: nil) 
} 


func webView(_ webView: WKWebView, runJavaScriptTextInputPanelWithPrompt prompt: String, defaultText: String?, initiatedByFrame frame: WKFrameInfo, 
      completionHandler: @escaping (String?) -> Void) { 

    let alertController = UIAlertController(title: nil, message: prompt, preferredStyle: .actionSheet) 

    alertController.addTextField { (textField) in 
     textField.text = defaultText 
    } 

    alertController.addAction(UIAlertAction(title: "OK", style: .default, handler: { (action) in 
     if let text = alertController.textFields?.first?.text { 
      completionHandler(text) 
     } else { 
      completionHandler(defaultText) 
     } 
    })) 

    alertController.addAction(UIAlertAction(title: "Cancel", style: .default, handler: { (action) in 
     completionHandler(nil) 
    })) 

    present(alertController, animated: true, completion: nil) 
} 
3

आप सभी आवश्यक WKUIDelegate तरीकों लागू करने की आवश्यकता से पहले, अपने मामले में क्रियान्वित करना चाहिए:

 optional func webView(_ webView: WKWebView, 
     runJavaScriptAlertPanelWithMessage message: String, 
      initiatedByFrame frame: WKFrameInfo, 
      completionHandler: @escaping() -> Void) 
    { 
    // parameter **message** will hold your actual alert message. 

    // Write Your Customised code to display the alert message 

    } 
संबंधित मुद्दे