javascriptandroidmobile-safariiphoneiscroll4

iScroll 4 not working with form <select> element iPhone Safari and Android browser


I'm using this HTML code:

<form action="#" method="post">
    <fieldset>
        <label class="desc" id="title10" for="Field10">
            How many children do you have?
        </label>        
        <select id="Field10" name="Field10" class="field select large" tabindex="5">
            <option value="0" selected="selected">0 </option>
            <option value="1">1 </option>
            <option value="2">2 </option>
            <option value="3">3 </option>
            <option value="4">4 </option>
            <option value="5">5 </option>
            <option value="6">6 </option>
            <option value="7">7 </option>
            <option value="8">8 </option>
            <option value="9">9 </option>
        </select>
        <input type="submit" value="Send message" />
    </fieldset>
</form>

<select> is not working on iPhone and Android. When I tap on the selectbox nothing happens.

I'm using iScroll 4 which is creating the problem.

<script type="application/javascript" src="iscroll-lite.js"></script>
<script type="text/javascript">
    var myScroll;
    function loaded() {
        myScroll = new iScroll('wrapper');
    }
    document.addEventListener('touchmove', function (e) { e.preventDefault(); }, false);
    document.addEventListener('DOMContentLoaded', loaded, false);
</script>

I think this is a solution but I don't know how to implement it.


Solution

  • The problem is that iScroll cancels the default behavior of your select tag (Not a very good implementation if you ask me).

    This occurs in the _start() function on line 195:

    e.preventDefault();
    

    If you comment that out you'll notice the select tag works again.

    But commenting it out means you've hacked the library which might break other desirable iScroll functionality. So here's a better workaround:

    var selectField = document.getElementById('Field10');
    selectField.addEventListener('touchstart' /*'mousedown'*/, function(e) {
        e.stopPropagation();
    }, false);
    

    That code will allow the default behavior to occur, without propagating the event to iScroll where it screws everything up.

    Since your JS is not inside any jQuery-like onReady() event, you'll have to make sure to you put this code AFTER the HTML where your select elements are defined.

    Note that for mobile devices the event is touchstart, but for your PC browser it will be mousedown