1. 程式人生 > >IOS由於Fastclick導致contentEditable無法聚焦

IOS由於Fastclick導致contentEditable無法聚焦

1. 問題描述

在IOS瀏覽器,用div模擬textarea實現可換行的編輯輸入文字,在Vue條件下加入了fastclick防重點選,fastclick判斷ontouchstart條件看是否是移動端,若是移動端則進行相應的事件繫結,移動端點選觸發的順序ontouchstart => ontouchend => click,由於在ios條件下ontouchend方法若needsClick(button、select、textarea、input、label、iframe、video or className contains 'needsclick')為不可點選時防止了事件冒泡(preventDefault),所以出現無法點選情況。

2. 解決問題方

新增可編輯類needsclick,使div可編輯狀態,去掉fastclick防止冒泡,如下

<style>

.needsclick{content: attr(placeholder);color: #B8B8B8;}

</style>

<div contentEditable="true" class="needsclick" placeholder="請輸入詳細地址"></div>

3. fastclick部分原始碼分析具體不能編輯原因

首先,我們要了解事件的分發過程,ontouchstart => ontouchend => click,針對於這點,我們可知道要是ontouchend阻塞了,會導致無法聚焦,最終div無法編譯,下面是fastclick的可編輯的部分判斷原始碼:

FastClick.prototype.needsClick = function(target) {

switch (target.nodeName.toLowerCase()) {
        // Don't send a synthetic click to disabled inputs (issue #62)
        case 'button':
        case 'select':
        case 'textarea':
            if (target.disabled) {
                return true;
            }
            break;
        case 'input':
            // File inputs need real clicks on iOS 6 due to a browser bug (issue #68)
            if ((deviceIsIOS && target.type === 'file') || target.disabled) {
                return true;
            }
            break;
        case 'label':
        case 'iframe': // iOS8 homescreen apps can prevent events bubbling into frames
        case 'video':
            return true;
        return (/\bneedsclick\b/).test(target.className); // 正則表達,className具有needsclick即可編輯
    };

再者看ontouchend方法

 if (!this.needsClick(targetElement)) {

      event.preventDefault();

      this.sendClick(targetElement, event);

  }

即若不新增needsclick則會執行preventDefault防止向上冒泡

對於android為什麼就不會出現無法輸入的情況呢?由於android手機webview沒有觸發ontouchend事件

若有錯誤,或更多問題,請多多指教,謝謝