2014-11-03 52 views
2

當觸摸在webview外部結束時,「onTouchEnd」不會觸發。 編譯了XCode 6,IOS 8,iPhone 6IOS - 沒有全屏webview的「touchend」事件

我有一個佈局:

|Navigation TAB| 
|Left view|Web view|Right view| 
|page view| 

我可以接收所有觸摸事件,觸摸開始和結束時,在Web視圖。 但是,如果我在webview中開始觸摸,然後將觸摸移動到其外面,那麼只要我離開webview邊界,就會停止接收touchmove事件,並且不會收到觸發事件。

代碼FOT測試HTML文件:

「的viewDidLoad」 功能

[super viewDidLoad]; 
// Do any additional setup after loading the view, typically from a nib. 

self.webView = [[UIWebView alloc] initWithFrame:self.mainView.bounds]; 

[self.webView setScalesPageToFit:YES]; 
[self.webView setAlpha:1]; 

/* Disable scrolling of web view */ 
for (id subview in [self.webView subviews]) { 
    if ([subview isKindOfClass:[UIScrollView class]]) { 
     ((UIScrollView*)subview).bounces = NO; 
    } 
} 

self.webView.scrollView.bounces = NO; 
self.webView.scrollView.canCancelContentTouches = NO; 
self.webView.scrollView.scrollEnabled = NO; 

self.webView.backgroundColor = [UIColor magentaColor]; //[UIColor colorWithRed:(45.0/255.0) green:(50.0/255.0) blue:(53.0/255.0) alpha:1]; 
self.webView.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin| UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth; 
[self.mainView addSubview:self.webView]; 


NSString * localHtmlFilePath = [[NSBundle mainBundle] pathForResource:@"main" ofType:@"html" inDirectory:@"www"]; 
NSString *html = [NSString stringWithContentsOfFile:localHtmlFilePath encoding:NSUTF8StringEncoding error:nil]; 



[self.webView loadHTMLString:html baseURL:nil]; 

<head> 
    </head> 
    <body bgcolor="#CC6" 
     ontouchmove="console.info('move');" 
     ontouchstart="console.info('start');" 
     ontouchend="console.info('end');" 
     ontouchcancelled="console.info('canceled');" 
    > 
    <h1>This is a test</h1> 
    <p> Lore ip sum </p> 
    </body> 

代碼這可怎麼固定?是否有一些我錯過的配置?

完整的源代碼可以在這裏找到:https://github.com/Daraku/WebViewBug

回答

2

我一直strugling與同過去30分鐘,最後我已經決定要實施這是越來越每touchmove恢復超時,並開始對touchstart ,並在touchend被清除。超時是讓1500ms可以說,如果我沒有得到touchend從webview中發射,因爲它應該,我超時結束時,它會觸發它。

希望我提出了一個觀點。它不完美,但作爲部分修復。在我的情況下爲iScroll hackaround(_execEvent('scrollCancel'))

+1

的setTimeout - 黑客,是我最終使用了(雖然我使用更小的時間值)。看起來,有沒有適當的解決方案:( – 2016-04-18 18:16:38

0

我有一個類似的問題,我在本地應用程序中嵌入了一個webview。本地應用程序的標題爲60像素,低於它位於網頁視圖。

從webview向上滑動並釋放指頭時,'touchend'事件不會傳播到web視圖。

我發現'touchmove'事件上的Y座標在離開webview的時候是負的,所以我通過聽它並以編程方式觸發touchend事件來利用這個事實。像老闆一樣工作!

document.addEventListener("touchmove", function(e) { 
if (e.changedTouches[0].pageY < 0) { 
    e.preventDefault(); 
    document.dispatchEvent(new Event('touchend')); 
} 

},false);

下面是相同的代碼的要點:https://gist.github.com/EddyVerbruggen/70b96fce47fa7bf7a34f03e3a2ecb85f

+0

不幸的是,我需要抓住它時,手指離開物理屏幕,而不是WebView區域。 – 2016-06-01 17:42:44