LINUX.ORG.RU

Глупые вопросы начинающего

 ,


0

2

Здравствуйте, уважаемые. Нужно при нажатии на один конкретный checkbox отключить остальные checkbox'ы. То есть поставили галку на конкретный checkbox, остальные при этом стали disabled, сняли галку - они стали enabled.

Подскажите, как будет правильнее писать:

var checkboxState = false;

foo = function(){
    checkboxState = !checkboxState;
    $('.otherCheckboxes').attr('disabled', checkboxState );
}

Не правильно. Нужно писать так:

foo = function(){
    if($('.someCheckbox').is(':checked')) {
        $('.otherCheckboxes').removeAttr('disabled');
    }
}

И вообще может и тот, и другой способ не правильные? Покажите как нужно.

Мне втирали, что первый способ в корне не верный. И, ни разу не видели, чтоб с помощью логического отрицания меняли состояние чего-либо. Заранее спасибо.

при нажатии на checkbox менять состояние checkbox'а.

А он сам без js так не умеет?

risenshnobel ★★★ ()
Ответ на: комментарий от risenshnobel

Я не точно написал. Нужно при нажатии на один конкретный checkbox отключить остальные checkbox's. То есть поставили галку на конкретный checkbox, остальные при этом стали disabled, сняли галку - они стали enabled.

TigranElGrande ()

А что в первом способе в корне неверного — не втёрли?

В первом способе создаётся лишняя переменная. Во втором способе обходятся без неё за счёт некоторой многословности. Можно совместить оба:

    $('.someCheckbox').attr('disabled', $('.someCheckbox').is(':checked'));

Каких-то проблем между этими способами я не вижу, всё на уровне «нравится-не нравится». Вообще такими спорами занимаются не от большого ума, делайте работу, а не тратьте время на ерунду.

Единственное замечание — надеюсь, что в первом случае переменная не глобальная. Если глобальная, то лучше этого избегать.

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

Ну можешь взять с них деньги за обучение программированию. Теперь видели, пусть применяют на практике.

Legioner ★★★★★ ()
Последнее исправление: Legioner (всего исправлений: 3)
Ответ на: комментарий от Legioner

Я, конечно, только начинающий, но как то не по себе стало, когда сказали что я глупость написал и что это кошмар. Это начальник у меня так отреагировала. Переменная не глобальная. она только в одном месте используется. Я потом переделал так же, как ты предложил, но сказали, что все равно не правильно. При чем без компромиссов.

TigranElGrande ()
Ответ на: комментарий от TigranElGrande

Если работает, значит как минимум уже не неправильно. Возможно у вас в проекте принят какой-то стиль написания кода. Может jquery запрещён или про него никто не знает. Может у начальницы сложный период в жизни. Наверное лучше у неё спросить, что ей надо, хотя может телепаты в треде появятся.

Legioner ★★★★★ ()
Последнее исправление: Legioner (всего исправлений: 1)
Ответ на: комментарий от Legioner

jquery используется:) Я как то заикнулся про мьютексы и многопоточность, так на меня посмотрели как на врага народа с вопросами что это такое:D Да, я начал с PHP и попал в команду к PHP'шникам)))

TigranElGrande ()

если переменная в случае 1 - глобальная, то скорее всего это чуток лишнее, а так - пофиг. вообще - меньше переменных - легче дышать, но сказать чтобы «в корне неверный», да ещё не потому что переменная, а потому что отрицание - это пожалуй, в рамки разумного не вмещается слегка.

UPD. ещё раз глянул - ну там ведь у тебя переменная явно лишняя. я не прав. если бы я делал ревью, я бы такое не пропустил тоже потому что это источник ошибки.

AndreyKl ★★★★★ ()
Последнее исправление: AndreyKl (всего исправлений: 1)

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

PolarFox ★★★★★ ()

disabled элементы не передаются с формой, надо делать readonly

Goury ★★★★★ ()
Ответ на: комментарий от Goury

нет, надо добавлять дополнительно <input type=«hidden» перед чекбоксом, тогда значение будет отправляться нормально

kiotoze ★★★★ ()

Чем не устраивает input type radio?

anonymous ()
Ответ на: комментарий от TigranElGrande

Нужно при нажатии на один конкретный checkbox отключить остальные checkbox's. То есть поставили галку на конкретный checkbox, остальные при этом стали disabled, сняли галку - они стали enabled. Второй вариант этому не соответствует, он работает только в одну сторону. надо как-то расширять, например вот так.

document.querySelector(".somecheckbox").onclick=function(){
  if($(".somecheckbox").is(":checked")) {
   $(".othercheckbox").attr("disabled", false)
   return
  }
  $(".othercheckbox").attr("disabled", true)
}

Твой код тоже сомнительный. Почему ты берешь левую переменную, не проще ли взять значение чекбокса непосредственно из него же?

document.querySelector(".somecheckbox").onclick=function(){
 $(".othercheckbox").attr("disabled", $(".somecheckbox").is(":checked"))
}

Но в целом, твой код соответствует задаче.

quest2017 ()
Ответ на: комментарий от Legioner

Каких-то проблем между этими способами я не вижу, всё на уровне «нравится-не нравится»

О чем ты говоришь, это разные коды, у них разная логика.

quest2017 ()
Ответ на: комментарий от AndreyKl

Сейчас в JS запилили webworkers, соответственно, есть настоящая конкурентность.

quest2017 ()
Ответ на: комментарий от quest2017

конкурентность

конкурентность конкурировала конкурировала да не выконкуревала.

многопоточность то настоящая-настоящая, да не настоящая. скорее многопроцессность напоминает, потому что потоки совершенно изолированы друг от друга и более того, в отличие от классических процессов к памяти другого потока ты обратиться никак не можешь вообще. разрешена только передача сообщений. мьютексы ты где там нашёл, в этой многопоточности?

AndreyKl ★★★★★ ()
Последнее исправление: AndreyKl (всего исправлений: 1)
$(document).on('change', '.someCheckbox', function() {
  $(this).closest('form').find('.otherCheckboxes').
    attr('disabled', $(this).prop('checked'));
});
INFOMAN ★★★★★ ()
Ответ на: комментарий от AndreyKl

А как же вот это:

The SharedWorker interface represents a specific kind of worker that can be accessed from several browsing contexts, such as several windows, iframes or even workers. They implement an interface different than dedicated workers and have a different global scope, SharedWorkerGlobalScope.

https://developer.mozilla.org/ru/docs/Web/API/SharedWorker

anonymous ()
$('.otherCheckboxes').attr('disabled', checkboxState );

Вот тут ты меняешь значение атрибута disabled. Но заблокирован или нет элемент определяется не значением этого атрибута а тупо его наличием и емнип жкверя в любом случае будет вставлять disabled="disabled", неважно что ты передаёшь вторым параметром. Поэтому я очень сильно удивлюсь если так ты сумеешь не только заблокировать но и разблокировать чекбоксы (допускаю что в какой-то версии у них есть костыль для true/false).

Поэтому самое простое

if($('.someCheckbox').is(':checked')) {
    $('.otherCheckboxes').addAttr('disabled');
} else {
    $('.otherCheckboxes').removeAttr('disabled');
}

ya-betmen ★★★★★ ()
Ответ на: комментарий от ya-betmen

Но заблокирован или нет элемент определяется не значением этого атрибута а тупо его наличием

Это ты с чего взял?

quest2017 ()
Ответ на: комментарий от quest2017

Ты прямо как-то в тупик своим вопросом меня поставил (у таких знаний есть один основной первоисточник).

Давай для начала ты ответь какое значение должно быть у этого атрибута чтобы заблокировать элемент, какое чтоб разблокировать, и что будет если значение не будет соответствовать ни первому ни второму?

ya-betmen ★★★★★ ()
Ответ на: комментарий от PolarFox

В общем то вместо переменной можно отрицание от текущего состояния поставить и все. Думаю так будет правильнее.

TigranElGrande ()
Ответ на: комментарий от ya-betmen

какое значение должно быть у этого атрибута чтобы заблокировать элемент, какое чтоб разблокировать,

true/false

и что будет если значение не будет соответствовать ни первому ни второму

не пробовал. Попробуй, потом расскажешь.

quest2017 ()
Ответ на: комментарий от ya-betmen

Тогда удивляйся:) Все работает и первым способом. Ну вот твой способ мне и навязали. Думаю можно на клик по checkbox'у somecheckbox навешать:

  foo = function() {
    $('.otherCheckboxes').attr('disabled', !$('.someCheckbox').is(':checked'));
  }
TigranElGrande ()
Ответ на: комментарий от TigranElGrande

Тогда удивляйся

Ну скорее всего они для таких атрибутов просто дублируют выставление свойств. Просто работать это будет только через жквери. Надо смотреть код почему именно у них это работает, но мне лениво, в жквери полно костылей, всех не упомнишь.

ya-betmen ★★★★★ ()
Последнее исправление: ya-betmen (всего исправлений: 2)
Ответ на: комментарий от quest2017

Вижу, начал.

А теперь объясни каким боком твой код относится к предмету разговора.

ya-betmen ★★★★★ ()
Ответ на: комментарий от ya-betmen

Хотя, отчасти, ты прав. Это работает только на уровне JS. disabled=something просто подставляет и убирает этот атрибут. К примеру, setAttribute уже не работает(в хроме). Эти свободоразработчики там делов наворочили, мама не горюй.

quest2017 ()
Ответ на: комментарий от ya-betmen

Как бы *считается*, что свойство элемента *должно* соответствовать соответствующему атрибуту элемента. Это, емнип, даже в спеке где то написано. Но суровая реальность — она другая, да.

quest2017 ()
Ответ на: комментарий от ya-betmen

Ты сначала проверь, прежде чем советы раздавать. Про документацию я уже молчу.

Legioner ★★★★★ ()
Последнее исправление: Legioner (всего исправлений: 1)
Ответ на: комментарий от anonymous

спасибо, анонимус, за ссылку. я не знал про шаред воркеры. но таки твоя ссылка не меняет ситуацию.

на сколько я понял документацию, единственное отличие разделяемого воркера от обычного воркера, это то что к разделяемому воркеру можно обращаться (в смысле посылать сообщения) с _разных_ страниц, правда страницы должны быть открыты с одного origin. А обычный воркер доступен только с той страницы на которой ты его создал.

AndreyKl ★★★★★ ()
Ответ на: комментарий от Legioner

Ну да, надо было attr('disabled', ") вместо addAttr('disabled'). Редко жкверей пользуюсь.

ya-betmen ★★★★★ ()
Ответ на: комментарий от quest2017

К примеру, setAttribute уже не работает

setAttribute работает с атрибутами, ты можешь это увидеть открыв инспектор (f12). Ты писал именно про атрибуты, а с точки зрения атрибутов значение имеет факт наличия/отсутствия. true/false работает только для свойства.

ya-betmen ★★★★★ ()

Они правы в том смысле, что незачем дублировать состояние в дополнительной переменной. Тем более, что ты ее реверсируешь, вместо прямого присваивания значения. Когда-нибудь с таким подходом ты доиграешься, и переменная начнет переключаться в противофазе. Реверс нормально применять для исходного значения, а не для передаваемых данных.

Конкретно для этой задачи первый вариант работает и будет работать. Но того кто так пишет я бы тоже заподозрил в чем-то противоестественном.

Покажите как нужно

Если таких мест много, то есть смысл попробовать knockoutjs.

Vit ★★★★★ ()
Ответ на: комментарий от Vit

Я думаю так будет правильнее:

  $('.otherCheckboxes').attr('disabled', !$('.someCheckbox').is(':checked'));

А лишний if никуда не уперся конкретно для этой задачи. Состояние не дублируется в переменной. Состояние принимает значение переменной. То есть я переменной не присваиваю состояние checkbox'a

TigranElGrande ()
Ответ на: комментарий от Vit

Да и претензии были не по поводу лишней переменной, а по поводу использования логического отрицания. Якобы никогда не видели раньше, чтобы так меняли что-либо.

TigranElGrande ()
Ответ на: комментарий от TigranElGrande

У меня в репах тоже много чего нельзя увидеть. Потому что до мержа в мастер успеваю по рукам надавать :)

Vit ★★★★★ ()
Ответ на: комментарий от TigranElGrande

Нужно чтобы все input'ы были одинаковыми

А не маразм ли это? Радиобаттоны как раз предназначены для того, чтобы выбирать только один вариант. А чекбоксы предполагают именно множественный выбор. И, встречая тот или иной тип контролов в интерфейсе, ожидаешь именно умолчального поведения. Нафига гробить юзабельность в угоду «шоб одинаково»?

massimus ★★★ ()

Нужно при нажатии на один конкретный checkbox отключить остальные checkbox'ы.

Чувак, это называется radio button и он работает без js :3

Boba_Fett ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.