كيف يمكن منع السهم للأعلى السلوك الافتراضي / لأسفل في الحقل النصي؟

StackOverflow https://stackoverflow.com/questions/1018259

سؤال

وأنا على صنع حقل إدخال الكلمات الرئيسية، وعلى الرغم من المستخدمين كتابة أنا عرض اقتراحات لالكلمة على لائحة تحت موقف الإقحام. حقل الإدخال هو سطر واحد، لذلك أنا باستخدام السهم حتى مفتاح / لأسفل لتحديد اقتراح وأدخل لإدراجها. وانها تعمل في الغالب، مع استثناء الكبير الذي لأعلى / أسفل مفتاح أيضا إلى تغيير موقف الإقحام إلى بداية / نهاية من TextField.

ولقد حاولت استخدام preventDefault() وstopImmediatePropagation() في المستمع الحدث KeyboardEvent.KEY_DOWN أنني أيضا استخدامها لتغيير الاقتراح المحدد، ولكن هذا لا يغير شيئا. راجعت كاريت لم تتحرك حتى الآن عندما يتم تشغيل الحدث KeyboardEvent.KEY_DOWN، بو بصريا أستطيع أن أرى أنه يجري هو الافراج الخطوة قبل المفتاح (مفتاح متابعة).

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

وهكذا لا أحد يعرف كيفية منع السلوك الافتراضي؟

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

المحلول

وأنت لا تستطيع أن تمنع ذلك، ولكن يمكنك عكس ذلك. للقيام بذلك إضافة إلى معالجات مع أولويات مختلفة لنفس الحدث - KeyboardEvent.DOWN. واحد قبل تنفيذ الحقل النصي، ووحفظ الفهارس اختيار والآخر بعد، استعادتها. العمل كود يلي:

    import flash.events.Event;
    import flash.events.KeyboardEvent;
    import flash.ui.Keyboard;

    import mx.controls.TextInput;
    import mx.events.FlexEvent;

    public class FooledTextInput extends TextInput
    {
        private var ssi : int = 0;
        private var sei : int = 0;

        public function FooledTextInput()
        {
            super();

            this.addEventListener(KeyboardEvent.KEY_DOWN, onBeforeKeyDown, false, 10000);
            this.addEventListener(KeyboardEvent.KEY_DOWN, onAfterKeyDown, false, -10000);
        }

        private function onBeforeKeyDown(e : KeyboardEvent) : void
        {
            if (e.keyCode == Keyboard.UP || e.keyCode == Keyboard.DOWN)
            {
                ssi = this.selectionBeginIndex;
                sei = this.selectionEndIndex;
            }   
        } 

        private function onAfterKeyDown(e : KeyboardEvent) : void
        {
            if (e.keyCode == Keyboard.UP || e.keyCode == Keyboard.DOWN)
            {
                this.setSelection(ssi, sei);
            }   
        } 
    }

وقد ترغب أسماء أفضل لمباحث أمن الدولة (اختيار مؤشر بداية) ومعهد استوكهولم للبيئة (مؤشر نهاية الاختيار)، وكنت كسول للعثور على بعض. أعتقد أن هذا الحل يقوم على منصب اليكس Harui، لا أتذكر بالضبط، لكنه حصل على الكثير من الخير فليكس الاشياء ذات الصلة على بلوق له.

<القوي> UPDATE: بالنسبة الشرارة TextInput، ومنع ليس ممكنا فحسب، فمن السهل حقا. كل ما عليك القيام به هو التقاط الحدث في مرحلة القبض ووقف انتشار. الرمز:

package
{
    import flash.events.KeyboardEvent;
    import flash.ui.Keyboard;

    import spark.components.TextInput;

    public class HackedTextInput extends TextInput
    {
        public function HackedTextInput()
        {
            super();
            addEventListener(KeyboardEvent.KEY_DOWN, onBeforeKeyDown, true);
        }

        private function onBeforeKeyDown(e:KeyboardEvent) : void
        {
            if (e.keyCode == Keyboard.UP || e.keyCode == Keyboard.DOWN)
            {
                e.stopImmediatePropagation();
            }   
        }  
    }
}

ملاحظة المعلمة الأخيرة في دعوة addEventListener، التي من المقرر أن صحيح من أجل المعالج ليتم استدعاؤها في مرحلة الالتقاط. للأسف هذا الحل لا يعمل لMX TextInput، فقط لشرارة واحدة.

نصائح أخرى

ولقد نشرت حلا لهذه المشكلة هنا:
: setSelection سهم لأعلى تجاوز

والحل عن طريق الخطأ واحد في الكثير هو فضول - I didnlt تفكر في استخدام الأولويات. بدلا من ذلك، استفادت من المراحل المختلفة لعملية الحدث. وكانت مشكلة بالنسبة لي أن تقرر ما إذا كانت مفاتيح الأسهم يجب أن تتقدم أو تتراجع حرف واحد ضمن حقل نص معين، أو القفز إلى الحقل التالي أو السابق في النموذج.

أولا، تجاوز الحدث المرحلة في التعامل مع مفاتيح:

stage.addEventListener(KeyboardEvent.KEY_UP, typing);
// Sneak in before the normal processing handles right and left arrow keystrokes.
stage.addEventListener(KeyboardEvent.KEY_DOWN, pretyping, true, 10); 

وعلما بأنني سوف نقوم بمعالجة كل مفتاح مرتين - قبل يفعل النظام انها سحر (يسمى pretyping قبل KEY_DOWN) حتى أستطيع أن أرى حيث الإقحام هو قبل يتحرك فلاش ذلك، وبعد نظام يعالج ذلك (مع الكتابة، ودعا بعد KEY_UP).

/** Capture prior state of text field so we can later tell if user should tab to next field or previous field. */
private function pretyping(evt:KeyboardEvent):void {
    var keyString:String = Configuration.getKeyString(evt);
    if (isFocusInTextBox()) {
        var tf:TextField = getFocus() as TextField;
        capturePhaseCaret = tf.caretIndex;
    }
}

وgetKeyString هو أسلوب من الألغام - كل ما يفعله هو تحويل تلك الرموز في فن الإستذكار مريحة. وisFocusInTextBox هي دعوة لمدير تركيزي - I استبدال مدير التركيز المعياري للتغلب على مشكلات فلاش أخرى. أنا فقط بحاجة إلى معرفة ما إذا كان الشيء هو حقل النص أم لا.

التالي لدي لمعالجة المفتاح بعد فلاش انتقلت بالفعل الإقحام وربما قفز الى حقل جديد، وذلك بالنظر إلى حالة سابقة، أن يقرر ما فعله فلاش والتراجع، وبعد ذلك تفعل ما يجب أن يحدث. مهمتي "كتابة" لديها الكثير من الاشياء لا حاجة لهذه المناقشة، ولكن الشيء المهم ما يفعله هو استدعاء allowKeyMapping. allowKeyMapping يقرر إذا دخل المستخدم إلى الأمام السهم (أو السهم لأسفل) من موقع الحرف الأخير في حقل النص، أو دخلت إلى الخلف السهم منذ البداية. إذا كان الأمر كذلك، "الكتابة" إرادة علامة التبويب إلى الحقل التالي أو السابق، على التوالي.

    /** Prefer default behavior and do not allow certain kestrokes to be reinterpreted by key mappings, such as left and right cursor keys in text boxes. */
    private function allowKeyMapping(keyString:String) {
        var allow:Boolean;
        // If focus is in a text field, allow right arrow to advance to next field only if caret is at end of text.
        // Conversely, allow left arrow to back up to previous field only if caret is at beginning of text.
        // The trick is that the normal processing of keystrokes by TextFields occurs before this method is called,
        // so we need to know the caret position from before the key was pressed, which we have stored in capturePhaseCaret, set in pretyping.
        if (isDragging) {
            allow = false;
        }
        else if (isFocusInTextBox()) {
            var tf:TextField = getFocus() as TextField;
            if (keyString == Configuration.LEFT_CURSOR_KEY) {
                allow = tf.caretIndex == 0 && capturePhaseCaret == 0;
            }
            else if (keyString == Configuration.RIGHT_CURSOR_KEY) {
                allow = tf.caretIndex == tf.text.length && capturePhaseCaret == tf.text.length;
            }
            else {
                allow = true;
            }
        }
        else {
            allow = true;
        }
        return allow;
    }

وأنا آسف لأني لم يكن لديك مثال المدمجة أعد. أنا مجرد التفكير أنه من المهم أن نؤكد أن تتمكن من الحصول على حوالي ميل فلاش للقيام بهذه الأمور بالنسبة لك إذا كنت تريد لهم أن يحدث أم لا.

ويمكن أن يكون هناك بعض التأثير نفض الغبار مع حل علة واحد في الكثير من.

وهناك حل العاملة وخدعة جيدة باستخدام stage.invalidate() ومرحلة في Event.RENDER هو موضح هنا:

AS3

: setSelection سهم لأعلى تجاوز

وهذا هو الحل بلدي لهذه المشكلة. أنا متأكد من أن هناك طريقة أفضل لكنها ربما تحتاج إلى توسيع السيطرة TextInput.

private function onKeyDown(event:KeyboardEvent):void
{
    if(event.keyCode == flash.ui.Keyboard.UP)
    {
        var begin:int = textinput.selectionBeginIndex;
        var end:int = textinput.selectionEndIndex;
        textinput.setSelection(begin,end);
    }
}

وليس مثير لكنه يعمل.

وقبل الحدث الافتراضي هي الأولوية 0 على UIComponent حتى تتمكن من وقف دائما وقف حدوث شيء ما، وهنا منع جميع KeyboardEvent.KEY_DOWN

yourObject.addEventListener(KeyboardEvent.KEY_DOWN, _preventDefault, false, 1, true );
private function _preventDefault(event:KeyboardEvent):void 
{
event.preventDefault();
event.stopImmediatePropagation();
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top