ตรวจพบว่าเบราว์เซอร์ไม่มีเมาส์และเป็นแบบสัมผัสเท่านั้น


149

ฉันกำลังพัฒนาเว็บแอพ (ไม่ใช่เว็บไซต์ที่มีหน้าข้อความที่น่าสนใจ) พร้อมอินเทอร์เฟซสำหรับการสัมผัสที่แตกต่างกันมาก (นิ้วของคุณซ่อนหน้าจอเมื่อคุณคลิก) และเมาส์ (อาศัยการแสดงตัวอย่างแบบโฮเวอร์มาก) ฉันจะตรวจสอบได้อย่างไรว่าผู้ใช้ของฉันไม่มีเมาส์ที่จะนำเสนออินเตอร์เฟซที่ถูกต้องกับเขา ฉันวางแผนที่จะออกจากสวิตช์สำหรับผู้ที่มีทั้งเมาส์และสัมผัส (เช่นสมุดบันทึกบางส่วน)

ความสามารถในการแตะเหตุการณ์ในเบราว์เซอร์ไม่ได้หมายความว่าผู้ใช้กำลังใช้อุปกรณ์สัมผัส (ตัวอย่างเช่น Modernizr ไม่ได้ตัด) รหัสที่ตอบคำถามอย่างถูกต้องควรกลับเท็จถ้าอุปกรณ์มีเม้าส์จริง สำหรับอุปกรณ์ที่มีเม้าส์และการสัมผัสมันควรจะกลับเท็จ (ไม่ได้สัมผัสเท่านั้น)

ในฐานะที่เป็นหมายเหตุด้านข้างอินเทอร์เฟซระบบสัมผัสของฉันอาจเหมาะสำหรับอุปกรณ์ที่มีคีย์บอร์ดเท่านั้นดังนั้นจึงไม่มีเมาส์ที่ฉันต้องการตรวจจับ

หากต้องการให้ชัดเจนยิ่งขึ้นนี่คือ API ที่ฉันต้องการใช้:

// Level 1


// The current answers provide a way to do that.
hasTouch();

// Returns true if a mouse is expected.
// Note: as explained by the OP, this is not !hasTouch()
// I don't think we have this in the answers already, that why I offer a bounty
hasMouse();

// Level 2 (I don't think it's possible, but maybe I'm wrong, so why not asking)

// callback is called when the result of "hasTouch()" changes.
listenHasTouchChanges(callback);

// callback is called when the result of "hasMouse()" changes.
listenHasMouseChanges(callback);


ฉันคิดว่าคุณต้องคิดใหม่เกี่ยวกับการออกแบบของคุณหากคุณต้องการให้แอพหนึ่งตัวสามารถใช้ได้กับทั้งเดสก์ท็อปและมือถือ / ระบบสัมผัส แต่มีพฤติกรรมที่แตกต่างกันสำหรับแต่ละแอป ฉันไม่คิดว่าสิ่งที่คุณตามมาจะเป็นไปได้จริง ณ จุดนี้เนื่องจากการค้นหาอย่างรวดเร็วใน Google สำหรับ "javascript detect mouse" แสดงโพสต์ที่มีประโยชน์พอสมควรหนึ่งใน quirksmode.org เพื่อตรวจหาสถานะต่างๆของเมาส์ (คลิกตำแหน่ง ฯลฯ ) แต่ผลลัพธ์เป็นศูนย์ว่ามีอยู่จริงหรือไม่
davethegr8

24
อาจเป็นเพราะ Google ไม่ได้ช่วยให้ฉันถามที่นี่
nraynaud

2
คุณเคยลองใช้ mouseenter จาก jquery หรือยัง? $ (เอกสาร) .mouseenter (function (e) {alert ("mouse");});
Parag Gajjar

4
หลังจากพิจารณาเส้นทางที่มีแนวโน้มเกือบโหลเพียงปฏิเสธที่จะให้แต่ละคนได้ภายในไม่กี่นาทีคำถามนี้ทำให้ฉันเป็นบ้า
Jordan Gray

คำตอบ:


65

ปัญหาหลักคือคุณมีประเภทของอุปกรณ์ / กรณีการใช้ที่แตกต่างกันดังต่อไปนี้:

  1. เมาส์และแป้นพิมพ์ (เดสก์ท็อป)
  2. สัมผัสเท่านั้น (โทรศัพท์ / แท็บเล็ต)
  3. เมาส์แป้นพิมพ์และแบบสัมผัส (แล็ปท็อปแบบสัมผัส)
  4. Touch and keyboard (แป้นพิมพ์บลูทู ธ บนแท็บเล็ต)
  5. เมาส์เท่านั้น (ปิดการใช้งานผู้ใช้ / การตั้งค่าการเรียกดู)
  6. แป้นพิมพ์เท่านั้น (ปิดการใช้งานผู้ใช้ / การตั้งค่าการเรียกดู)
  7. Touch and mouse (เช่นวางเมาส์เหนือเหตุการณ์จากปากกา Galaxy Note 2)

สิ่งที่แย่กว่านั้นคือหนึ่งสามารถเปลี่ยนจากคลาสเหล่านี้เป็นคลาสอื่น (ปลั๊กเมาส์เชื่อมต่อกับแป้นพิมพ์) หรือผู้ใช้อาจปรากฏบนแล็ปท็อปปกติจนกว่าจะถึงหน้าจอสัมผัส

คุณถูกต้องโดยสมมติว่าการมีตัวสร้างเหตุการณ์ในเบราว์เซอร์ไม่ใช่วิธีที่ดีในการก้าวไปข้างหน้า (และค่อนข้างไม่สอดคล้องกัน) นอกจากนี้หากคุณกำลังติดตามเหตุการณ์ที่เฉพาะเจาะจงมากหรือพยายามที่จะออกกฎบางคลาสข้างต้นการใช้เหตุการณ์เองนั้นไม่ได้เป็นข้อพิสูจน์อย่างสมบูรณ์

ตัวอย่างเช่นสมมติว่าคุณค้นพบว่าผู้ใช้ปล่อย mousemove จริง (ไม่ใช่ของปลอมจากกิจกรรมการสัมผัสดูที่http://www.html5rocks.com/en/mobile/touchandmouse/ )

แล้วไง?

คุณเปิดใช้งานสไตล์โฮเวอร์หรือไม่ คุณเพิ่มปุ่มเพิ่มเติมหรือไม่

ไม่ว่าคุณจะเพิ่มเวลาในการกระจกเพราะคุณต้องรอให้เหตุการณ์ลุกลาม

แต่แล้วจะเกิดอะไรขึ้นเมื่อผู้ใช้ชั้นสูงของคุณตัดสินใจที่จะถอดปลั๊กเมาส์และไปสัมผัสอย่างเต็มรูปแบบ .. คุณรอให้เขาสัมผัสส่วนต่อประสานของคุณแล้วเปลี่ยนมันทันทีหลังจากที่เขาพยายามระบุ UI ที่แออัดของคุณตอนนี้หรือไม่

ในรูปแบบสัญลักษณ์แสดงหัวข้อโควต้าที่https://github.com/Modernizr/Modernizr/issues/869#issuecomment-15264101

  • เราต้องการตรวจจับว่ามีเมาส์อยู่หรือไม่
  • อาจไม่สามารถตรวจพบก่อนที่เหตุการณ์จะเริ่มทำงาน
  • เช่นนี้สิ่งที่เรากำลังตรวจสอบคือถ้ามีการใช้เมาส์ในเซสชันนี้ - มันจะไม่เกิดขึ้นทันทีจากการโหลดหน้าเว็บ
  • เราอาจตรวจไม่พบว่าไม่มีเมาส์ - มันจะไม่ถูกกำหนดจนกว่าจะเป็นจริง (ฉันคิดว่ามันสมเหตุสมผลกว่าการตั้งค่าเป็นเท็จจนกว่าจะพิสูจน์แล้ว)
  • และเราอาจไม่สามารถตรวจพบได้ว่าเมาส์ถูกตัดการเชื่อมต่อช่วงกลาง - ซึ่งจะแยกไม่ออกจากผู้ใช้เพียงแค่เลิกใช้เมาส์

นอกเหนือจาก: เบราว์เซอร์ไม่ทราบว่าเมื่อผู้ใช้เสียบเมาส์ / เชื่อมต่อกับแป้นพิมพ์ แต่ไม่เปิดเผยกับ JavaScript .. แดง!

สิ่งนี้จะนำคุณไปสู่สิ่งต่อไปนี้:

การติดตามความสามารถในปัจจุบันของผู้ใช้ที่กำหนดนั้นซับซ้อนไม่น่าเชื่อถือและไม่ได้ผลบุญ

ความคิดของการเพิ่มประสิทธิภาพแบบก้าวหน้านั้นทำได้ค่อนข้างดีที่นี่ สร้างประสบการณ์ที่ทำงานได้อย่างราบรื่นไม่ว่าบริบทของผู้ใช้จะเป็นอย่างไร จากนั้นให้ตั้งสมมติฐานตามคุณลักษณะของเบราว์เซอร์ / ข้อความค้นหาสื่อเพื่อเพิ่มฟังก์ชันการทำงานที่จะสัมพันธ์ในบริบทที่สันนิษฐาน การปรากฏตัวของเมาส์เป็นเพียงหนึ่งในหลากหลายวิธีที่ผู้ใช้ที่แตกต่างกันในอุปกรณ์ต่าง ๆ ได้สัมผัสกับเว็บไซต์ของคุณ สร้างบางสิ่งด้วยบุญที่เคอร์เนลและไม่ต้องกังวลมากเกินไปเกี่ยวกับการคลิกปุ่ม


3
คำตอบที่ดี หวังว่าผู้ใช้จะมีหน้าจอเสมอ! ฉันคิดว่ามันสมเหตุสมผลที่จะสร้างอินเทอร์เฟซที่เหมาะกับโหมดการโต้ตอบปัจจุบันของผู้ใช้ บนแล็ปท็อปแบบสัมผัสมันเหมาะสมที่จะปรับแอพ (เช่น:hoverองค์ประกอบและสิ่งต่าง ๆ เช่นนั้น) เมื่อผู้ใช้สลับจากเมาส์เป็นแบบสัมผัส ดูเหมือนว่าไม่น่าเป็นไปได้ที่ผู้ใช้กำลังใช้เมาส์ + สัมผัสในเวลาเดียวกัน (ฉันหมายถึง comoonn เหมือนมี 2 mouses เชื่อมต่อกับคอมพิวเตอร์เครื่องเดียวกันฮ่าฮ่าฮ่า)
Sebastien Lorber

@SebastienLorber - เกลียดที่จะทำลายมันให้กับคุณ แต่ผู้ใช้ไม่จำเป็นต้องมีหน้าจอเสมอไป ( เป็นไปได้หรือไม่ที่จะใช้จาวาสคริปต์เพื่อตรวจสอบว่าโปรแกรมอ่านหน้าจอกำลังทำงานอยู่บนเครื่องของผู้ใช้หรือไม่ )
ashleedawg

57

วิธีการเกี่ยวกับการฟังเหตุการณ์วางเมาส์บนเอกสาร จากนั้นจนกว่าคุณจะได้ยินเหตุการณ์นั้นคุณถือว่าอุปกรณ์นั้นเป็นแบบสัมผัสหรือแป้นพิมพ์เท่านั้น

var mouseDetected = false;
function onMouseMove(e) {
  unlisten('mousemove', onMouseMove, false);
  mouseDetected = true;
  // initializeMouseBehavior();
}
listen('mousemove', onMouseMove, false);

(สถานที่listenและunlistenมอบหมายให้addEventListenerหรือattachEventตามความเหมาะสม)

หวังว่านี่จะไม่นำไปสู่การมองเห็นที่ขาดหายไปมากเกินไปมันจะดูดถ้าคุณต้องการรูปแบบขนาดใหญ่อีกครั้งตามโหมด ...


2
เป็นความคิดที่ดี แต่น่าเสียดายที่ความล่าช้าในการตอบสนองจะทำให้ใช้งานไม่ได้เมื่อ UI ของแอปพลิเคชันขึ้นอยู่กับว่าเมาส์นั้นมีให้บริการหรือไม่นี่เป็นเรื่องจริงโดยเฉพาะอย่างยิ่ง เม้าส์เคลื่อนที่เหนือ iframe นั้นเอง ..
Jon Gjengset

7
สิ่งนี้สามารถใช้งานได้หากแอปพลิเคชันเริ่มต้นด้วยหน้าจอเริ่มต้นและปุ่ม "ดำเนินการต่อ" หากเมาส์เคลื่อนที่ก่อนเหตุการณ์วางเมาส์ครั้งแรกแสดงว่าคุณมีเมาส์ มันจะล้มเหลวก็ต่อเมื่อปุ่มโหลดโดยตรงภายใต้เมาส์และผู้ใช้มีมือที่มั่นคงมาก (แม้จะเลื่อน 1 พิกเซลควรหยิบขึ้นมา)
SpliFF

49
ความคิดที่ดี แต่ไม่ปรากฏในการทำงานในการทดสอบของเรา iPads เรียกกิจกรรมนี้
Jeff Atwood

3
@JeffAtwood คุณทำอะไรลงไปบ้างในกรณีของคุณ?
Michael Haren

2
แน่นอนว่า iPads จะเรียกเหตุการณ์ mousemove ก่อนเหตุการณ์ mousedown ฉันพบว่าการนับ mousedown> 0 และการนับ mousedown == mousemove นับเป็นวิธีที่ดีในการตรวจจับไม่มีเมาส์ ฉันไม่สามารถทำซ้ำสิ่งนี้ด้วยเมาส์จริง
Peter Wooster

36

ตั้งแต่ปี 2018 มีวิธีที่ดีและเชื่อถือได้ในการตรวจสอบว่าเบราว์เซอร์มีเมาส์ (หรืออุปกรณ์ป้อนข้อมูลที่คล้ายกัน): คุณสมบัติการโต้ตอบกับสื่อ CSS4ซึ่งขณะนี้ได้รับการสนับสนุนจากเบราว์เซอร์สมัยใหม่เกือบทุกรุ่น (ยกเว้น IE 11 และเบราว์เซอร์มือถือพิเศษ)

W3C:

คุณสมบัติสื่อตัวชี้ใช้เพื่อสอบถามการมีอยู่และความแม่นยำของอุปกรณ์ตัวชี้เช่นเมาส์

ดูตัวเลือกต่อไปนี้:

    /* The primary input mechanism of the device includes a 
pointing device of limited accuracy. */
    @media (pointer: coarse) { ... }

    /* The primary input mechanism of the device 
includes an accurate pointing device. */
    @media (pointer: fine) { ... }

    /* The primary input mechanism of the 
device does not include a pointing device. */
    @media (pointer: none) { ... }

    /* Primary input mechanism system can 
       hover over elements with ease */
    @media (hover: hover) { ... }

    /* Primary input mechanism cannot hover 
       at all or cannot conveniently hover 
       (e.g., many mobile devices emulate hovering
       when the user performs an inconvenient long tap), 
       or there is no primary pointing input mechanism */
    @media (hover: none) { ... }

    /* One or more available input mechanism(s) 
       can hover over elements with ease */
    @media (any-hover: hover) { ... }


    /* One or more available input mechanism(s) cannot 
       hover (or there are no pointing input mechanisms) */
    @media (any-hover: none) { ... }

คำสั่งสื่อสามารถใช้ใน JS:

if(window.matchMedia("(any-hover: none)").matches) {
    // do sth
}

ที่เกี่ยวข้อง:

เอกสาร W3: https://www.w3.org/TR/mediaqueries-4/#mf-interaction

การสนับสนุนเบราว์เซอร์: https://caniuse.com/#search=media%20features

ปัญหาที่คล้ายกัน: ตรวจหาว่าอุปกรณ์ไคลเอนต์รองรับ: โฮเวอร์และ: สถานะโฟกัส


ฉันชอบคำตอบนี้เป็นการส่วนตัว แต่ ณ ตอนนี้ (10/19), @media hover และการค้นหา CSS ของตัวชี้จะมีให้ในอุปกรณ์ ~ 85% ทั่วโลกตาม caniuse.com เท่านั้น แน่นอนว่าไม่เลว 95% หรือสูงกว่าเป็นที่ต้องการ หวังว่านี่จะเป็นมาตรฐานสำหรับอุปกรณ์เร็ว ๆ นี้
MQuiggGeorgia

1
@MQuiggGeorgia โดยทั่วไปฉันเห็นด้วยกับคำวิจารณ์ของคุณโดยพื้นฐานแล้วยังไม่รองรับทุกที่ ยังคง caniuse.com สำหรับฉันบอกว่ารองรับ 91.2% ( caniuse.com/#feat=css-media-interaction ) มีการสนับสนุนอย่างใกล้ชิดทุกที่ยกเว้น IE 11 และเบราว์เซอร์ที่แบนเป็นพิเศษบนมือถือ เพื่อความเป็นธรรมนี่เป็นความจริงสำหรับฟีเจอร์สมัยใหม่ใด ๆ เนื่องจาก Microsoft หยุดใช้คุณสมบัติ IE มานานแล้ว สำหรับ IE 11 คุณอาจใช้ทางเลือกอื่นจากคำตอบอื่น ๆ ที่นี่
Blackbam

23

@ คำตอบของไวแอตต์นั้นยอดเยี่ยมและทำให้เราคิดมาก

ในกรณีของฉันฉันเลือกที่จะฟังการโต้ตอบครั้งแรกเพื่อตั้งค่าพฤติกรรมเท่านั้น ดังนั้นแม้ว่าผู้ใช้จะมีเมาส์ฉันจะถือว่าเป็นอุปกรณ์สัมผัสถ้าการโต้ตอบครั้งแรกเป็นการสัมผัส

พิจารณาลำดับที่ได้รับในการประมวลผลเหตุการณ์ :

  1. touchstart
  2. touchmove
  3. touchend
  4. วางเมาส์
  5. mousemove
  6. mousedown
  7. mouseup
  8. คลิก

เราสามารถสันนิษฐานได้ว่าหากเหตุการณ์เมาส์ถูกกระตุ้นก่อนการสัมผัสมันเป็นเหตุการณ์เมาส์จริงไม่ใช่เหตุการณ์จำลอง ตัวอย่าง (โดยใช้ jQuery):

$(document).ready(function() {
    var $body = $('body');
    var detectMouse = function(e){
        if (e.type === 'mousedown') {
            alert('Mouse interaction!');
        }
        else if (e.type === 'touchstart') {
            alert('Touch interaction!');
        }
        // remove event bindings, so it only runs once
        $body.off('mousedown touchstart', detectMouse);
    }
    // attach both events to body
    $body.on('mousedown touchstart', detectMouse);
});

ที่ทำงานให้ฉัน


ใช้งานไม่ได้สำหรับฉัน Ipad Safari (IOS8.3) ตรวจจับเมาส์ด้วยตัวอย่างนี้
netzaffin

3
@netzaffin ขอบคุณสำหรับข้อเสนอแนะฉันพบว่ามันจะสอดคล้องกันมากขึ้นโดยใช้ mousedown แทนการวางเมาส์ คุณจะได้ดูซอนี้จาก IOS ของคุณและแจ้งให้เราทราบผลหรือไม่ ไชโยjsfiddle.net/bkwb0qen/15/embedded/result
Hugo Silva

1
หากคุณมีหน้าจอสัมผัสพร้อมเมาส์จะตรวจจับเฉพาะวิธีการป้อนข้อมูลที่ใช้ก่อนเท่านั้น
0xcaff

11

เป็นไปได้ที่จะตรวจสอบว่าเบราว์เซอร์นั้นสามารถใช้การสัมผัสได้หรือไม่ ไม่มีวิธีที่จะรู้ว่าจริง ๆ แล้วมันมีหน้าจอสัมผัสหรือเมาส์เชื่อมต่ออยู่

หนึ่งสามารถจัดลำดับความสำคัญการใช้งานโดยฟังเหตุการณ์การสัมผัสแทนเหตุการณ์เมาส์หากตรวจพบความสามารถในการสัมผัส

ในการตรวจจับความสามารถในการสัมผัสข้ามเบราว์เซอร์:

function hasTouch() {
    return (('ontouchstart' in window) ||       // html5 browsers
            (navigator.maxTouchPoints > 0) ||   // future IE
            (navigator.msMaxTouchPoints > 0));  // current IE10
}

จากนั้นหนึ่งสามารถใช้สิ่งนี้เพื่อตรวจสอบ:

if (!hasTouch()) alert('Sorry, need touch!);

หรือเพื่อเลือกกิจกรรมที่ต้องการฟัง:

var eventName = hasTouch() ? 'touchend' : 'click';
someElement.addEventListener(eventName , handlerFunction, false);

หรือใช้วิธีการแยกต่างหากสำหรับการสัมผัสกับการไม่สัมผัส:

if (hasTouch() === true) {
    someElement.addEventListener('touchend' , touchHandler, false);

} else {
    someElement.addEventListener('click' , mouseHandler, false);

}
function touchHandler(e) {
    /// stop event somehow
    e.stopPropagation();
    e.preventDefault();
    window.event.cancelBubble = true;
    // ...
    return false; // :-)
}
function mouseHandler(e) {
    // sorry, touch only - or - do something useful and non-restrictive for user
}

สำหรับเมาส์หนึ่งสามารถตรวจพบได้ว่ามีการใช้เมาส์หรือไม่เท่านั้น หนึ่งสามารถติดตั้งค่าสถานะโกลบอลเพื่อระบุว่าเมาส์ถูกตรวจพบโดยการใช้งาน (คล้ายกับคำตอบที่มีอยู่ แต่ลดความซับซ้อนลงเล็กน้อย):

var hasMouse = false;

window.onmousemove = function() {
    hasMouse = true;
}

(หนึ่งไม่สามารถรวมmouseupหรือmousedownเป็นเหตุการณ์เหล่านี้ยังสามารถเรียกใช้โดยการสัมผัส)

เบราว์เซอร์ จำกัด การเข้าถึง API ของระบบในระดับต่ำซึ่งจำเป็นเพื่อให้สามารถตรวจจับคุณลักษณะเช่นความสามารถด้านฮาร์ดแวร์ของระบบที่ใช้งานอยู่

มีความเป็นไปได้ที่จะเขียนปลั๊กอิน / ส่วนขยายเพื่อเข้าถึงสิ่งเหล่านี้ แต่ผ่าน JavaScript และ DOM การตรวจจับดังกล่าวนั้นมีข้อ จำกัด สำหรับจุดประสงค์นี้และจะต้องเขียนปลั๊กอินเฉพาะสำหรับแพลตฟอร์มระบบปฏิบัติการต่างๆ

ดังนั้นโดยสรุป: การตรวจจับดังกล่าวสามารถประมาณได้โดย "เดาดี" เท่านั้น


8

เมื่อMedia Queries Level 4พร้อมใช้งานในเบราว์เซอร์เราจะสามารถใช้คำสั่ง "pointer" และ "hover" เพื่อตรวจสอบอุปกรณ์ด้วยเมาส์

หากเราต้องการสื่อสารข้อมูลนั้นกับ Javascript เราสามารถใช้แบบสอบถาม CSS เพื่อกำหนดสไตล์เฉพาะตามประเภทอุปกรณ์แล้วใช้getComputedStyleใน Javascript เพื่ออ่านสไตล์นั้นและสืบทอดประเภทอุปกรณ์ดั้งเดิมจากนั้น

แต่เมาส์สามารถเชื่อมต่อหรือถอดปลั๊กได้ตลอดเวลาและผู้ใช้อาจต้องการสลับระหว่างการสัมผัสและเมาส์ ดังนั้นเราอาจต้องตรวจจับการเปลี่ยนแปลงนี้และเสนอให้เปลี่ยนอินเทอร์เฟซหรือทำโดยอัตโนมัติ


1
โดยเฉพาะany-pointerและany-hoverจะช่วยให้คุณตรวจสอบความสามารถของอุปกรณ์ที่เกี่ยวข้องทั้งหมด ยินดีที่ได้ทราบวิธีที่เราอาจแก้ปัญหานี้ในอนาคต! :)
Jordan Gray

2
window.matchMedia ("(ตัวชี้ใด ๆ : หยาบ)") ตรงกับ === จริงหรือ
4esn0k

7

เนื่องจากคุณกำลังวางแผนที่จะเสนอวิธีการสลับระหว่างอินเทอร์เฟซอย่างไรก็ตามเป็นไปได้หรือไม่ที่จะขอให้ผู้ใช้คลิกลิงก์หรือปุ่มเพื่อ "ป้อน" แอปพลิเคชันรุ่นที่ถูกต้อง? จากนั้นคุณสามารถจำการตั้งค่าสำหรับการเข้าชมในอนาคต ไม่ใช่เทคโนโลยีขั้นสูง แต่เชื่อถือได้ 100% :-)


2
อันที่จริงมันเป็นข้อเสนอแนะที่ดีงาม แต่มันล่าช้าเวลาก่อนที่ผู้ใช้จะได้รับอินเทอร์เฟซจริง นอกจากนี้ฉันจะต้องให้วิธีการสลับหลังจากตัวเลือกเริ่มต้น จบลงด้วยการทำงานที่
หนักหน่วงมากกว่าที่

1
การถามผู้ใช้เป็นวิธีที่ดีที่สุดอย่างชัดเจน - หากไม่เข้าใจผิดได้ตลอดเวลา - และมอบสถานที่ที่สะดวกในการติดตั้งการแจ้งเตือนการอัปเกรดและสิ่งที่ไม่ ฉันคิดว่าคุณกำลังคิดถึง "ปัญหา" ..
T4NK3R

4

@SamuelRossille ไม่มีเบราว์เซอร์ที่ฉันตระหนักถึงการมีอยู่ของ (หรือขาดมัน) เมาส์โชคไม่ดี

ดังนั้นด้วยการที่ถูกกล่าวว่าเราเพียงแค่ต้องพยายามและทำสิ่งที่ดีที่สุดที่เราสามารถทำได้กับตัวเลือกที่มีอยู่ของเรา ... เหตุการณ์ ฉันรู้ว่ามันไม่ใช่สิ่งที่คุณกำลังมองหา ... เห็นด้วยมันอยู่ไกลจากอุดมคติ

เราสามารถทำอย่างดีที่สุดเพื่อค้นหาว่าผู้ใช้กำลังใช้เมาส์หรือสัมผัสในเวลาใดก็ตาม นี่เป็นตัวอย่างที่รวดเร็วและสกปรกโดยใช้ jQuery & Knockout:

//namespace
window.ns = {};

// for starters, we'll briefly assume if touch exists, they are using it - default behavior
ns.usingTouch = ko.observable(Modernizr.touch); //using Modernizr here for brevity.  Substitute any touch detection method you desire

// now, let's sort out the mouse
ns.usingMouse = ko.computed(function () {
    //touch
    if (ns.usingTouch()) {
        //first, kill the base mousemove event
        //I really wish browsers would stop trying to handle this within touch events in the first place
        window.document.body.addEventListener('mousemove', function (e) {
            e.preventDefault();
            e.stopImmediatePropagation();
        }, true);

        //remove mouse class from body
        $('body').removeClass("mouse");

        //switch off touch listener
        $(document).off(".ns-touch");

        // switch on a mouse listener
        $(document).on('mousemove.ns-mouse', function (e) {
            if (Math.abs(window.lastX - e.clientX) > 0 || window.lastY !== e.clientY) {
                ns.usingTouch(false);  //this will trigger re-evaluation of ns.usingMouse() and result in ns.usingMouse() === true
            }
        });

        return false;
    }
    //mouse
    else {
        //add mouse class to body for styling
        $('body').addClass("mouse");

        //switch off mouse listener
        $(document).off(".ns-mouse");

        //switch on a touch listener
        $(document).on('touchstart.ns-touch', function () { ns.usingTouch(true) });

        return true;
    }
});

//tests:
//ns.usingMouse()
//$('body').hasClass('mouse');

ตอนนี้คุณสามารถผูก / สมัครสมาชิก usingMouse () & usingTouch ()และ / หรือกำหนดรูปแบบส่วนต่อประสานกับคลาสbody.mouse อินเทอร์เฟซจะสลับไปมาทันทีที่ตรวจพบเคอร์เซอร์ของเมาส์และเปิดเครื่อง

หวังว่าเราจะมีตัวเลือกที่ดีกว่าจากผู้ขายเบราว์เซอร์ในไม่ช้า


2

Tera-WURFLสามารถบอกความสามารถของอุปกรณ์ที่กำลังเยี่ยมชมเว็บไซต์ของคุณโดยการเปรียบเทียบลายเซ็นของเบราว์เซอร์กับฐานข้อมูล ดูสิมันฟรี!


1
สิ่งนี้จะไม่ทำงานกับอุปกรณ์ที่อาจมีหรือไม่มีหน้าจอสัมผัสและเมาส์ ตัวอย่างเช่นคอมพิวเตอร์เดสก์ท็อป Windows อาจเชื่อมต่อกับหน้าจอสัมผัส แต่โดยปกติแล้วจะมีเมาส์ในขณะที่แท็บเล็ตอาจใช้ Windows แต่อาจไม่ได้เชื่อมต่อเมาส์ ...
Jon Gjengset

@ Jonhoo เพียงแค่สมมติว่าระบบปฏิบัติการเดสก์ท็อปนั้นมีเม้าส์ต่ออยู่ ท้ายที่สุดพวกเขาจะต้องสนับสนุนซอฟต์แวร์หลากหลายที่ไม่ได้รับการพัฒนาโดยคำนึงถึงหน้าจอสัมผัส
Gigi

1
แท็บเล็ตที่ใช้ Windows 8 ธรรมดา ๆ หรือ Linux หรือแล็ปท็อปที่ใช้ Android?
Jon Gjengset

2
@Jonhoo เห็นได้ชัดว่าวิธีการนี้น้อยกว่าความเหมาะสม แต่ไม่มีวิธีพกพาที่จะรู้ (ยัง) หากใครใช้แล็ปท็อปที่ใช้ Android ลองคิดว่ามันสามารถใช้งานแบบสัมผัสได้ หากมีผู้ใช้แท็บเล็ต Windows8 ให้ถือว่าเป็นความสามารถของเมาส์ (ระบบปฏิบัติการจะต้องจำลองเมาส์สำหรับโปรแกรมที่ไม่ได้สัมผัส)
Gigi

สิ่งนี้ล้าสมัยไปแล้วและจะไม่เกี่ยวข้องอีกต่อไป
วิศวกร

2

ทำไมคุณไม่ลองตรวจสอบดูว่ามันมีความสามารถในการสัมผัสและ / หรือตอบสนองต่อการเคลื่อนไหวของเมาส์หรือไม่?

// This will also return false on
// touch-enabled browsers like Chrome
function has_touch() {
  return !!('ontouchstart' in window);
}

function has_mouse() {
  return !!('onmousemove' in window);
}

4
เนื่องจากบางเบราว์เซอร์ (เช่น IE9) รายงานว่าฟังก์ชันนี้มีอยู่แม้ว่าจะไม่ถูกเรียกใช้ ฉันเชื่อว่านี่เป็นพฤติกรรมที่ "ถูกต้อง"
Jon Gjengset

ทำไมคุณถึงใช้ฟังก์ชั่น เพียงแค่has_touch = 'ontouchstart' in windowจะพอเพียงและอื่น ๆ
vsync

มันใช้งานได้กับ Chrome 47 สำหรับ OS X อย่างน้อย ไม่มีการรายงาน ontouchstart
phreakhead

2

สิ่งนี้ใช้ได้สำหรับฉันในสถานการณ์ที่คล้ายคลึงกัน โดยทั่วไปสมมติว่าผู้ใช้ไม่มีเมาส์จนกว่าคุณจะเห็นชุดข้อความติดต่อกันแบบสั้น ๆ โดยไม่รบกวนเมาส์หรือเมาส์เมาส์ ไม่หรูหรามาก แต่ใช้งานได้

var mousedown = false;
var mousemovecount = 0;
function onMouseDown(e){
    mousemovecount = 0;
    mousedown = true;
}
function onMouseUp(e){
    mousedown = false;
    mousemovecount = 0;
}
function onMouseMove(e) {
    if(!mousedown) {
        mousemovecount++;
        if(mousemovecount > 5){
            window.removeEventListener('mousemove', onMouseMove, false);
            console.log("mouse moved");
            $('body').addClass('has-mouse');
        }
    } else {
        mousemovecount = 0;
    }
}
window.addEventListener('mousemove', onMouseMove, false);
window.addEventListener('mousedown', onMouseDown, false);
window.addEventListener('mouseup', onMouseUp, false);

0

ลองดูที่ modenizr หนึ่งในคุณสมบัติของมันคือการสัมผัส

http://modernizr.com/docs/#features-misc

ในขณะที่ฉันไม่ได้ทดสอบอย่างเต็มที่ดูเหมือนว่าจะทำงานได้ดีมาก

นอกจากนี้ยังมีลิงก์จากหน้า modernizr http://www.html5rocks.com/en/mobile/touchandmouse/


ความพยายามในการตรวจสอบความสามารถในการสัมผัสไม่ใช่ว่าจะมีเพียงการสัมผัสเท่านั้นและไม่มีความสามารถของเมาส์ คำถามนี้แตกต่างจากการตรวจจับแบบสัมผัส
Jimbo Jonny

0

ตามที่คนอื่น ๆ ชี้ให้เห็นการตรวจสอบอย่างชัดเจนว่าพวกเขามีเมาส์จะไม่น่าเชื่อถือ สิ่งนี้สามารถเปลี่ยนแปลงได้ง่ายขึ้นอยู่กับอุปกรณ์ มันเป็นสิ่งที่คุณไม่สามารถทำได้อย่างน่าเชื่อถือด้วยบูลีนจริงหรือเท็จอย่างน้อยก็ในสเกลของเอกสาร

กิจกรรมสัมผัสและกิจกรรมเมาส์เป็นพิเศษ ดังนั้นสิ่งนี้สามารถช่วยในการดำเนินการที่แตกต่างกันบ้าง ปัญหาคือเหตุการณ์การสัมผัสอยู่ใกล้กับเหตุการณ์ขึ้น / ลง / ย้ายของเมาส์และยังทริกเกอร์เหตุการณ์การคลิก

จากคำถามที่คุณบอกว่าคุณต้องการให้มีการโฮเวอร์เพื่อแสดงตัวอย่าง นอกเหนือจากนั้นฉันไม่ทราบรายละเอียดอื่น ๆ เกี่ยวกับอินเทอร์เฟซของคุณ ฉันสมมติว่าไม่มีเมาส์ที่คุณต้องการให้แตะเพื่อแสดงตัวอย่างในขณะที่คลิกทำการกระทำที่แตกต่างเนื่องจากการแสดงตัวอย่างแบบโฮเวอร์

หากเป็นกรณีนี้คุณสามารถใช้วิธีการสันหลังยาวเพื่อตรวจจับได้:

เหตุการณ์ onclick จะถูกนำหน้าด้วยเหตุการณ์ onmouseover ด้วยเมาส์เสมอ ดังนั้นให้สังเกตว่าเมาส์นั้นอยู่ด้านบนขององค์ประกอบที่ถูกคลิก

คุณสามารถทำได้ด้วยเหตุการณ์ onmousemove ทั้งเอกสาร คุณสามารถใช้event.targetเพื่อบันทึกองค์ประกอบที่เมาส์อาศัยอยู่ จากนั้นภายในเหตุการณ์ onclick ของคุณคุณสามารถตรวจสอบเพื่อดูว่าจริง ๆ แล้วเมาส์นั้นเป็นองค์ประกอบเหนือการคลิกหรือไม่ (หรือลูกขององค์ประกอบ)

จากตรงนั้นคุณสามารถเลือกที่จะพึ่งพาเหตุการณ์คลิกสำหรับทั้งคู่และดำเนินการ A หรือ B ขึ้นอยู่กับผลลัพธ์ การกระทำ B อาจไม่เกิดผลอะไรเลยหากอุปกรณ์สัมผัสบางเครื่องไม่ปล่อยเหตุการณ์การคลิก


0

ฉันไม่คิดว่าเป็นไปได้ที่จะระบุอุปกรณ์แบบสัมผัสเท่านั้น (ตามความรู้ของฉัน) ปัญหาหลักคือเหตุการณ์เมาส์และแป้นพิมพ์ทั้งหมดถูกใช้โดยอุปกรณ์สัมผัสเช่นกัน ดูตัวอย่างต่อไปนี้การแจ้งเตือนทั้งสองคืนเป็นจริงสำหรับอุปกรณ์ระบบสัมผัส

function is_touch_present() {
  return ('ontouchstart' in window) || ('onmsgesturechange' in window);
}

function is_mouse_present() {
  return (('onmousedown' in window) && ('onmouseup' in window) && ('onmousemove' in window) && ('onclick' in window) && ('ondblclick' in window) && ('onmousemove' in window) && ('onmouseover' in window) && ('onmouseout' in window) && ('oncontextmenu' in window));
}

alert("Touch Present: " + is_touch_present());
alert("Mouse Present: " + is_mouse_present());

2
Safari ipad ส่งคืนtrueสำหรับ'onmousedown' in window
vsync

0

ความคิดที่ดีที่สุดในความคิดของฉันเป็นmousemoveผู้ฟัง (ปัจจุบันคำตอบด้านบน) ฉันเชื่อว่าวิธีนี้จะต้องมีการปรับแต่งเล็กน้อย มันเป็นความจริงที่เบราว์เซอร์ที่ใช้ระบบสัมผัสเลียนแบบแม้กระทั่งเหตุการณ์ mousemove อย่างที่คุณเห็นในการสนทนา iOS นี้ดังนั้นเราจึงควรระมัดระวังเล็กน้อย

มันสมเหตุสมผลแล้วที่เบราว์เซอร์แบบสัมผัสจะเลียนแบบเหตุการณ์นี้เมื่อผู้ใช้แตะที่หน้าจอ (นิ้วของผู้ใช้ไม่ทำงาน) ซึ่งหมายความว่าเราควรเพิ่มการทดสอบในระหว่างการจัดการ mousemove ของเราเพื่อดูว่าปุ่มเมาส์ใดที่ลง (ถ้ามี) ในระหว่างกิจกรรม หากปุ่มเมาส์ไม่ทำงานเราสามารถสันนิษฐานได้ว่ามีเมาส์จริงอยู่ หากปุ่มเมาส์ค้างการทดสอบจะไม่สามารถสรุปได้

ดังนั้นสิ่งนี้จะดำเนินการอย่างไร คำถามนี้แสดงให้เห็นว่าวิธีการที่เชื่อถือได้มากที่สุดในการตรวจสอบว่าปุ่มเมาส์ใดหยุดทำงานในขณะที่วางเมาส์เพื่อฟัง 3 เหตุการณ์ในระดับเอกสาร: mousemove, mousedown และ mouseup ขึ้นและลงจะตั้งค่าสถานะบูลีนทั่วโลกเท่านั้น การเคลื่อนไหวจะทำการทดสอบ หากคุณมีการเคลื่อนไหวและบูลีนเป็นเท็จเราสามารถถือว่าเมาส์มีอยู่ ดูคำถามสำหรับตัวอย่างรหัสที่แน่นอน

หนึ่งความคิดเห็นสุดท้าย .. การทดสอบนี้ไม่เหมาะเพราะไม่สามารถทำการโหลดได้ ดังนั้นฉันจะใช้วิธีการเพิ่มประสิทธิภาพแบบก้าวหน้าตามที่แนะนำก่อนหน้านี้ ตามค่าเริ่มต้นให้แสดงเวอร์ชันที่ไม่รองรับอินเทอร์เฟซโฮเวอร์เฉพาะของเมาส์ หากค้นพบเมาส์ให้เปิดใช้งานโหมดนี้ในรันไทม์โดยใช้ JS สิ่งนี้ควรปรากฏอย่างราบรื่นต่อผู้ใช้

เพื่อรองรับการเปลี่ยนแปลงการกำหนดค่าของผู้ใช้ (เช่นเมาส์ถูกตัดการเชื่อมต่อ) คุณสามารถทดสอบซ้ำเป็นระยะ แม้ว่าฉันเชื่อว่ามันจะดีกว่าในกรณีนี้เพียงแค่แจ้งให้ผู้ใช้ทราบเกี่ยวกับโหมด 2 โหมดและให้ผู้ใช้สลับไปมาระหว่างกันได้ (คล้ายกับตัวเลือกมือถือ / เดสก์ท็อปที่สามารถย้อนกลับได้เสมอ)


ขอบคุณสำหรับคำแนะนำในการแก้ไขปัญหาที่ดี ... ฉันคิดว่าปัญหาหลักที่ไม่ได้ถูกโซวอนฉันจะต้องหันไปใช้วิธีใดวิธีหนึ่งดังต่อไปนี้
ซามูเอลรอสซิลล์

น่าเสียดายที่ mousemove ถูกทริกเกอร์เมื่อคลิกบนไอแพด ผ่านการทดสอบด้วยเครื่องจำลองเท่านั้น สำหรับ hasMouse () ฉันใช้if (! ('ontouchstart' ในหน้าต่าง)) คืนค่าจริง แต่ไม่สามารถใช้งานกับแล็ปท็อปที่รองรับระบบสัมผัส
Chris Gunawardena

@Chris G - นรก iPad ... (กระแทกหัวของฉันกับผนัง)
vsync

0

ทดสอบบางอย่างเกี่ยวกับพีซี, Linux, iPhone, โทรศัพท์ Android และแท็บต่างๆ แปลกที่ไม่มีวิธีแก้ปัญหากระสุนง่าย ปัญหาเกิดขึ้นเมื่อบางคนที่มี Touch และไม่มีเมาส์ยังคงแสดงเหตุการณ์ Touch และ Mouse ไปยังแอปพลิเคชัน เนื่องจากต้องการสนับสนุนอินสแตนซ์ของเมาส์และแบบสัมผัสอย่างเดียวต้องการประมวลผลทั้งคู่ แต่สิ่งนี้ทำให้เกิดการโต้ตอบของผู้ใช้สองครั้ง หากสามารถรู้ว่าไม่มีเมาส์อยู่ในอุปกรณ์ก็สามารถทราบได้ว่าจะเพิกเฉยต่อเหตุการณ์เมาส์ปลอม / ถูกแทรก พยายามตั้งค่าสถานะหากพบ MouseMove แต่เบราว์เซอร์บางตัวมี MouseMove ปลอมรวมทั้ง MouseUp และ MouseDown พยายามตรวจสอบเวลาประทับ แต่คิดว่ามันเสี่ยงเกินไป บรรทัดล่าง: ฉันพบเบราว์เซอร์ที่สร้างเหตุการณ์เมาส์ปลอมแทรก MouseMove เดียวก่อนหน้า MouseDown ที่แทรกไว้เสมอ ใน 99.99% ของกรณีของฉัน เมื่อทำงานบนระบบที่มีเมาส์จริงมีเหตุการณ์ MouseMove ติดต่อกันหลายเหตุการณ์ - อย่างน้อยสองเหตุการณ์ ดังนั้นติดตามว่าระบบพบเหตุการณ์ MouseMove ติดต่อกันสองเหตุการณ์หรือไม่และประกาศว่าไม่มีเมาส์อยู่หากไม่พบเงื่อนไขนี้ นี่อาจจะง่ายเกินไป แต่ก็ใช้ได้กับการตั้งค่าการทดสอบทั้งหมดของฉัน คิดว่าฉันจะติดมันจนกว่าฉันจะหาทางออกที่ดีกว่า - จิมดับบลิว


0

วิธีแก้ปัญหาง่ายๆใน jQuery เพื่อตรวจจับการใช้เมาส์ซึ่งจะแก้ปัญหาที่อุปกรณ์มือถือเรียกเหตุการณ์ 'mousemove' เพียงเพิ่มเครื่องฟัง touchstart เพื่อลบฟัง mousemove เพื่อที่จะไม่ถูกทริกเกอร์เมื่อสัมผัส

$('body').one('touchstart.test', function(e) {
  // Remove the mousemove listener for touch devices
  $('body').off('mousemove.test');
}).one('mousemove.test', function(e) {
  // MOUSE!
});

แน่นอนว่าอุปกรณ์ยังคงสามารถสัมผัสและใช้เมาส์ได้ แต่สิ่งที่กล่าวมาข้างต้นรับประกันได้ว่ามีการใช้เมาส์จริง


0

เพิ่งพบทางออกที่ฉันคิดว่าค่อนข้างสง่างาม

// flag as mouse interaction by default
var isMouse = true;

// detect a touch event start and flag it
$(window).on('touchstart', function () {
  // if triggers touchstart, toggle flag
  // since touch events come before mouse event / click
  // callback of mouse event will get in callback
  // `isMouse === false`
  isMouse = false;
});

// now the code that you want to write
// should also work with `mouse*` events
$('a.someClass').on('click', function () {
  if (isMouse) {
    // interaction with mouse event
    // ...
  } else {
    // reset for the next event detection
    // this is crucial for devices that have both
    // touch screen and mouse
    isMouse = true;

    // interaction with touch event
    // ...
  }
});

0

ฉันพบปัญหาเดียวกันซึ่งมีการแตะเพียงครั้งเดียวด้วยการคลิก หลังจากที่ฉันอ่านความคิดเห็นของคำตอบที่ได้รับการโหวตชั้นนำฉันก็มาพร้อมกับโซลูชันของตัวเอง:

var body = document.getElementsByTagName('body')[0];
var mouseCount = 0;

// start in an undefined state 
// (i use this to blend in elements once we decide what input is used)
var interactionMode = 'undefined';


var registerMouse = function() {
  // count up mouseCount every time, the mousemove event is triggered
  mouseCount++;

  // but dont set it instantly. 
  // instead wait 20 miliseconds (seems to be a good value for multiple move actions), 
  // if another mousemove event accoures switch to mouse as interaction 
  setTimeout(function() {
    // a touch event triggers also exactly 1 mouse move event.
    // So only if mouseCount is higher than 1 we are really moving the cursor by mouse.
    if (mouseCount > 1) {
      body.removeEventListener('mousemove', registerMouse);
      body.removeEventListener('touchend', registerTouch);

      interactionMode = 'mouse';
      console.log('now mousing');
      listenTouch();
    }

    // set the counter to zero again
    mouseCount = 0;
  }, 20);
};

var registerTouch = function() {
  body.removeEventListener('mousemove', registerMouse);
  body.removeEventListener('touchend', registerTouch);

  interactionMode = 'touch';
  console.log('now touching');
  mouseCount = 0;

  listenMouse();
};

var listenMouse = function() {
  body.addEventListener("mousemove", registerMouse);
};
var listenTouch = function() {
  body.addEventListener("touchend", registerTouch);
};

listenMouse();
listenTouch();

// after one second without input, assume, that we are touching
// could be adjusted to several seconds or deleted
// without this, the interactionMode would stay 'undefined' until first mouse or touch event
setTimeout(function() {
  if (!body.classList.contains('mousing') || body.classList.contains('touching')) {
    registerTouch();
  }
}, 1000);
/* fix, so that scrolling is possible */

html,
body {
  height: 110%;
}
Mouse or touch me

ปัญหาเดียวที่ฉันพบคือคุณต้องสามารถเลื่อนเพื่อตรวจจับเหตุการณ์การสัมผัสอย่างถูกต้อง แท็บเดียว (สัมผัส) อาจทำให้เกิดปัญหา


0

ฉันใช้เวลาหลายชั่วโมงในการหาปัญหานี้สำหรับแอพ Phonegap ของฉันและฉันก็พบกับแฮ็คนี้ มันสร้างคำเตือนคอนโซลหากเหตุการณ์ที่เรียกว่าเป็นเหตุการณ์ "แฝง" ซึ่งหมายความว่ามันไม่ได้กระตุ้นการเปลี่ยนแปลง แต่ก็ใช้งานได้! ฉันจะสนใจในความคิดใด ๆ เพื่อปรับปรุงหรือวิธีการที่ดีกว่า แต่สิ่งนี้ทำให้ฉันใช้ $ .touch () แบบสากลได้อย่างมีประสิทธิภาพ

$(document).ready(function(){
  $("#aButton").touch(function(origElement, origEvent){
    console.log('Original target ID: ' + $(origEvent.target).attr('id'));
  });
});

$.fn.touch = function (callback) {
    var touch = false;
    $(this).on("click", function(e){
        if (!touch)
        {
            console.log("I click!");
            let callbackReal = callback.bind(this);
            callbackReal(this, e);
        }else{
            touch = true;
        }
        touch = false;
    });
    $(this).on("touchstart", function(e){
        if (typeof e.touches != typeof undefined)
        {
            e.preventDefault();
            touch = true;
            console.log("I touch!");
            let callbackReal = callback.bind(this);
            callbackReal(this, e);
        }
    });
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<button id="aButton">A Button</button>


0

ปัญหาหลักที่ฉันเห็นที่นี่คืออุปกรณ์สัมผัสส่วนใหญ่ใช้งานเหตุการณ์เมาส์พร้อมกับระบบสัมผัสที่สอดคล้อง (touchstart -> mousedown, touchmove -> mousemove ฯลฯ ) ในที่สุดสำหรับแป้นพิมพ์รุ่นล่าสุดพวกเขามีเบราว์เซอร์ทั่วไปดังนั้นคุณจึงไม่สามารถตรวจจับการปรากฏตัวของคลาส MouseEvent ได้

ในความคิดของฉันจะเห็นได้ว่าการแก้ปัญหาที่เจ็บปวดน้อยกว่านี้คือการแสดงเมนูที่เปิดตัว (ด้วยการจัดการแบบ 'alt' สำหรับผู้ใช้ที่ใช้คีย์บอร์ดเท่านั้น) และอาจเก็บตัวเลือกไว้ด้วย localStorage / cookies / servers หรืออื่น ๆ เวลาที่ผู้มาเยี่ยม


-4

ฉันขอแนะนำอย่างยิ่งต่อแนวทางนี้ พิจารณาหน้าจอสัมผัสอุปกรณ์ขนาดเดสก์ท็อปและคุณมีชุดของปัญหาที่แตกต่างกันเพื่อแก้ไข

โปรดทำให้แอปของคุณสามารถใช้งานได้โดยไม่ต้องใช้เมาส์ (เช่นไม่มีการแสดงตัวอย่างแบบโฮเวอร์)


1
นั่นคือสิ่งที่ฉันพยายามทำ ฉันกำลังพยายามสร้างอินเทอร์เฟซที่จะทำงานได้ดีที่สุดในแท็บเล็ตทั้งสอง (ไม่มีเมาส์) และด้วยเมาส์ แต่อินเทอร์เฟซเหล่านั้นแตกต่างกันมาก
Jon Gjengset

ฉันเห็นด้วยกับโบรดี้ คุณทำได้ดีที่สุดโดยใช้การตรวจจับอุปกรณ์ (เช่น DeviceAtlas) และเลือกส่วนต่อประสานที่มีให้ ณ เวลาโหลด
Teemu Ikonen

-4

ต้องการแนะนำสคริปต์ที่ช่วยฉัน:

ฉันได้อ่านและลองทุกอย่างที่แนะนำโดยไม่มีผลลัพธ์เพียงพอ

จากนั้นฉันทำการตรวจสอบเพิ่มเติมและพบรหัสนี้ - device.js

ฉันใช้สิ่งนี้ในเว็บไซต์ของลูกค้าของฉันเพื่อตรวจสอบการมีอยู่ของเมาส์:
( <html>ควรมีdesktopคลาส) และมันก็ค่อนข้างดีและสำหรับtouchการสนับสนุนฉันแค่ทำการตรวจสอบปกติ'ontouchend' in documentและใช้ข้อมูลจากการตรวจจับทั้งสองเพื่อรับสิ่งที่ฉันต้องการ


นั่นเทียบเท่ากับการสูดดม UA ยกหลายครั้งในหัวข้อนี้แล้ว ไม่สามารถแก้ไขกรณีของอุปกรณ์ด้วยเมาส์และสัมผัสเช่น Windows 8 และมันไม่ได้เป็นข้อพิสูจน์ในอนาคต
Hugo Silva

ฉันใช้มันเพื่อแก้ไขกรณีที่แน่นอนนี้ที่คุณพูดถึงในแอปพลิเคชันของลูกค้าและใช้งานได้ดี มันเป็นข้อพิสูจน์ในอนาคตเพราะมันเป็นของนักพัฒนา
vsync

2
กรณีที่ฉันกล่าวถึง (แล็ปท็อปที่เปิดใช้งานการสัมผัส) จะถูกระบุโดยสคริปต์ของคุณเป็น "เดสก์ท็อป" แม้ว่าฉันจะไม่สามารถใช้เมาส์ได้ก็ตาม "มันเป็นข้อพิสูจน์ในอนาคตเพราะมันได้รับการดูแลโดยนักพัฒนา" - ฉันคิดว่าคุณพลาดจุด "การพิสูจน์ในอนาคต" โดยสิ้นเชิงที่นี่ และถ้าคุณได้อ่านและลองทุกอย่างตามที่คุณพูดคุณจะสังเกตเห็นว่าคำตอบของ Gigi แสดงให้เห็นว่า UA ดมกลิ่นอยู่แล้ว
Hugo Silva

-7

เป็นความคิดที่ดีกว่าในการตรวจสอบว่ารองรับฟังก์ชั่นการใช้เมาส์โอเวอร์มากกว่าการตรวจจับประเภท OS / เบราว์เซอร์ คุณสามารถทำได้โดยทำดังต่อไปนี้:

if (element.mouseover) {
    //Supports the mouseover event
}

ตรวจสอบให้แน่ใจว่าคุณไม่ได้ทำสิ่งต่อไปนี้:

if (element.mouseover()) {
    // Supports the mouseover event
}

อันที่จริงจะเรียกวิธีการนี้แทนการตรวจสอบการมีอยู่ของมัน

คุณสามารถอ่านเพิ่มเติมได้ที่นี่: http://www.quirksmode.org/js/support.html


2
ฉันไม่รู้จริงๆว่าจะได้อะไรจากโพสต์ของคุณ แต่ถ้า ('onmouseover' ใน $ ('body') [0]) การแจ้งเตือน ('onmouseover'); แสดงข้อความใน iPhone ด้วย
nraynaud

1
สิ่งนี้จะตรวจสอบว่ามีการกำหนดฟังก์ชั่นการวางเมาส์ไว้หรือไม่ซึ่งจะอยู่ในเบราว์เซอร์เกือบทั้งหมด ไม่พบว่ามีเม้าส์จริงหรือไม่
Jon Gjengset
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.