Khám phá
Trả lời
Hỏi
Đăng nhập

Sự kiện touchend không hoạt động trên Android

Tôi đang bắt đầu lập trình web mobile cơ bản trên android và đang viết một test script để kiểm tra sự kiện touch. Tôi đã cho chạy code dưới đây trong giả lập android, và sự kiện touchend không bao giờ được kích hoạt. Có ai có thể giải thích cho tôi được không?

Tôi đã thử qua 3 phiên bản giả lập (1.6, 2.1 và 2.2) và cả 3 đều hoạt động y chang nhau.

Tôi muốn cám ơn trước với bất kỳ ai có thể giúp tôi về việc này.

Thân ái, Colm

EDIT - Tôi cũng đã thử dùng framework XUI và cũng mắc phải cùng vấn đề nên tôi đoán chắc mình đã hiểu sai cơ bản về cách mà mọi thứ hoạt động......

Map Test

    <meta name="description" content="" />
    <meta name="keywords" content="" />
    <meta name="language" content="english" />

    <meta name="viewport" content="minimum-scale=1.0,
                                   width=device-width,
                                   height=device-height,
                                   user-scalable=no">
    <script type="text/javascript">
        window.onload = function(){
            document.body.appendChild(
                    document.createTextNode("w: " + screen.width + " x " + "h : " +screen.height)
            );
           attachTouchEvents();
        }
        function attachTouchEvents() {
            console = document.getElementById("console");
            var map = document.getElementById("map");
            map.addEventListener ('touchstart', function (event) {
                event.preventDefault();
                var touch = event.touches[0];
                document.getElementById("touchCoord").innerHTML = "S : " + touch.pageX + " " + touch.pageY;
                document.getElementById("touchEvent").innerHTML = "Touch Start";
            }, false);

            map.addEventListener ('touchmove', function (event) {
                event.preventDefault();
                var touch = event.touches[0];
                document.getElementById("touchCoord").innerHTML = "M : " + touch.pageX + " " + touch.pageY;
                document.getElementById("touchEvent").innerHTML = "Touch Move";
            }, false);

            map.addEventListener ('touchend', function (event) {
                var touch = event.touches[0];
                document.getElementById("touchCoord").innerHTML = "E : " + touch.pageX + " " + touch.pageY;
                document.getElementById("touchEvent").innerHTML = "Touch End";
                event.preventDefault();
            }, false);
            console.innerHTML = "event attached";
        }
    </script>
    <style type="text/css">
        html, body {
            height:100%;
            width:100%;
            margin: 0;
            background-color:red;
        }
        #map {
            height: 300px;
            width: 300px;
            background-color:yellow;
        }
    </style>
</head>

<body>
    <div id="map"></div>
    <div id="touchCoord">Touch Coords</div>
    <div id="touchEvent">Touch Evnt</div>
    <div id="console">Console</div>

</body>

 

  1. Bạn sẽ nhìn thấy những mũi tên trong mỗi trang câu hỏi. Chúng cho phép bạn bỏ phiếu thuận / bỏ phiếu chống theo sự liên quan của các câu hỏi / trả lời.
  2. Chỉnh sửa câu hỏi của bạn / câu trả lời nếu bạn muốn thay đổi hoặc cập nhật nó.
  3. Nếu bạn không hiểu điều gì đó về câu hỏi, để lại nhận xét hỏi. Những vùng cho câu trả lời chỉ được sử dụng cho câu trả lời.
  4. Nếu tác giả của một câu hỏi đánh dấu một câu trả lời như giải pháp, nhãn hiệu này sẽ được hiển thị.
  5. Nhấn vào đây để xem thêm chi tiết về những hoạt động của hệ thống!

1 trả lời

  • Với những ai đang cố tìm ra lý do tại sao sự kiện touchend lại bị thiếu trong Android v3 và v4 (có thể còn có v2.3), đó là vì có một lỗi lớn chưa thể giải quyết được mà chỉ mới được sửa lại trong v4.1 (hình như thế): 

     

    http://code.google.com/p/android/issues/detail?id=4549

    http://code.google.com/p/android/issues/detail?id=19827

     

    Để khắc phục lỗi này, bạn cần phải gọi 'preventDefault()' trên sự kiện touchstart hoặc sự kiện touchmove đầu tiên. Tất nhiên là điều này sẽ chặn lại native scrolling, nên bạn sẽ cần phải tự mình thực thi lại native scrolling đấy.

Không phải là câu trả lời bạn đang tìm kiếm? Tìm kiếm câu hỏi khác với các thẻ javascript android events touch hoặc hỏi câu hỏi mới.