Более чистый / простой способ написания этого кода jquery «if»?

#javascript #jquery #if-statement

#javascript #jquery #if-оператор

Вопрос:

Я написал это выражение if, и оно отлично работает, но мне просто интересно, есть ли более простой способ сделать это

 if(id == 'small'){
    $('#box').append('<div class="small">'   foo   '</div>');
    $('.medium,.large').remove();
}
if(id == 'medium'){
    $('#box').append('<div class="medium">'   foo   '</div>');
    $('.small,.large').remove();
}
if(id == 'large'){
    $('#box').append('<div class="large">'   foo   '</div>');
    $('.small,.medium').remove();
}
  

Комментарии:

1. Будут ли .small , .medium и .large только когда-либо быть дочерними элементами #box ?

Ответ №1:

Я бы предложил что-то вроде:

 if (id == 'small' || id == 'medium' || id == 'large') {

    $('#box').append('<div class="' id '">'   foo   '</div>');
    $('.small, .medium, .large').not('.'   id).remove();

}
  

Хотя я подозреваю, что его можно улучшить, и это, пока, непроверено.

Пересмотренный пример:

 $('ul li').click(

function() {
    var ID = this.id;

    if (ID == 'small' || ID == 'medium' || ID == 'large') {

        $('<div />').addClass(ID).appendTo('#box');
        $('#box .small, #box .medium, #box .large')
            .not('.'   ID   ':first')
            .remove();

    }
});
  

Демонстрация JS Fiddle.

Приведенная выше демонстрация была пересмотрена путем добавления ':first' в .not() метод, чтобы предотвратить добавление повторяющихся блоков одного и того же класса, как указано в качестве проблемы в комментариях от @Dizzi:

Это работает, но если вы нажмете еще один раз, вы получите дополнительные поля.


Отредактировано, чтобы немного доработать:

 $('ul li').click(

function() {
    var ID = this.id;
    var foo = "some content, from somewhere.";

    if (ID == 'small' || ID == 'medium' || ID == 'large') {

        $('#box')
            .empty();

        $('<div />')
            .addClass(ID)
            .text(foo)
            .appendTo('#box');

    }
});
  

Демонстрация JS Fiddle.

Использование empty() работает, только если .small , .medium и .large div являются единственным содержимым #box . Если это так, то немного быстрее очистить #box и затем вставить в него, вместо того, чтобы сначала вставлять, а затем использовать селектор для удаления остального содержимого.

Однако, если есть другое содержимое, то селектор (вероятно) все равно придется использовать вместо empty() .


Отредактировано, чтобы включить предложение от @Raynos (в комментариях):

if (ID in {small:0, medium:0, large:0}) работает так же хорошо, но менее читабелен. Однако в нем меньше символов!

 $('ul li').click(

function() {
    var ID = this.id;
    var foo = "some content, from somewhere.";

    if (ID in {small:0, medium:0, large:0}) {

        $('#box')
            .empty();

        $('<div />')
            .addClass(ID)
            .text(foo)
            .appendTo('#box');

    }
});
  

Демонстрация JS Fiddle.

Ссылки:

Комментарии:

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

2. Да, это недостаток во втором (и первом) предложениях. Удалено и улучшено в окончательной версии… который, конечно же, я рекомендую … =) (также смотрите отредактированный второй пример, который устраняет проблему.)

3. Большое спасибо, Дэвид «Отредактировано, чтобы доработать немного дальше: » работает идеально, мне просто пришлось изменить .text() на .html ()

4. if (ID in {small:0, medium:0, large:0}) работает так же хорошо, но менее читабелен. Однако в нем меньше символов!

5. @Raynos: спасибо! Это превосходно, и я бы даже не рассматривал возможность сделать это таким образом; имейте сердечный 1 = D

Ответ №2:

Вероятно, вы могли бы сделать что-то вроде:

 $('#box').append('<div class="' id '">'   foo   '</div>');
$('.small,.medium,.large').not('.' id).remove();
  

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

По крайней мере, вы должны использовать if / else вместо отдельных ifs или переключателя

Комментарии:

1. Зачем предлагать что-то, чего не следует делать по серьезному вопросу (не относящемуся к codegolf)? Особенно, если запрашивающий кажется немного новичком.

2. @nightcracker, я не знаю полного контекста его приложения. Если это вызывается только один раз, чтобы изменить уже существующую страницу, к которой у него нет доступа для изменения на серверной части (предполагая, что нет), тогда это не так уж плохо. И, несмотря на это, все равно познавательно понимать, как то, что он написал, может быть написано лучше. Вы заметите, что принятое решение сделало то же самое, ответило на вопрос, но затем предложило изменить все это (хотя, очевидно, более подробно).