【问题标题】:how to intercept Button click inside UIWebview on IOS?如何在IOS上拦截UIWebview内的按钮点击?
【发布时间】:2012-06-15 01:55:37
【问题描述】:

我有一个 HTML 表单,其中包含我在 UIWebview 中打开的某些字段。单击特定按钮时,我想做一个应用内操作。

我现在使用的方法是单击按钮,将页面重定向到虚拟 URL。我使用委托方法“shouldStartLoadWithRequest”嗅探 URL 并停止重定向。然后我执行我的自定义事件(捕获图像并上传),然后继续。这似乎是一个丑陋的黑客。无论如何我可以直接挂钩按钮点击事件而不是页面重定向?

更新 似乎没有办法设置在单击按钮时调用 JS 函数时触发的委托方法。唯一的方法是使用上面提到的 URL 嗅探方法。这一点joern在下面已经详细解释过了,所以我会接受他的回答。

【问题讨论】:

    标签: javascript iphone ios uiwebview onclick


    【解决方案1】:

    您可以执行以下操作:

    在您的 HTML 中

    <a class="yourButton" href="inapp://capture">Button Text</a>
    

    在你的 UIWebViewDelegate 中

    - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
       if ([request.URL.scheme isEqualToString:@"inapp"]) {
          if ([request.URL.host isEqualToString:@"capture"]) {
             // do capture action
          }  
          return NO;
       }  
       return YES;
    }
    

    我在按钮的 URL 中添加了“捕获”,以便您可以区分应该触发不同操作的几个按钮(如果您愿意的话):

    【讨论】:

    • 是的,这是我已经在使用的方法。反正有没有通过代码向按钮添加一个动作?我想这可能由于沙盒而无法实现,但只是想确定一下。
    • 您能否澄清一下您所说的“行动”是什么意思?
    • 我的意思是如何向按钮单击添加一个函数(方法),以便按钮单击的回调转到此函数。可能吗?还是 URL 拦截是唯一的方法?
    • @JoeBlow 没问题 ;-) 您可以按上述方式拦截单击“提交”按钮,然后将 // do capture action 注释替换为对 HTML 中提交表单的 javascript 函数的调用。
    • 哦,是的,等等。在上面的示例中,在您捕获操作后,只需返回 YES 而不是 NO。然后表单将正常提交,就像什么都没发生一样。无需调用 javascript 函数。
    【解决方案2】:

    这段代码:

    <a class="yourButton" href="inapp://capture">Restart</a>
    

    对我不起作用。

    我在我的 javascript 代码中为事件函数添加了 "inapp://capture"

    KeyboardInputManager.prototype.restart = function (event) {
      window.location.href = "inapp://capture";
      //other code
    };
    

    我也使用 UIWebViewDelegate,它适用于 iOS 8、9。

    【讨论】:

      【解决方案3】:

      对于 Swift 4.2

      HTML 端的按钮代码:

      <a class="catch-iOS" href="inapp://home">Продолжить покупки</a>
      

      UIWebViewDelegate 方法:

      func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebView.NavigationType) -> Bool {
          if request.url?.scheme == "inapp" {
              if request.url?.host == "home" {
                  // do something
              }
          }
          return true
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-24
        • 1970-01-01
        • 2016-07-24
        相关资源
        最近更新 更多