2013-12-02 3 views
4

Как добавить слушателей к событиям DOM в UIWebView? Например, для следующего HTML:IOS UIWebView: как добавить слушателей к событиям DOM?

<button type="button" id="button1">Try it</button> 

Можно ли зарегистрировать слушатель для щелчка кнопки события в приложении IOS, который загружает HTML в UIWebView?

ответ

7

Да, вы можете сделать это с помощью разработанных методов url и UIWebViewDelegate.

Во-первых, чтобы добавить слушателя событий на кнопку теге, вы должны выполнить JavaScript, как показано ниже (после загрузки страницы)

// In the UIWebViewDelegate 
- (void)webViewDidFinishLoad:(UIWebView *)webView { 
    if (/* when the loaded url is the target */) { 
     NSString *js = @"document.getElementById('button').click = function() { window.location = 'my-protocol://dummmy.com/maybe/some/data';}"; 
     [webView stringByEvaluatingJavaScriptFromString: js]; 
    } 
} 

Мы связать события нажатия на кнопку, и, когда она нажата, она будет вызвать запрос в webView.

И следующее, что мы должны сделать, это перехватить запрос и сделать то, что вы хотите в ObjC.

// In the UIWebViewDelegate 
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { 
    if (/* when the url of the request is the crafted url */) { 
     // call your objc method... 
    } 
} 
+0

Отличное объяснение, спасибо! И BTW, что такое «window.location»? Похож на корень DOM, не так ли? Могу ли я напрямую манипулировать DOM с помощью «window.location»? –

+0

вы можете напрямую манипулировать DOM с помощью переменной «js», переданной в метод «stringByEvaluatingJavaScriptFromString». Например, удалите содержимое страницы: «document.write (''); –

0

Вот Swift способ перехвата при нажатии на ссылку в UIWebView:

Получить себе делегат:

class ViewController: UIViewController, UIWebViewDelegate { //... } 

и назначить его:

override func viewDidLoad() { 
     super.viewDidLoad() 

     webView.delegate = self 

     //... 
} 

Теперь мы можем использовать его для перехвата:

func webViewDidFinishLoad(_ webView: UIWebView) { 
      if (currentURL?.lowercased().range(of:"some/url") != nil) { 
       webView.stringByEvaluatingJavaScript(from: "document.getElementsByTagName('a')[0].onclick = function() {window.location = 'injected://loadPDF1'; return false;}") 
      } 
    } 

    // Sent before a web view begins loading a frame. 
    func webView(_: UIWebView, shouldStartLoadWith: URLRequest, navigationType: UIWebViewNavigationType) -> Bool{ 
     // intercept all injected page calls 
     if (shouldStartLoadWith.url?.scheme == "injected") { 
      return false; 
     } 
     return true; 
    } 
Смежные вопросы