H5移動端遇到問題整理

動態查詢賦值 poppicker 下拉框

// 可以把這個方法放到Ajax查詢的回調方法中
function fnInitPickerServiceype(json){
    var arr = [];
    var jsonObjs = json.objs;
    if(json != null && json.objs != null && json.objs.length > 0) {
        $.each(jsonObjs, function(i, obj) {
            var value = jsonObjs[i].id;
            var name  = jsonObjs[i].name;
            arr.push({value:value,text:name});
        });
    }
    mui.init();
    mui.ready(function() {
        var serviceypePicker = new mui.PopPicker();
        serviceypePicker.setData(arr);
        var serviceypeButton = document.getElementById('serviceClassifyIdDiv');
        var serviceypeResult = document.getElementById('serviceClassifyId');
        serviceypeButton.addEventListener('tap', function(event) {
            serviceypePicker.show(function(items) {
                serviceypeResult.value = items[0].text; //如果是input框
                serviceypeResult.innerText = items[0].text; //如果是div框
            });
        }, false);		
    });
}

 

 

解決poppicker 和上拉加載衝突

var picker = new mui.PopPicker({
	buttons: ['取消', '確認']
})
picker.setData(carList);

var select = document.getElementById('selectCity');
select.addEventListener('tap', function(event) {
    mui('#refreshList').pullRefresh().disablePullupToRefresh();  //禁用上拉加載
    picker.show(function(item) {
        document.getElementById('selectCity').value = item[0].text;
	})

},false);

var html = document.querySelector('html');
html.addEventListener('tap', function(event) {
    mui('#refreshList').pullRefresh().enablePullupToRefresh(); //啓用上拉加載
    mui('#refreshList').pullRefresh().refresh(true);
},true);

這是通過addEventListener()方法實現的,如果這個函數的最後一個參數是true,則在捕獲階段綁定函數(從外到裏),反之false,在冒泡階段綁定函數(從裏到外)。

 

禁用重啓滾動條

$('.mui-content').css({'overflow-y':'hidden','height':'100vh'}); //暫時禁用滾動條
$('.mui-content').css({'overflow-y':'auto','height':'auto'}); //重新開啓滾動條

 

模擬上滑取消錄音

var startY; // 起點座標
var Y;  // 手指滑動距離
$("body").on("touchstart", function(e) {
    startY = e.originalEvent.changedTouches[0].pageY; 
});  
$("body").on("touchmove", function(e) {  
    var moveEndY = e.originalEvent.changedTouches[0].pageY;  // 終點座標
    Y = moveEndY - startY;   //計算手指滑動距離
});  
if(Y < -20) { //上滑一定距離代表是上滑則取消事件的執行
    return;
} 

 

彈出框禁止遮罩層移動

document.addEventListener('touchmove', function (event) {    //監聽滾動事件
    event.preventDefault(); //阻止默認的處理方式(阻止下拉滑動的效果)
},{passive:false});  //不能省略,爲了兼容IOS

 

打開頁面默認彈出軟鍵盤,同時兼容iOS和Android

注:input不需要添加autofocus屬性。 

function open_soft_keyboard(){  
    if(plus.os.name == 'iOS'){  
        setTimeout(function(){  
            var wv_current = plus.webview.currentWebview().nativeInstanceObject();  
            wv_current.plusCallMethod({"setKeyboardDisplayRequiresUserAction":false});  
            document.querySelector('input');  //光標自動定位到頁面第一個input框
        }, 330);  
    }else{  
        // 因爲安卓autofocus只有4.0版本以上才支持,所以這裏使用native.js來強制彈出  
        setTimeout(function(){  
            // 在執行的時候需要讓當前webview獲取焦點  
            var wv_current = plus.android.currentWebview();  
            plus.android.importClass(wv_current);  
            wv_current.requestFocus();  

            var Context = plus.android.importClass("android.content.Context");  
            var InputMethodManager = plus.android.importClass("android.view.inputmethod.InputMethodManager");  
            var main = plus.android.runtimeMainActivity();  
            var imm = main.getSystemService(Context.INPUT_METHOD_SERVICE);  
            imm.toggleSoftInput(0,InputMethodManager.SHOW_FORCED);  
            document.querySelector('input');  //光標自動定位到頁面第一個input框
        }, 330);  
    }  
}

 

監聽手機軟鍵盤彈出收起

軟鍵盤彈起和收起在 IOS 和 Android 上的表現不盡相同。

IOS 軟鍵盤彈起表現

在 IOS 上,輸入框( input、 textarea 或 富文本)獲取焦點,鍵盤彈起,頁面( webview)並沒有被壓縮,或者說高度( height)沒有改變,只是頁面( webview)整體往上滾了,且最大滾動高度( scrollTop)爲軟鍵盤高度。

 

Android 軟鍵盤彈起表現

同樣,在 Android 上,輸入框獲取焦點,鍵盤彈起,但是頁面( webview)高度會發生改變,一般來說,高度爲可視區高度(原高度減去軟鍵盤高度),除了因爲頁面內容被撐開可以產生滾動, webview 本身不能滾動。輸入框失去焦點時,軟鍵盤收起,輸入框並不會失去焦點。

 

監聽軟鍵盤彈起和收起

Android

//獲取原窗口的高度
$(window).resize(function(){
    //鍵盤彈起與隱藏都會引起窗口的高度發生變化
    if($(window).height() == MAX_HEIGHT){
        //當軟鍵盤彈起,在此處操作
    }else{
        //當軟鍵盤收起,在此處操作
    }
}

IOS

window.addEventListener("focusin", function(event) {
    alert("IOS彈出鍵盤")
})	
window.addEventListener("focusout", function(event) {
    alert("IOS收起鍵盤")
})	

focusin和focusout支持冒泡,對應focus和blur, 使用focusin和focusout的原因是focusin和focusout可以冒泡,focus和blur不會冒泡,這樣就可以使用事件代理,處理多個輸入框存在的情況。

 

ios系統上input輸入框無法輸入值

只要在input 元素或者父元素上面加上css樣式 -webkit-user-select: text 就可以了。

<input style="-webkit-user-select: text;"/>

 

在IOS系統中輸入光標過大的問題

① 在textarea中換行,第二行的光標會變大

line-height是行間距,在你只有一行字的時候,沒有行間距,所以在只有一行的時候,第一行不高,有了第二行的時候就高了。

所以這種情況添加 line-height 屬性就行了。 

<textarea style="line-height: 15px;" maxlength="100" rows="7"></textarea>

② input框的光標過大

問題也是同上面一樣,設置一個合理的line-height值就可解決問題。

 

兩個輸入框之間切換時抖動

    其實2個輸入框切換時 抖動的原因也很簡單。例如我們在兩個輸入框之間切換,頁面會首先觸發 A 輸入框 的 blur 事件,接着觸發 B 輸入框 的 focus 事件。

    這樣的話,在 blur 時會觸發我們的 window.scrollTo(0,0) 導致頁面往下滾一下,接着 B 輸入框 聚焦,於是鍵盤繼續彈起,這導致頁面再次向上移動。

    其實,在兩個輸入框之間切換這種操作時,我們就沒必要觸發第一個輸入框 blur 時的 window.scrollTo 行爲了。 
    因此看我們修改下我們的代碼,讓輸入框切換這種操作發生時,可以切斷第一個輸入框的行爲。這裏我們用 setTimeout 來解決:

function inputBlur(e) {
    // 首先,判斷觸發事件的目標元素是否是input輸入框,我們只關注輸入框的行爲。
    if (e && e.target && e.target.tagName && e.target.tagName.toLowerCase() === 'input') {
        // 輸入框失去焦點,要把IOS鍵盤推出頁面的滾動部分還原。即將頁面滾動到視窗頂部對齊
        this.timer = setTimeout(() => {
            console.log('timer觸發')
            }, 0)
        }
    },
    
function inputFocus(e) {
    // 如果focus,則移除上一個輸入框的timer
    if (e && e.target && e.target.tagName && e.target.tagName.toLowerCase() === 'input') {
        clearTimeout(this.timer);
        }
    }

 

在ios裏面,當一個文本框的樣式爲fixed時候,如果這個文本框獲得焦點,它的位置就會亂掉,由於ios裏面做了自適應居中,這個fixed的文本框會跑到頁面中間。


 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章