在 UIWebView 中检测本机 select 小部件何时为 opened/closed
Detecting when native select widget is opened/closed in UIWebView
当用户单击 UIWebView
中的 select
框时,本机弹出窗口将显示在屏幕底部,其中包含可用选项。网页内容向上滚动以为弹出窗口腾出空间。
虽然 body.scrollTop
的值确实发生了变化,但似乎在发生此滚动时没有触发 DOM 事件。有什么方法可以检测弹出窗口何时打开,还是我们必须使用 setInterval
来轮询并观察 scrollTop
的变化?
我很惊讶滚动事件没有触发。 MDN has a list of events可以绑定的那个可能对你有帮助
我突然想到,您可以绑定到 select 上的 mouseup 和 input/change 事件,并在它们的回调中确定当用户与select。如果您有多个 select 需要跟踪,您可以将事件委托给正文以避免创建额外的侦听器。
轮询会起作用,但与在 select 本身上添加一些事件侦听器相比,它的效率要低得多,所以希望您能找到一个有效的事件。
希望对您有所帮助!
您可以通过使用 WebView 委托在 UIPicker 上设置侦听器来实现此目的。然后这个侦听器可以在您的 JS 中调用适当的函数:
class ViewController: UIViewController, UIWebViewDelegate {
@IBOutlet weak var webView: UIWebView!
...
// UIWebViewDelegate protocol for WebView load
func webViewDidFinishLoad(webView: UIWebView!) {
// Set observer for keyboard load event
NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillShow:", name: UIKeyboardWillShowNotification, object: nil)
}
func keyboardWillShow(sender: NSNotification){
// Call JavaScript function in the WebView
webView.stringByEvaluatingJavaScriptFromString("yourJSFunction()")
}
}
当用户单击 UIWebView
中的 select
框时,本机弹出窗口将显示在屏幕底部,其中包含可用选项。网页内容向上滚动以为弹出窗口腾出空间。
虽然 body.scrollTop
的值确实发生了变化,但似乎在发生此滚动时没有触发 DOM 事件。有什么方法可以检测弹出窗口何时打开,还是我们必须使用 setInterval
来轮询并观察 scrollTop
的变化?
我很惊讶滚动事件没有触发。 MDN has a list of events可以绑定的那个可能对你有帮助
我突然想到,您可以绑定到 select 上的 mouseup 和 input/change 事件,并在它们的回调中确定当用户与select。如果您有多个 select 需要跟踪,您可以将事件委托给正文以避免创建额外的侦听器。
轮询会起作用,但与在 select 本身上添加一些事件侦听器相比,它的效率要低得多,所以希望您能找到一个有效的事件。
希望对您有所帮助!
您可以通过使用 WebView 委托在 UIPicker 上设置侦听器来实现此目的。然后这个侦听器可以在您的 JS 中调用适当的函数:
class ViewController: UIViewController, UIWebViewDelegate {
@IBOutlet weak var webView: UIWebView!
...
// UIWebViewDelegate protocol for WebView load
func webViewDidFinishLoad(webView: UIWebView!) {
// Set observer for keyboard load event
NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillShow:", name: UIKeyboardWillShowNotification, object: nil)
}
func keyboardWillShow(sender: NSNotification){
// Call JavaScript function in the WebView
webView.stringByEvaluatingJavaScriptFromString("yourJSFunction()")
}
}