2015-12-14 17 views
12

Tôi có một trang trình bày bằng cách sử dụng javascript vanilla để sử dụng trên điện thoại, nhưng cho đến nay tất cả các thử nghiệm của tôi đã dẫn đến trình duyệt di động bỏ qua lần nhấn đầu tiên (đã thử cả hai touchstart & nhấp vào dưới dạng sự kiện) . Bắt đầu với lần nhấn thứ hai, nó hoạt động tốt đẹp với mỗi lần chạm tiếp theo.Vanilla javascript bỏ qua tab đầu tiên/nhấp vào

Khi mở & đóng menu là chức năng javascript duy nhất trên các trang, tôi không muốn tải một thư viện lớn, tôi muốn giữ cho nó đơn giản và nhỏ. Mã của tôi bên dưới:

var b = document.getElementById('menubtn'); 
b.addEventListener('touchstart', function (e) { 
    var n = document.getElementById('nav'); 
    var ns = n.style.left; 
    if (ns == "-600px") { 
     n.style.left = "0px"; 
    } else { 
     n.style.left = "-600px"; 
    } 
    e.preventDefault(); 
}); 

Bất kỳ cách nào để dễ dàng loại bỏ nhu cầu này để nhấp đúp lần đầu tiên?

Trong thư mục fwiw, đây là thiết kế đáp ứng, với menu điều hướng trong cột trên màn hình lớn và một trang chiếu trên điện thoại.


Edit: Giải quyết được vấn đề

Tiếp theo qua Matt Styles bình luận, tôi đã cố gắng sử dụng classList.toggle và nó giải quyết vấn đề này. Phiên bản cuối cùng là dưới đây:

var b = document.getElementById('menubtn'); 
var n = document.getElementById('nav'); 
b.addEventListener('touchstart', function() { 
    n.classList.toggle('shwmenu'); 
    setTimeout(function() { 
     b.classList.toggle('shwmenu'); 
    }, 500); 
}); 

Tôi đã thêm mã menubtn bị trì hoãn để chuyển đổi giữa các trạng thái đóng và mở.

+1

Điều này không trực tiếp trả lời câu hỏi của bạn vì vậy tôi sẽ để lại nhận xét đó, nhưng tại sao bạn không sử dụng 'touchstart' để bật/tắt lớp học? [thành phần.classlist.toggle] (http://caniuse.com/#feat=classlist) có hỗ trợ gần như phổ biến cho các thiết bị cảm ứng, mặc dù nếu nó đáp ứng với công việc trên máy tính để bàn, thì sự kiện nhấp chuột có thể an toàn hơn và được hiểu ở mọi nơi trong mã của bạn sẽ chạy. Ngoài ra, phần tử điều hướng của bạn sẽ nằm ngoài phạm vi đóng của bạn, theo cách đó bạn không truy vấn DOM với từng sự kiện. –

+0

@MattStyles - Tôi đã thử classList.toggle và nó hoạt động như một nét duyên dáng. Cám ơn vì sự gợi ý – Tom

Trả lời

1

Các hành vi bạn mô tả có thể được gây ra bởi những điều sau đây:

Trong JS của bạn, bạn cố gắng để thực hiện một số loại-Off On Toggle cho các phần tử nav của bạn, phân biệt về giá trị tài sản left CSS, với -600 đại diện cho Giá trị off0 đại diện cho giá trị on.

Như bạn đã nói, việc chuyển đổi giữa các trạng thái đó dường như hoạt động tốt, nhưng điều gì xảy ra khi phần tử của bạn KHÔNG được khởi tạo chính xác trên -600? Sau đó, trên vòi đầu tiên của bạn, bạn sẽ luôn luôn chạy vào mệnh đề khác của bạn và đặt nó thành -600 đầu tiên, cho thấy hiệu quả không có hiệu ứng hình ảnh trên vòi đầu tiên của bạn, giống như bạn mô tả.

Đối với một bài kiểm tra ngay lập tức, chỉ cần trao đổi các mệnh đề else if-xung quanh để biến nó on khi style.left không phải là -600 và sau đó có thể làm việc lên tới một sự khác biệt năng động hơn giữa các quốc gia của bạn;)

0

Tôi nghĩ rằng đây là vì element.style.left bị trống ngay cả khi bạn đã đặt thuộc tính left trong biểu định kiểu của mình. Thay vào đó, bạn có thể sử dụng element.offsetLeft. Please see here to how it works.

HTMLElement.style - MDN

Thuộc tính phong cách không phải là hữu ích cho việc học tập về phong cách của phần tử nói chung, vì nó chỉ đại diện cho tờ khai CSS đặt trong thuộc tính inline style của phần tử, chứ không phải những người đến từ quy tắc phong cách khác , chẳng hạn như các quy tắc về kiểu trong phần <head> hoặc các tờ kiểu ngoài. Để có được các giá trị của tất cả các thuộc tính CSS cho một phần tử, bạn nên sử dụng window.getComputedStyle() để thay thế.

Các vấn đề liên quan