Подія на вимкненому вході


234

Мабуть, інвалідом <input>не займається жодна подія

Чи є спосіб вирішити цю проблему?

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

Тут мені потрібно натиснути на вхід, щоб увімкнути його. Але якщо я не активую, вхід не повинен розміщуватися.


Ось хороша альтернативна blog.pengoworks.com/index.cfm/2010/4/23/…

Ви можете використовувати CSS-претендувати-відключити та перевести циклічні входи на обробник OnSubmit, відключивши неактивовані реально.
ptrk

Відповіді:


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/ (оновлено для використання jQuery 1.7 з propзамість attr).


2
Невелика річ: якщо ви використовуєте disabledатрибут без значення, це має на увазі HTML, а не XHTML, і в цьому випадку косої риски не потрібно.
Тім Даун

11
@Tim: справді це непотрібно, але він все ще дійсний HTML. Це справді сила звички, і я відчуваю, що це виглядає краще.
Енді Е

1
Thx Енді, це досить розумно. Хіба не простіше? Чи знаєте ви, чому потрібні входи не піддаються обробці?
П'єр де ЛЕСПІНАЙ

2
Це не має сенсу: будь-який інший html-елемент обробляє події миші, чому б не відключений елемент (наприклад mouseenter, і т . Д.)
Августин Рідінгер,

7
Ви можете зупинити відключений елемент від "викидання" кліків, ввівши input[disabled] {pointer-events:none}свій CSS. Тоді клацання поводиться так, ніби ви натиснули батьківський елемент. IMHO - це найпростіше, найчистіше рішення, але воно, на жаль, працює лише для браузерів, що підтримують pointer-eventsвластивість CSS: caniuse.com/#search=pointer-events
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, це гідна альтернативна пропозиція. Єдиним недоліком є ​​те, що поле введення не сприймає відключений стиль, який залежить від веб-переглядачів, тому було б важко зробити так, щоб він виглядав відповідно до очікувань користувача щодо вимкненого вводу.
Енді Е

правда. Можливо, це можна було б вирішити з CSS? Але так, це не матиме такий самий вигляд, як звичайні
ввімкнені

Відмінне альтернативне рішення. Мені це подобається більше, тому що ви можете робити будь-яку необхідну стилізацію за допомогою CSS (тобто зробити її LOOK вимкнено), але все ще доступні події.
Джошуа

62

Елементи з обмеженими можливостями "їдять" кліки в деяких браузерах - вони ні на них не реагують, ні дозволяють захоплювати обробниками подій будь-де на елементі чи будь-яких контейнерах.

IMHO, найпростіший і найпростіший спосіб "виправити" це (якщо вам справді потрібно зафіксувати кліки на відключених елементах, як це робить ОП) - це просто додати наступну CSS на свою сторінку:

input[disabled] {pointer-events:none}

Це призведе до потрапляння будь-яких клацань на відключений вхід до батьківського елемента, де ви можете їх нормально фіксувати. (Якщо у вас є кілька вимкнених входів, можливо, ви хочете помістити кожного в окремий власний контейнер, якщо вони вже не викладені таким чином - додатковий <span>або <div>, скажімо, - просто для того, щоб легко розрізнити, який введений інвалід відключений було натиснуто).


Мінус полягає в тому, що цей трюк, на жаль, не працює для старих браузерів, які не підтримують pointer-eventsвластивість CSS. (Це має працювати з 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+, але у вашому посиланні на каніусу написано FF 3.6+ та Chrome 4+?
user764754

@ user764754 ... моя помилка, я не усвідомлював, що мені потрібно натиснути "Показати все" на сторінці каніуси, щоб отримати більш ранні версії браузера! Виправили це. Що стосується IE11, я лише тестував його, і він працює чудово (див. Jsfiddle.net/7kkszq1c/1 щодо коду, хоча чомусь сайт jsFiddle не працював для мене в IE11, мені довелося вставити його в. htm файл замість цього)
Doin

Дякуємо за оновлення! Тим часом я також зауважував, що він працює на веб-сайті в IE11, але не з jsfiddle. Можливо, через jsfiddle iframe ...
user764754

2
@Protectorone: disabled - це псевдоклас з CSS 3: w3.org/TR/css3-selectors/#UIstates
Мартін

15

Я б запропонував альтернативу - використовуйте CSS:

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

замість атрибута вимкнено. Потім ви можете додати свої власні атрибути 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

6

Замість цього disabledможна подумати про використання readonly. За допомогою додаткових CSS ви можете стилізувати вхід, щоб він виглядав як disabledполе.

Насправді є ще одна проблема. Подія changeзапускається лише тоді, коли елемент втрачає фокус, що не є логікою щодо disabledполя. Можливо, ви натискаєте дані в це поле з іншого дзвінка. Щоб зробити цю роботу, ви можете використовувати подію «прив’язати».

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

Тільки для читання вхід по- , як і раніше буде передаватися з формою , якщо я не помиляюся
П'єр де LESPINAY

Це правильно. Потім його слід поєднувати з @npth anwsner.
Nykac

Дякую, це було розумно чистим та оптимальним для мого випадку.
Султанос

4

АБО зробіть це за допомогою jQuery та CSS!

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

Таким чином ви робите елемент вимкненим, і жодні події вказівника не запускатимуться, але він дозволяє розповсюдження, і якщо він наданий, ви можете використовувати атрибут 'ignore', щоб ігнорувати його.


@Precastic, це правда, але в цей момент він працює майже для всіх інших браузерів, і ви можете використовувати полі- заливку, тобто <11 . sidonaldson, чому б не використовувати прямий CSS для застосування стилів?
KyleMit

@KyleMit ви могли б додати клас, а не встановлювати стилі, але це не те, про що йдеться у цій темі! Я лише пропонував події вказівника, які все ще є хорошою і правильною відповіддю залежно від матриці браузера, для якої ви будуєте. І дякую всім, хто зазначив цю відповідь, що ніколи не смокче, оскільки тут нічого невірно: /
sidonaldson

1
@sidonaldson, Це хороша відповідь, тому я також бажаю, щоб вона була також вищою. Я не впевнений, що робить атрибут ignore . Але моя думка щодо CSS полягала в тому, що я не думаю, що нам потрібен jQuery, щоб стати засобом для застосування CSS. Ви можете просто встановити правило CSS, яке спрямоване на той самий селектор, а також вимкнено події вказівника. У цій скрипці jQuery і CSS повинні робити те саме, але CSS буде набагато ефективнішим.
KyleMit

@KyleMit ах, добре припускаючи, що форма подана, вам доведеться якось сказати бекенду, щоб ігнорувати це поле, якщо воно містило значення (оскільки ми підробку відключено).
sidonaldson

Я погоджуюся, що CSS може бути більш потужним, оскільки ви можете використовувати селектор на основі атрибута! Перевірте цю демонстрацію, де я зіставив хроми власного відключеного поля: jsfiddle.net/KyleMit/pxx8pk6v
sidonaldson

0

Сьогодні у нас була така проблема, але ми не хотіли змінювати HTML. Тож ми використовували події миші, щоб досягти цього

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" />

Клас "інвалід" імітує інвалідний елемент за непрозорістю:

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

А потім скасуйте подію, якщо елемент вимкнено та видаліть клас:

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

Частина JavaScript для мене не працює. Крім того, він не відповідає на запитання, оскільки йдеться про включення вимкненого вводу. Однак у цьому прикладі він не вимикається на початку, і, таким чином, його надсилають при подачі.
Raimund Krämer

-2

пропозиція і тут виглядає як хороший кандидат у цьому питанні

Виконання події клацання на відключеному елементі? Javascript jQuery

jQuery('input#submit').click(function(e) {
    if ( something ) {        
        return false;
    } 
});

Подія натискання, ймовірно, не відбудеться на відключених атрибутах.
Привіт Всесвіт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.