วิธีข้ามเบราว์เซอร์ที่ดีที่สุดในการจับภาพ CTRL + S ด้วย JQuery


162

ผู้ใช้ของฉันต้องการกดCtrl+ Sเพื่อบันทึกแบบฟอร์ม มีวิธีข้ามเบราว์เซอร์ที่ดีในการจับภาพชุดCtrl+ Sและส่งแบบฟอร์มของฉันหรือไม่

แอปสร้างขึ้นบน Drupal ดังนั้นจึงสามารถใช้ jQuery ได้

คำตอบ:


121
$(window).keypress(function(event) {
    if (!(event.which == 115 && event.ctrlKey) && !(event.which == 19)) return true;
    alert("Ctrl-S pressed");
    event.preventDefault();
    return false;
});

รหัสคีย์อาจแตกต่างกันระหว่างเบราว์เซอร์ดังนั้นคุณอาจต้องตรวจสอบมากกว่า 115 ข้อ


5
บน OS X webkit เบราว์เซอร์ cmd + s ส่งคืน 19 ดังนั้นจึงควรตรวจสอบด้วยเช่นกัน นั่นคือ if (! (event.which == 115 && event.ctrlKey) &&! (event.which == 19)) คืนค่าจริง
Tadas T

6
ใช้งานได้กับ Firefox สำหรับฉันเท่านั้น IE9 & Chrome ไม่ได้ลงทะเบียนปุ่มกดใด ๆ
pelms

7
แม้จะมี $ (เอกสาร) .keypress (แทนที่จะเป็น $ (หน้าต่าง) .keypress), IE และ Chrome ยังคงคว้าเหตุการณ์การกดปุ่มด้วย 'Ctrl' ก่อนที่สคริปต์จะทำ
pelms

16
ใช้keydownแทนkeypressในโครเมี่ยม
Destan

3
น่าเสียดายที่มันล้าสมัย
Cannicide

250

สิ่งนี้ใช้ได้กับฉัน (ใช้ jquery) เพื่อโอเวอร์โหลดCtrl+ S, Ctrl+ FและCtrl+ G:

$(window).bind('keydown', function(event) {
    if (event.ctrlKey || event.metaKey) {
        switch (String.fromCharCode(event.which).toLowerCase()) {
        case 's':
            event.preventDefault();
            alert('ctrl-s');
            break;
        case 'f':
            event.preventDefault();
            alert('ctrl-f');
            break;
        case 'g':
            event.preventDefault();
            alert('ctrl-g');
            break;
        }
    }
});

8
นี่เป็นคำตอบเดียวที่ทำงานกับฉันในทุกเบราว์เซอร์ที่ฉันทดสอบรวมถึง Chrome เวอร์ชัน 28.0.1500.71
T. Brian Jones

27
ทำได้ด้วย JS ที่แท้จริงถ้าคุณใช้window.addEventListener(แทน$(window).bind(

2
@NatesS หากคุณลบการแจ้งเตือนจะไม่เปิดกล่องโต้ตอบบันทึก มันเกิดจากการแจ้งเตือน ทำงานได้ดีสำหรับฉันในเบราว์เซอร์ทั้งหมด วิธีแก้ปัญหาที่ดี
CrazyNooB

2
ทำงานให้ฉัน โปรดยอมรับคำตอบนี้มากกว่าคำตอบข้างต้น
pavanw3b

1
@Fireflight: an else ifจะไม่ทำงานเนื่องจากข้อความต้นฉบับifจะถูกประเมินว่าเป็นจริงแล้ว คุณจะต้องใส่รหัสของคุณก่อนที่เดิมคำสั่งเปลี่ยนเดิมในif else if
Danny Ruijters

34

คุณสามารถใช้ไลบรารีทางลัดเพื่อจัดการกับสิ่งที่เฉพาะเจาะจงของเบราว์เซอร์

shortcut.add("Ctrl+S",function() {
    alert("Hi there!");
});

7
สิ่งนี้ถูกแปลงเป็นปลั๊กอิน jQuery แยกและเติมแล้วและตอนนี้รองรับ 1.6.x: github.com/ricardovaleriano/jquery.hotkeys
Félix Saparelli

12
สำหรับเพื่อนชาว Google URL ที่อัปเดตสำหรับปลั๊กอิน jQuery คือ: github.com/jeresig/jquery.hotkeys
bgs264

29

วิธีการแก้ปัญหา jQuery นี้ทำงานสำหรับฉันใน Chrome และ Firefox สำหรับทั้งCtrl+ Sและ+CmdS

$(document).keydown(function(e) {

    var key = undefined;
    var possible = [ e.key, e.keyIdentifier, e.keyCode, e.which ];

    while (key === undefined && possible.length > 0)
    {
        key = possible.pop();
    }

    if (key && (key == '115' || key == '83' ) && (e.ctrlKey || e.metaKey) && !(e.altKey))
    {
        e.preventDefault();
        alert("Ctrl-s pressed");
        return false;
    }
    return true;
}); 

1
นี่เป็นทางออกเดียวที่ทำงานอย่างถูกต้องที่นี่ ขอบคุณมาก!
Stephan Weinhold

1
สิ่งนี้อาจล้าสมัยแล้ว: ใช้e.keyแทนe.which;
Cannicide

อัปเดต 14 พฤษภาคม 2560 สำหรับมาตรฐานที่ทันสมัย
Alan Bellows

28

อันนี้ใช้งานได้กับฉันใน Chrome ... ด้วยเหตุผลบางอย่างevent.whichส่งคืนทุน S (83) สำหรับฉันไม่แน่ใจว่าทำไม (โดยไม่คำนึงถึงสถานะการล็อคแคป) ดังนั้นฉันจึงใช้fromCharCodeและtoLowerCaseอยู่ในที่ปลอดภัย

$(document).keydown(function(event) {

    //19 for Mac Command+S
    if (!( String.fromCharCode(event.which).toLowerCase() == 's' && event.ctrlKey) && !(event.which == 19)) return true;

    alert("Ctrl-s pressed");

    event.preventDefault();
    return false;
});

หากใครรู้ว่าทำไมฉันถึงได้83และไม่ใช่115ฉันก็ยินดีที่จะได้ยินเช่นกันถ้ามีคนทำการทดสอบบนเบราว์เซอร์อื่นฉันก็ยินดีที่จะได้ยินถ้ามันใช้งานได้หรือไม่


ฉันมีปัญหาเดียวกันกับโครเมี่ยม ช่างเป็นความเจ็บปวด!
qodeninja

PS ตอนนี้ที่ฉันมองไปที่มันฉันคิดว่าป้องกันไม่ให้ซ้ำซ้อนเป็นผลตอบแทนทริกเกอร์เท็จมัน (และ stopPropagation) แต่ไม่แน่ใจว่ามันเป็นเรื่องสำคัญมากสำหรับคำถามที่ว่า
Eran เมดาน

7

ฉันรวมตัวเลือกต่าง ๆ เพื่อรองรับ FireFox, IE และ Chrome ฉันได้อัปเดตแล้วเพื่อให้รองรับ mac ได้ดียิ่งขึ้น

// simply disables save event for chrome
$(window).keypress(function (event) {
    if (!(event.which == 115 && (navigator.platform.match("Mac") ? event.metaKey : event.ctrlKey)) && !(event.which == 19)) return true;
    event.preventDefault();
    return false;
});

// used to process the cmd+s and ctrl+s events
$(document).keydown(function (event) {
     if (event.which == 83 && (navigator.platform.match("Mac") ? event.metaKey : event.ctrlKey)) {
        event.preventDefault();
        save(event);
        return false;
     }
});

5

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

หากคุณต้องการแป้นพิมพ์ลัดให้ใช้accesskeyคุณสมบัติ กรุณาอย่าทำลายฟังก์ชั่นเบราว์เซอร์ที่มีอยู่


2
ฉันเห็นด้วยอย่างสิ้นเชิง แต่น่าเสียดายที่ฉันเป็นคนใช้ไม่ได้กับผู้มีอำนาจตัดสินใจ
ceejayoz

24
จริง แต่ CTRL + S ไม่ใช่คุณสมบัติที่ใช้บ่อย ฉันสงสัยว่าคนอื่นจะคิดถึงมันโดยเฉพาะถ้ามันหมายความว่าคุณสามารถบันทึกไฟล์ของคุณใน webapp ของคุณ
EndangeredMassa

13
ปกติฉันเห็นด้วยกับคุณ แต่ครั้งเดียวที่ฉันเคยใช้ ctrl-s ในเบราว์เซอร์คือเมื่อฉันลืมฉันใช้ webapp และคาดว่าทางลัดในการทำสิ่งที่มีประโยชน์ ปกติฉันจะผิดหวัง Gmail จะบันทึกอีเมลของคุณเมื่อคุณกดปุ่ม ctrl แม้ว่าคุณจะไม่เคยสังเกตเห็นเพราะเมื่อมันทำสิ่งที่คุณคาดหวังและสิ่งที่แอปเดสก์ท็อปทุกตัวทำคุณจะไม่สังเกตเห็นจริงๆ คุณสังเกตเห็นเมื่อมันคิดว่าคุณต้องการบันทึก Gmail เป็น HTML และมันน่ารำคาญ
Carson Myers

4
ขึ้นอยู่กับแอพพลิเคชั่น ฉันกำลังสร้างแอปพลิเคชันเว็บเทอร์มินัลอีมูเลเตอร์และการเอาชนะ ctrl + c ดูเหมือนว่าใช้ได้จริงหากไม่จำเป็น
Brack

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

4

@Eevee: เนื่องจากเบราว์เซอร์กลายเป็นบ้านของฟังก์ชันการทำงานที่สมบูรณ์ยิ่งขึ้นและเริ่มแทนที่แอพเดสก์ท็อปมันจะไม่เป็นตัวเลือกที่จะยกเลิกการใช้แป้นพิมพ์ลัด ชุดคำสั่งแป้นพิมพ์ที่หลากหลายและใช้งานง่ายของ Gmail เป็นเครื่องมือที่ฉันตั้งใจจะละทิ้ง Outlook แป้นพิมพ์ลัดใน Todoist, Google Reader และ Google Calendar ล้วนทำให้ชีวิตของฉันง่ายขึ้นมากขึ้นทุกวัน

นักพัฒนาควรระวังไม่ให้แทนที่การกดแป้นที่มีความหมายในเบราว์เซอร์แล้ว ตัวอย่างเช่นกล่องข้อความ WMD ที่ฉันกำลังพิมพ์แปลความหมายCtrl+ Delเป็น "Blockquote" อย่างลึกลับแทน "ลบคำไปข้างหน้า" ฉันอยากรู้ว่ามีรายการมาตรฐานทางลัด "ปลอดภัยสำหรับเบราว์เซอร์" ที่นักพัฒนาไซต์สามารถใช้งานได้หรือไม่และเบราว์เซอร์จะให้คำมั่นว่าจะไม่อยู่ในเวอร์ชันต่อ ๆ ไป


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

3

$(document).keydown(function(e) {
    if ((e.key == 's' || e.key == 'S' ) && (e.ctrlKey || e.metaKey))
    {
        e.preventDefault();
        alert("Ctrl-s pressed");
        return false;
    }
    return true;
}); 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
Try pressing ctrl+s somewhere.

นี้เป็นรุ่นที่ขึ้นไปวันที่ @ คำตอบของ AlanBellows แทนที่ด้วยwhich keyนอกจากนี้ยังสามารถใช้งานได้กับปุ่มลัดของ Chrome (ซึ่งหากคุณกดCtrl+ Sมันจะส่งตัวพิมพ์ใหญ่ S แทนตัวอักษร) ใช้งานได้ในเบราว์เซอร์ที่ทันสมัยทั้งหมด


หากต้องการทดสอบสิ่งนี้ให้คลิกภายในกล่องตัวอย่างแล้วกด Ctrl + S
Cannicide

1

นี่เป็นวิธีแก้ปัญหาของฉันซึ่งอ่านง่ายกว่าคำแนะนำอื่น ๆ ที่นี่สามารถรวมคีย์ผสมอื่น ๆ ได้อย่างง่ายดายและผ่านการทดสอบบน IE, Chrome และ Firefox:

$(window).keydown(function(evt) {
    var key = String.fromCharCode(evt.keyCode);
    //ctrl+s
    if (key.toLowerCase() === "s" && evt.ctrlKey) {
        fnToRun();
        evt.preventDefault(true);
        return false;
    }
    return true;
});

1
+1 String.fromCharCodeสำหรับการใช้งานของ แม้ว่า Macs จะไม่มีคีย์ควบคุม evt.metaKeyการทดสอบสำหรับคีย์คำสั่งด้วย มันกลับมาtrueสำหรับ Cmd บน Mac และ Win บน Windows
KatoFett


0

สิ่งนี้ควรใช้งานได้ (ดัดแปลงมาจากhttps://stackoverflow.com/a/8285722/388902 )

var ctrl_down = false;
var ctrl_key = 17;
var s_key = 83;

$(document).keydown(function(e) {
    if (e.keyCode == ctrl_key) ctrl_down = true;
}).keyup(function(e) {
    if (e.keyCode == ctrl_key) ctrl_down = false;
});

$(document).keydown(function(e) {
    if (ctrl_down && (e.keyCode == s_key)) {
        alert('Ctrl-s pressed');
        // Your code
        return false;
    }
}); 


0

ถึงคำตอบของ Alan Bellows:! (e.altKey) สำหรับผู้ใช้ที่ใช้AltGrเมื่อพิมพ์ (เช่นโปแลนด์) หากไม่มีการกดAltGr+ Sจะให้ผลเหมือนกับCtrl+S

$(document).keydown(function(e) {
if ((e.which == '115' || e.which == '83' ) && (e.ctrlKey || e.metaKey) && !(e.altKey))
{
    e.preventDefault();
    alert("Ctrl-s pressed");
    return false;
}
return true; });

0

ปลั๊กอินนี้สร้างโดยฉันอาจมีประโยชน์

เสียบเข้าไป

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

simulatorControl([17,83], function(){
 console.log('You have pressed Ctrl+Z');
});

ในรหัสที่ฉันได้แสดงวิธีการดำเนินการสำหรับ+Ctrl Sคุณจะได้รับเอกสารรายละเอียดเกี่ยวกับลิงค์ ปลั๊กอินอยู่ในส่วนรหัส JavaScript ของปากกาของฉันบน Codepen


0

ฉันแก้ไขปัญหาของฉันในIEโดยใช้alert("With a message")เพื่อป้องกันพฤติกรรมเริ่มต้น:

window.addEventListener("keydown", function (e) {
    if(e.ctrlKey || e.metaKey){
        e.preventDefault(); //Good browsers
        if (navigator.userAgent.indexOf('MSIE') !== -1 || navigator.appVersion.indexOf('Trident/') > 0) { //hack for ie
            alert("Please, use the print button located on the top bar");
            return;
        }
    }
});
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.