3

ここに jsfiddle があります: http://jsfiddle.net/zAFND/616

IE(私はIE9を使用しています)とfirefoxでフィドルを開くと、チェックボックスボタンをダブルクリックすると、オンになりますがオフになりません。ただし、Opera、Safari、Chrome で開いた場合は、ダブルクリックまたはすばやく連続してクリックすると問題なく動作します。

私の質問は、Firefox と IE9 ですばやく連続してクリックできるようにする方法です。

コード:

HTML:

<div id="ck-button"><label>
<input type="checkbox" name="options[]" id="optionA" value="A" /><span>A</span></label>
</div>

CSS:

#ck-button {
    margin:8px;
    background-color:#EFEFEF;
    border:1px solid #D0D0D0;
    overflow:auto;
    float:left;
    position: relative;
}

#ck-button label {
    float:left;
    width:4.0em;
    cursor:pointer;
}

#ck-button label span {
    text-align:center;
    padding:3px 0px;
    display:block;
}

#ck-button label input {
    position:absolute;
    top:-20px;
}

#ck-button input:checked + span {
    background-color:green;
    color:white;
}

Jquery/javasscript:

 $(document).ready(function(){
            $("body").css("-webkit-user-select","none");
            $("body").css("-moz-user-select","none");
            $("body").css("-ms-user-select","none");
            $("body").css("-o-user-select","none");
            $("body").css("user-select","none");
    });
4

2 に答える 2

3

これは Firefox のバグです。バグ 608180を参照してください- チェックボックス ラベルのダブル/クイック クリックが期待どおりに機能しない

IE には、歴史的な理由から (最近のバージョンでは修正されています)、ダブルクリックで2 番目mousedownとイベントをスキップするバグのあるイベント モデルがあります。バグ 263 を参照してください - IE の DoubleClick に注意してくださいclick

jQuery UI ボタン​​ ウィジェットのいくつかのバグを修正するプラグインを作成し、Firefox のバグを少し前に回避しました。jQuery 以外の UI ボタン​​に適用するのは難しくありません。

label重要な部分を抽出し、 s内のネストされたチェックボックスに適合させました。

(function () {
    var mdtarg, //last label mousedown target
        mdchecked, //checked property when mousedown fired
        fixedLabelSelector = '.fixedLabelCheckbox'; //edit as you see fit
    $(document).on('mousedown', fixedLabelSelector, function (e) {
        //only left clicks will toggle the label
        if (e.which !== 1) return;
        mdtarg = this;
        mdchecked = this.control ? this.control.checked : $(this).find('input')[0].checked;
        //reset mdtarg after mouseup finishes bubbling; prevents bugs with
        //incorrect mousedown-mouseup sequences e.g.
        //down IN label, up OUT, down OUT, up IN
        $(document).one('mouseup', function () {
            mdtarg = null;
        });
    }).on('mouseup', fixedLabelSelector, function (e) {
        if (e.which !== 1) return;
        if (mdtarg === this) {
            var ch = this.control || $(this).find('input')[0];
            //the click event is supposed to fire after the mouseup so
            //we wait until mouseup and click finish bubbling and check if it
            //had the desired effect
            setTimeout(function () {
                if (mdchecked === ch.checked) {
                    //else patch it manually
                    ch.checked = !ch.checked;
                    $(ch).change();
                }
            }, 0);
        }
    });
}());

Fiddleは Firefox でテスト済みです。

fixedLabelCheckbox上記のコードで修正したいチェックボックスを含むすべてのラベルにクラスを追加する必要があります。

スクリプトを配置する場所に関係なく機能し、ラベルに対応する委任されたクラス/セレクターがある限り、動的に追加されたチェックボックスも修正します。

他のライブラリを使用している場合、これは jQuery の外部にバインドされた変更ハンドラーを起動しない可能性があることに注意してください。

マークアップに余分なクラスを追加したくない場合は、このバージョンを使用できます (コードが増え、パフォーマンスが低下します)。

(function ($) {
    function getControl(lbl) { //fallback for non-HTML5 browsers if necessary
        return lbl.control || (lbl.htmlFor ? $('input[id="'+lbl.htmlFor+'"]')[0] : $(lbl).find('input')[0]);
    }
    var mdtarg, //last label mousedown target
        mdchecked; //checked property when mousedown fired
    $(document).on('mousedown', 'label', function (e) {
        //only left clicks will toggle the label
        if (e.which !== 1) return;
        var ch = getControl(this);
        if (!ch || ch.type !== 'checkbox') return;
        mdtarg = this;
        mdchecked = ch.checked;
        //reset mdtarg after mouseup finishes bubbling; prevents bugs with
        //incorrect mousedown-mouseup sequences e.g.
        //down IN label, up OUT, down OUT, up IN
        $(document).one('mouseup', function () {
            mdtarg = null;
        });
    }).on('mouseup', 'label', function (e) {
        if (e.which !== 1) return;
        if (mdtarg === this) {
            var ch = getControl(this);
            //the click event is supposed to fire after the mouseup so
            //we wait until mouseup and click finish bubbling and check if it
            //had the desired effect
            setTimeout(function () {
                if (mdchecked === ch.checked) {
                    //else patch it manually
                    ch.checked = !ch.checked;
                    $(ch).change();
                }
            }, 0);
        }
    });
}(jQuery));

フィドル

上記のコードからわかるように、このバージョンはfor、余分なマークアップを追加することなく、ラベルの属性とラベル内のネストされた入力の両方で動作するはずです。


選択の無効化について:user-select質問にコメントされているように CSS に を配置するか、または をサポートしていないブラウザーuser-selectも懸念される場合は、選択を無効にするすべてのラベルにこの回答を適用できます。

于 2013-02-09T00:37:18.750 に答える
0

ブラウザ検出を追加してから、IE または Firefox の場合は、JS を介してondblclickイベントを追加して、チェックボックスを反転させることができます。

click一部のブラウザー (Safari、Chrome) は 2 つの と aを送信し、他のブラウザーdblclick(IE、Firefox) は 1 つと 1clickつののみを送信するため、無条件に設定することはできませんdblclick。前者では、2 つのclickイベントによってフィールドが 2 回反転します。後者では、1 つのclickイベントのみが発生するため、フィールドは 1 回だけ反転されます。dblclickこれを軽減するには、フィールドを反転して、2 回のクリックで偶数回反転するようにする必要があります。

お役に立てれば!!

于 2013-02-09T00:34:47.500 に答える