سؤال

أنا أقاتل مع سلوك JavaScript غريب جدًا على عنصر واجهة مستخدم JQuery UI أحاول إصلاحه. IE7 (Win XP) ، JQuery 1.2.6 (نعم ، إنه إصدار قديم).

الأدوات المصغرة عبارة عن صندوق التحرير والسرد ، والذي يلتقط أحداث لوحة المفاتيح وله سلوكيات خاصة لمفاتيح الأسهم.

عندما أحاول كتابة حرف "&" في حقل إدخال Flexbox ، أحصل على سلوك غريب.

يحتوي Flexbox على بعض التعليمات البرمجية مثل:

//initialization
$myInputElement.keypress($.flexbox.process_key);
$.flexbox.process_key = function process_key(e) {
    $.flexbox.flexboxFromInput(this).processKey(e);
    return true;
};

//on the flexbox object's prototype:
...
    processKey: function processKey(e) {
        var mod = 0;
            if (typeof (e.ctrlKey) !== 'undefined') {
                if (e.ctrlKey) mod |= 1;
                if (e.shiftKey) mod |= 2;
            } else {
                if (e.modifiers & Event.CONTROL_MASK) mod |= 1;
                if (e.modifiers & Event.SHIFT_MASK) mod |= 2;
            }
            ...
            switch (e.keyCode) {
                   case 38: // up
                       this.prevResult();
                       break;
                   case 40: // down
                       if (this.getCtr().is(':visible')) this.nextResult();
                       else this.flexboxDelay(true);
                       break;
               ...etc.
           }
    }
...

عندما أقدم بيان تسجيل ، ما أجده هو أن الضغط على "&" (Shift+7) ينتج ثلاثة أحداث Keypress:

INFO: Flexbox> processKey, keyCode=16, ctrl=false, shift=true
INFO: Flexbox> processKey, keyCode=55, ctrl=false, shift=true
INFO: Flexbox> processKey, keyCode=38, ctrl=false, shift=true

على ما يبدو ، KeyCode 38 هو مفتاح السهم UP ورمز ASCII لـ Ampersand ؟؟

بينما كنت أكتب هذا ، حدث لي أنه يمكنني اكتشاف keypress على أنه "Shift+7" (Keycode 55) لمعاملته كمفتاح Ampersand ، ثم قم بتعيين نوع من العلم لتجاهل المفتاح التالي (وهو 38 ). هذا يبدو وكأنه اختراق مروع.

هل لدى أي شخص طريقة أفضل للتمييز بين الشخصيات الخاصة مثل "&" ومفاتيح السهم في IE؟

هل كانت مفيدة؟

المحلول

هذا ما انتهى بي الأمر:

    /*
     * Hack around a wierd behavior in IE where "&%'(" have the same keyCodes
     * as the arrow keys.
     */
        if (keyCodeIn(e.keyCode, 55, 53, 57) && (mod & 2) && !(mod & 1)) {
            this.ignoreNextArrowKey = true;
        }
        else if (222 === e.keyCode && !(mod & 2) && !(mod & 1)) {
            this.ignoreNextArrowKey = true;
        }
        else if (keyCodeIn(e.keyCode, 38, 37, 39, 40) && this.ignoreNextArrowKey) {
            this.ignoreNextArrowKey = false;
            return;
        }

        //...

        function keyCodeIn(keyCode) {
            for(var i = 1; i < arguments.length; i++) {
                if (arguments[i] === keyCode) {
                    return true;
                }
            }
            return false;
        }

أتمنى أن يساعد هذا شخصًا ما. إذا كنت تقوم بإعادة استخدام هذا الرمز ، فقد تضطر إلى ضبط استخدامك للكلمة الرئيسية "هذا" ، اعتمادًا على الكائن الذي يشير إليه (هنا ، إنه كائن JavaScript مرتبط بعامل Flexbox).

تعديل: قمت بتحديث هذا الرمز ، وأزلت اختبار التعبير العادي الذي كان موجودًا سابقًا ، والذي اكتشفه كان عربات التي تجرها الدواب.

نصائح أخرى

أظن keydown قد يمنحك بيانات أكثر موثوقية من keypress.

أوصي باستخدام مكتبة jQuery هذه لكتابة معالجات مخصصة لـ keypresses:http://code.google.com/p/js-hotkeys/

محاولة تمييز الرموز الرئيسية منطقيا هو كابوس.

يقوم المفتاح لأعلى أو لأسفل بإرجاع رمز مفاتيح من 55 لـ '&' و 38 لـ 'Arrow Up'

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top