無効な入力のイベント


234

どうやら障害者<input>はどのイベントでも処理されません

この問題を回避する方法はありますか?

<input type="text" disabled="disabled" name="test" value="test" />
$(':input').click(function () {
    $(this).removeAttr('disabled');
})

ここで、入力をクリックして有効にする必要があります。しかし、私がそれをアクティブにしない場合、入力は投稿されるべきではありません。



CSS-pretend-disableを使用して、onSubmitハンドラーの入力をループし、アクティブ化されていない入力を実際に無効にすることができます。
ptrk 2015

回答:


267

無効化された要素はマウスイベントを発生させません。ほとんどのブラウザーは、無効化された要素から発生したイベントをDOMツリーの上方に伝播するため、イベントハンドラーをコンテナー要素に配置できます。ただし、Firefoxはこの動作を示しません。無効になっている要素をクリックしても、まったく何もしません。

これ以上の解決策は考えられませんが、ブラウザ間の完全な互換性のために、無効な入力の前に要素を配置して、その要素のクリックをキャッチすることができます。これが私の意味の例です:

<div style="display:inline-block; position:relative;">
  <input type="text" disabled />
  <div style="position:absolute; left:0; right:0; top:0; bottom:0;"></div>
</div>​

jq:

$("div > div").click(function (evt) {
    $(this).hide().prev("input[disabled]").prop("disabled", false).focus();
});​

例:http : //jsfiddle.net/RXqAm/170/(のprop代わりに jQuery 1.7を使用するように更新attr


2
小さなこと:disabled値のない属性を使用している場合は、XHTMLではなくHTMLを意味します。この場合、終了スラッシュは不要です。
Tim Down

11
@Tim:確かにそれは不要ですが、それでも有効なHTMLです。本当に癖のある力で、見た目も良くなった気がします。
アンディE

1
アンディ、これはかなり賢いです。もっと簡単なのではないですか?無効化された入力が処理できない理由を知っていますか?
Pierre de LESPINAY、2010年

2
これは意味がありません。他のhtml要素はマウスイベントを処理しますが、無効化されていない要素(例:mouseenter等)ではありません
Augustin Riedinger '

7
input[disabled] {pointer-events:none}CSSを配置することにより、無効化された要素がクリックを「捨てる」のを防ぐことができます。その後、クリックは親要素をクリックしたかのように動作します。私見これは最もシンプルでクリーンなソリューションですが、残念ながらpointer-eventsCSSプロパティをサポートするブラウザーでのみ機能します。caniuse.com
Doin

70

フィールドを読み取り専用にして、送信時にすべての読み取り専用フィールドを無効にすることができます

$(".myform").submit(function(e) {
    $("input[readonly]", this).attr("disabled", true);
});

入力(+スクリプト)は

<input type="text" readonly="readonly" name="test" value="test" />

$('input[readonly]').click(function () {
    $(this).removeAttr('readonly');
})

5
+1、これはまともな代替案です。唯一の欠点は、入力ボックスが無効化されたスタイリングを引き受けないことです。これはブラウザー間で異なるため、無効化された入力に対するユーザーの期待と一致して見えるようにするのは難しいでしょう。
Andy E

本当。おそらくこれはCSSで回避できますか?しかし、はい、それは通常のdiabled入力フィールドと同じ外観を持っていない
Tokimon

優れた代替ソリューション。CSSで必要なスタイリングを行うことができる(つまり、LOOKを無効にする)ことができ、まだイベントを利用できるので、私はこれをより気に入っています。
ジョシュア

62

無効化された要素は、一部のブラウザーでクリックを「食べる」-それらに応答せず、要素またはそのコンテナーのいずれかでイベントハンドラーによってキャプチャーされることを許可しません。

これを "修正"する最も簡単でクリーンな方法(実際には、OPのように無効な要素のクリックをキャプチャする必要がある場合)は、次のCSSをページに追加するだけです。

input[disabled] {pointer-events:none}

これにより、無効化された入力のクリックが親要素に渡され、通常どおりにキャプチャできます。(無効になっている入力が複数ある場合、それらがまだそのようにレイアウトされていない場合は、それぞれを独自のコンテナーに追加することをお勧めします-追加<span>または<div>、たとえば-無効になっている入力を簡単に区別できるようにするためクリックされました)。


欠点は、pointer-eventsCSSプロパティをサポートしていない古いブラウザでは残念ながらこのトリックが機能しないことです。(IE 11、FF v3.6、Chrome v4で動作するはずです):caniuse.com/#search=pointer-events

古いブラウザをサポートする必要がある場合は、他の回答のいずれかを使用する必要があります!


input[disabled]JavaScript(element.disabled = true;)によって無効にされた要素にも一致するかどうかはわかりませんでしたが、一致するようです。とにかく、私はinput:disabledよりきれいです。
マーティン

これは良い解決策のようですが、IE11では機能しません!また、あなたはFF 38+とChrome 31+と言いますが、あなたのcaniuseリンクはFF 3.6+とChrome 4+を言いますか?
user764754 2017

@ user764754 ...私の間違いです。以前のバージョンのブラウザを取得するには、カヌースページで[すべて表示]をクリックする必要があることに気付きませんでした。修正しました。IE11については、テストしたところ、問題なく動作しました(コードについてはjsfiddle.net/7kkszq1c/1を参照してください。ただし、IE11ではjsFiddleサイトが機能しなかったため、に貼り付ける必要がありました。代わりにhtmファイル)
Doin

更新していただきありがとうございます!一方、IE11のWebサイトでは動作するがjsfiddleでは動作しないことも確認しました。jsfiddle iframeが原因かもしれません...
user764754

2
@Protectorone:disabledはCSS 3以降の疑似クラスです:w3.org/TR/css3-selectors/#UIstates
Martin

15

私は代替案を提案します-CSSを使用してください:

input.disabled {
    user-select : none;
    -moz-user-select : none;
    -webkit-user-select : none;
    color: gray;
    cursor: pointer;
}

disabled属性の代わりに。次に、無効な入力をシミュレートする独自のCSS属性を追加できますが、より詳細に制御できます。


4
ie10でのみ機能します。多くのユーザーがie9 / 8を使用しているため、信頼できる代替手段ではありません。
エンコード

これにより、フォームの送信時にフィールドが投稿されますが、これは多くの場合望ましくありません。
cimmanon

7

$(function() {

  $("input:disabled").closest("div").click(function() {
    $(this).find("input:disabled").attr("disabled", false).focus();
  });

});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>

<div>
  <input type="text" disabled />
</div>


5
しかし、これはFireFoxでは機能しません-そしてそれがすべてのポイントでした!
GarethOwen 2016年

6

の代わりにdisabled、の使用を検討できますreadonly。いくつかの追加のCSSを使用すると、入力のスタイルを設定して、disabledフィールドのます。

実際には別の問題があります。イベントchangeは、要素がフォーカスを失ったときにのみトリガーされdisabledます。これはフィールドを考慮したロジックではありません。おそらく、別の呼び出しからこのフィールドにデータをプッシュしています。これを機能させるには、イベント 'bind'を使用できます。

$('form').bind('change', 'input', function () {
    console.log('Do your thing.');
});

私が誤っていない限り、読み取り専用の入力は引き続きフォームとともに送信されます
Pierre de LESPINAY

そのとおりです。次に、@ npth anwsnerと組み合わせる必要があります。
Nykac 16

ありがとう、それは私の場合にはスマートでクリーンで最適でした。
スルタノス

4

またはjQueryとCSSでこれを行います!

$('input.disabled').attr('ignore','true').css({
    'pointer-events':'none',
     'color': 'gray'
});

このようにして、要素の表示を無効にし、ポインターイベントは発生しませんが、伝播は許可されます。送信された場合、属性 'ignore'を使用してそれを無視できます。


@Precastic、それは本当ですが、現時点では他のほとんどすべてのブラウザーで機能し、ie <11の場合はポリフィルを使用できます。sidonaldson、スタイルを適用するためにストレートCSSを使用しませんか?
KyleMit 2014年

@KyleMitスタイルを設定するのではなくクラスを追加することもできますが、それはこのスレッドの目的ではありません!私が提案しているのは、構築しているブラウザーマトリックスに応じて、適切で正しい答えであるポインターイベントだけです。そして、この答えをマークダウンしてくれたすべての人に感謝します。ここには何も間違っていないので、ちょっと

1
@sidonaldson、それは良い答えなので、私もそれがより高くランク付けされたことを望みます。アイム属性がありません無視わかりません。しかし、CSSについての私のポイントは、CSSを適用するための手段としてjQueryが必要であるとは思わないということでした。同じセレクターをターゲットとし、ポインターイベントを無効にするCSSルールを設定するだけで済みます。 このフィドルでは、jQueryとCSSは同じことを行う必要がありますが、CSSの方がはるかにパフォーマンスが高くなります。
KyleMit 2014年

@KyleMitああ、フォームが送信されたと仮定すると、値が含まれている場合はそのフィールドを無視するようにバックエンドに指示する必要があります(スプーフィングが無効になっているため)。
sidonaldson 2014年

属性に基づくセレクターを使用できるため、CSSの方が強力であることに同意します。クロム自身の無効フィールドに一致させたこのデモを確認してください:jsfiddle.net/KyleMit/pxx8pk6v
sidonaldson

0

今日はこのような問題がありましたが、HTMLを変更したくありませんでした。それで、私たちはmouseenterイベントを使ってそれを達成しました

var doThingsOnClick = function() {
    // your click function here
};

$(document).on({
    'mouseenter': function () {
        $(this).removeAttr('disabled').bind('click', doThingsOnClick);
    },
    'mouseleave': function () {
        $(this).unbind('click', doThingsOnClick).attr('disabled', 'disabled');
    },
}, 'input.disabled');

-1

私は別の解決策を見つけます:

<input type="text" class="disabled" name="test" value="test" />

クラス "disabled"は、不透明度によって無効化された要素を模倣します。

<style type="text/css">
    input.disabled {
        opacity: 0.5;
    }
</style>

そして、要素が無効になっている場合はイベントをキャンセルし、クラスを削除します。

$(document).on('click','input.disabled',function(event) {
    event.preventDefault();
    $(this).removeClass('disabled');
});

JavaScriptの部分は私のために動作しません。それ以外は、無効な入力を有効にすることに関する質問には答えません。ただし、この例では、最初は無効になっていないため、送信時に送信されます。
RaimundKrämer2015年

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.