17

focusOut(または) イベントからデフォルトのイベントを防止しblur、フォーカスを特定の入力フィールドに設定したままにします。

これは私がすでに試したことです:

  • 関数の最初と最後で使用event.preventDefault()する (スタイルのためではなく、テスト目的で)

  • return false;繁殖を防ぐ

  • 要素内で直接フォーカスを要素に戻します(ただし、関数の実行にフォーカススイッチが実行されるため、フォーカスがまだ切り替わることがわかりました。 を使用できることはわかっていますが、それを避けて心を理解したいと思います問題の。).on()setTimeout

  • blurの代わりに使用focusOut

私のコードはこれです:

    _triggerEventHide: function(inst, eventType) {
        inst.$target.on(eventType, function(event) {
            event.preventDefault();
            if (!$.suggestBox.$divCont.hasClass($.suggestBox.mouseOverClassName)) {
                $.suggestBox.$divCont.css({display: 'none'});   //reposition Suggestbox
            } else {
                inst.target.focus(); 
            }
            event.preventDefault();
            return false;
        });
     }

$targetは jQuery でラップされた要素をtarget表し、ネイティブ DOM 要素を表すことに注意してください。

私はいくつかの調査を行い、私の質問に関連する記事をすでにいくつか見つけましたが、どれもこの正確な質問に答えていません.

  1. preventDefault は focus イベントでは機能しません– ここで与えられた答えは、あらゆる種類のイベント操作を使用するための代替ルートです。

  2. 必要な値がない場合、フォーカスアウトのテキストボックスにフォーカスを戻す– ここでは、解決策は、フォーカスを元の要素に戻すために使用することでした。これで問題ありませんがsetTimeout()、問題の核心を理解したいと思います。preventDefault()ここで働いていません。

  3. jQuery preventDefault() が機能しないevent.stopImmediatePropagation()–やを使用するなど、このスレッドから考えられる解決策をいくつか試しevent.stop()ましたが、すべて無駄でした。

この問題に貢献した知識と解決策 (試みを含む) に感謝します。私は本当に学びたいです…</p>

問題を示すjsFiddleを次に示します。自由に試して、さまざまな解決策を試してください。

4

4 に答える 4

22

さらに調査した結果、特定のイベントのみが「キャンセル可能」であることがわかりました。

  • http://help.dottoro.com/ljwolcsp.phpより引用

    バージョン 9 より前の Internet Explorer を除くすべてのブラウザーで、cancelable プロパティを使用してイベントをキャンセルできるかどうかを確認できます。cancelable プロパティは Firefox にも存在しますが、イベントのキャンセル可能な状態に関係なく、常に true を返します。バージョン 9 より前の Internet Explorer でイベントをキャンセルできるかどうかを判断する方法はありません。

    キャンセル不可のイベントで preventDefault メソッドと returnValue プロパティを使用しても、エラーは発生しないことに注意してください。イベント ハンドラが false を返すと、イベントはキャンセルされます。preventDefault メソッドと returnValue プロパティの代わりに使用できます。以下の例 2 を参照してください。

  • JavaScript の各イベントには、イベントを防止できる場合は「true」、イベントをキャンセルできない場合は「false」として定義されるキャンセル可能なプロパティがあります。参考: http: //help.dottoro.com/ljeosnqv.php

  • このプロパティを示すhttp://help.dottoro.com/ljeosnqv.phpのサンプル スクリプトは、jsFiddle にあります(スペースを節約するため)。Firefox がイベント オブジェクトの cancelable プロパティに対して常に true を返す方法に関するコード内のコメントに注意してください。

一般的な原則は次のとおりです。

 $('selector').on(eventType, function (event) {
    alert(('cancelable' in event));   //will return true
    alert(event.cancelable);      //will return true if event can be cancelled
                                  //NOTE: Firefox mistakenly always returns true
});
  • イベントには、状況に応じて発生する順序があらかじめ設定されています。たとえば、マウス ボタンがクリックされた場合、eventTriggers の順序は、mousedown、mouseup、および click になります。参照: www.w3.org/TR/DOM-Level-2-Events/events.html#Events-Event-initMouseEvent

  • http://www.w3.org/TR/2003/NOTE-DOM-Level-3-Events-20031107/events.html#Events-flow-cancelationから引用

    「キャンセル可能なイベント」とは、DOM イベント フロー中にキャンセルできるデフォルト アクションに関連付けられたイベントです。イベント フロー中の任意の段階で、トリガーされたイベント リスナーには、デフォルト アクションをキャンセルするか、デフォルト アクションの続行を許可するオプションがあります。ブラウザーのハイパーリンクの場合、アクションをキャンセルすると、ハイパーリンクがアクティブ化されません。この仕様で定義されているすべてのイベントがキャンセル可能なイベントであるとは限りません。

  • イベントのシーケンスでは、キャンセルしようとしているイベントが表示される前に DOM のデフォルト アクションが発生する場合があります。このような場合、デフォルト アクションは既に発生しているためキャンセルできません。つまり、イベントのディスパッチ前にデフォルトのアクションが発生します。


私の解決策:

そうは言っても、私は自分の問題と多かれ少なかれこの問題の解決策を見つけることができました。基本的に、既に focusin の要素を持つ eventListener があり、この要素にフォーカスを維持させたいと考えていました。

<div id='display'></div>
$('#idBox').on('focusin', function () {
  $('#div').append('focused');
  //do something
}

最初に、クリックしたときにsetTimeoutイベントを使用しようとしましたが、focusinイベントが再びトリガーされたため、うまくいかないことがわかりました。したがって、必要なのは、フォーカスを切り替えるという DOM のデフォルト アクションの前にディスパッチされるイベントです。この要件を満たすイベントがあることがわかりましたが、IE でしか利用できません... 典型的なものです。参考までに、それは「onbeforedeactivate」であり、キャンセル可能です。ただし、ブラウザー間の互換性は重要であるため、この eventTrigger は使用しないでください。むしろ、DOM がフォーカス変更動作を開始する前にイベント mousedown が発生することがわかりました。

したがって、私たちができることは次のとおりです。

$(document).on('mousedown', function(event) { 
       target = event.target;     // the element clicked on
       myTarget = document.getElementById("idBox");   // the element to keep focus
       if (target !== myTarget) {   
           event.preventDefault();  //prevent default DOM action
           event.stopPropagation();   //stop bubbling
           return false;   // return
       }
});

他にも多くの方法があります。個人的には、ドキュメント全体に eventListener を設定するのは好きではありませんが、その目的を果たす基本を示すためです。


脚注: Javascript でのイベント処理の詳細については、http: //help.dottoro.com/ljtdqwlx.php を参照してください 。すばらしいリソースに出会いました。

于 2013-01-31T06:52:34.927 に答える
1

問題の原因はクリック機能であることはわかっています。したがって、Chrome などの通常のエクスプローラーでは、mousedown イベントを削除してから、Default を防止できます。

しかし、これは ie では機能しませんが、代わりに beforedeactivate イベントを使用できますhttp://msdn.microsoft.com/en-us/library/windows/apps/jj569321.aspx。つまり、フォーカスが変化しているときに検出できます。だからそれを防ぐだけです。

コードは次のようになります。

       $inp.on('blur', function(){

            self.hide();
        });

        isIE && $inp.on('beforedeactivate', function(evt){
            mousedown && evt.preventDefault();
        });

        $holder.on('mousedown', function(evt){
            evt.preventDefault();
            mousedown = 1;
        });
于 2014-07-22T10:04:15.717 に答える
-1
inst.$target.on("blur", function() {
     if (!$.suggestBox.$divCont.hasClass($.suggestBox.mouseOverClassName)) {
        $.suggestBox.$divCont.css({'display': 'none'});   //reposition Suggestbox
        return true;
        } 
      inst.target.focus();
      return false;
         });

あなたのhtmlを見る必要があります。私はあなたが物事を正しく呼んでいるとは思わないEX:

$.suggestBoxあるべきだと思いますが$(".suggestBox")、あなたのhtnlを見ないとわかりません

于 2013-01-30T21:22:04.313 に答える