Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Не работает if (https://javascript.ru/forum/jquery/69675-ne-rabotaet-if.html)

cadijob 11.07.2017 13:40

Не работает if
 
Привет.
Проблема в том, что нужно проверить свойство display у элемента. Но if не работает, точнее "chek1" не принтется, хотя если посмотреть код страницы, то - id="block-links" style="display: none;".
Вот код -
$('#open-close').show();
    $('#block-links').hide();
 
    $('#open-close').click(function(e) {
        e.preventDefault();
        $('#block-links').slideToggle();
        $('.canDisable').css('pointer-events', 'none');
        hideChek();
    });
 
    function hideChek(){
        console.log("chek");
        if ( $('#block-links').css('display') == 'none' ){
            console.log("chek1");
            $('.canDisable').css('pointer-events', 'auto');
        }
    }

Вот так при загрузке документа chek1 принтется, но функцию вызвать не получается. Как вызвать подобную функцию?
$("#block-links").each(function hideChek(){
        console.log("chek");
        if ( $(this).css('display') == 'none' ){
            console.log("chek1");
            $('.canDisable').css('pointer-events', 'auto');
        }
    });

рони 11.07.2017 13:58

cadijob,
проверять css('display') надо до анимации или после
e.preventDefault(); тут
$('#block-links').slideToggle(или тут);

laimas 11.07.2017 14:27

Цитата:

Сообщение от cadijob
$('#block-links').css('display') == 'none' )

В JQ можно же проще - if ( $('#block-links').is(':hidden') ) ....

cadijob 11.07.2017 14:45

Цитата:

Сообщение от рони (Сообщение 458174)
cadijob,
проверять css('display') надо до анимации или после
e.preventDefault(); тут
$('#block-links').slideToggle(или тут);

Проверять css('display') нужно после каждого второго вызова функции
('#open-close').click(function(e)

рони 11.07.2017 15:55

cadijob,
:-?

cadijob 11.07.2017 16:08

Что?)

cadijob 11.07.2017 16:23

Цитата:

Сообщение от рони (Сообщение 458179)
cadijob,
:-?

Скорее всего, я не очень хорошо понимаю функции в JQ. Нужно чтобы, когда $('#block-links').is(':hidden'), css был таким - $('.canDisable').css('pointer-events', 'auto');
а когда != hidden то -
$('.canDisable').css('pointer-events', 'none');

рони 11.07.2017 16:43

cadijob,
$('#open-close').click(function(e) {
        e.preventDefault();
        if ( $('#block-links').is('hidden') ){

            $('.canDisable').css('pointer-events', 'auto');
        }
        else $('.canDisable').css('pointer-events', 'none');
        $('#block-links').slideToggle();

    });

laimas 11.07.2017 17:22

cadijob,
это можно записать и без if ... else:

$('.canDisable').css('pointer-events', ['auto', 'none'][+$('#block-links').is('hidden')]);

cadijob 11.07.2017 17:26

Цитата:

Сообщение от рони (Сообщение 458186)
cadijob,
$('#open-close').click(function(e) {
        e.preventDefault();
        if ( $('#block-links').is('hidden') ){

            $('.canDisable').css('pointer-events', 'auto');
        }
        else $('.canDisable').css('pointer-events', 'none');
        $('#block-links').slideToggle();

    });

Блин. Всё равно не работает
$('#open-close').click(function(e) {
        e.preventDefault();
        if ( $('#block-links').is('hidden') ){
            console.log("auto");
            $('.canDisable').css('pointer-events', 'auto');
        }
        else {
            $('.canDisable').css('pointer-events', 'none');
            console.log("none");
        }
        $('#block-links').slideToggle();
    });

Только none принтит... Даже когда скрываю элемент.

cadijob 11.07.2017 17:31

Цитата:

Сообщение от laimas (Сообщение 458190)
cadijob,
это можно записать и без if ... else:

$('.canDisable').css('pointer-events', ['auto', 'none'][+$('#block-links').is('hidden')]);

Так -
$('#open-close').click(function(e) {
        e.preventDefault();
        $('.canDisable').css('pointer-events', ['auto', 'none'][+$('#block-links').is('hidden')]);

        $('#block-links').slideToggle();
    });
?

рони 11.07.2017 18:05

cadijob,
делайте минимальный макет, только самое необходимое.

cadijob 11.07.2017 18:53

Цитата:

Сообщение от рони (Сообщение 458194)
cadijob,
делайте минимальный макет, только самое необходимое.

Вот - https://drive.google.com/open?id=0Bx...Dg4eFJhU3RzUHc

рони 11.07.2017 19:36

cadijob,
я двоеточие забыл :) is(' тут hidden')
можно так
$(function() {
    $("#open-close").show();
    $("#block-links").hide();
    $("#open-close").click(function(a) {
        a.preventDefault();
        $("#block-links").slideToggle(400, function() {
            $(".canDisable").css("pointer-events", ["none", "auto"][+$(this).is(":hidden")])
        })
    })
});


или так
$(function() {
    $("#open-close").show();
    $("#block-links").hide();
    $("#open-close").click(function(a) {
        a.preventDefault();
        $(".canDisable").css("pointer-events", ["auto","none"][+$("#block-links").is(":hidden")])
        $("#block-links").slideToggle(400)
    })
});

cadijob 11.07.2017 19:48

Шикарно. Спасибо большое.
Ещё вопрос: вот когда ссылка на теги отключена, jQuery и Ajax могут взаимодействовать с этими элементами?

рони 11.07.2017 19:54

Цитата:

Сообщение от cadijob
jQuery и Ajax могут взаимодействовать с этими элементами?

да

cadijob 11.07.2017 20:30

А как это называется -
["none", "auto"][+$(this).is(":hidden")])
? Я так понял что в одной строке помещаться целое условие(зависимость от hidden), можно туда ещё переменную поставить, что бы также от него зависела?Хотелось бы изучить.

рони 11.07.2017 20:34

cadijob,
:blink:
массив это называется, is(":hidden") возвращает true/false
alert(+false)

alert(+true)

alert(["none", "auto"][+false])

alert(["none", "auto"][+true])

рони 11.07.2017 20:39

cadijob,
Цитата:

Чтобы получить нужный элемент из массива – указывается его номер в квадратных скобках,
https://learn.javascript.ru/array

cadijob 11.07.2017 20:59

Вот так сделал:
OpenArea=[+$(this).is(":hidden")];
                console.log(OpenArea);

Как сделать, чтобы в переменную заносил не 0 и 1, а true и false и, если это важно для дальнейшей работой с переменной без []?

рони 11.07.2017 21:01

Цитата:

Сообщение от cadijob
Как сделать, чтобы в переменную заносил не 0 и 1, а true и false

OpenArea=[+$(this).is(":hidden")];убрать красное

cadijob 11.07.2017 21:02

OpenArea=[$(this).is(":hidden")];
вот так надо

cadijob 11.07.2017 21:03

Цитата:

Сообщение от cadijob (Сообщение 458212)
OpenArea=[$(this).is(":hidden")];
вот так надо

Предыдущие не увидел... Спасибо.

cadijob 11.07.2017 21:17

Цитата:

Сообщение от рони (Сообщение 458204)
да

Мне кажется, что нет. Т.к.
$(".canDisable").click(function() {
        alert("ok");
        if (OpenArea == false) {
            console.log(OpenArea);
            $(this).css( "transform", "scale(0.85)" );
        }
    });
Даже alert не работает. А когда pointer-events: auto; то alert работает. Тогда как отключить ссылку?

рони 11.07.2017 21:45

cadijob,
$("li").on("click", function() {
  alert($("a", this).text());
})

рони 11.07.2017 21:52

Цитата:

Сообщение от cadijob
Тогда как отключить ссылку?

preventDefault() в нужное время, в нужном месте, но это известно только вам.

рони 11.07.2017 22:00

cadijob,
можно только гадать, что вы хотите сделать ...
$(function() {
    $("#open-close").show();
    $("#block-links").hide();
    $("#open-close").click(function(a) {
        a.preventDefault();
        $("#block-links").slideToggle(400)
    })
    $(".canDisable").on("click", function(a) {
 if ($("#block-links").is(":visible"))  a.preventDefault();
})
});

cadijob 11.07.2017 22:06

Цитата:

Сообщение от рони (Сообщение 458220)
cadijob,
можно только гадать, что вы хотите сделать ...
$(function() {
    $("#open-close").show();
    $("#block-links").hide();
    $("#open-close").click(function(a) {
        a.preventDefault();
        $("#block-links").slideToggle(400)
    })
    $(".canDisable").on("click", function(a) {
 if ($("#block-links").is(":visible"))  a.preventDefault();
})
});

Когда display: none; то ссылка работала как обычно. А когда display != none, то только jQuery и Ajax могут взаимодействовать с этим элементом.

рони 11.07.2017 22:09

cadijob,
не понимаю

cadijob 11.07.2017 22:15

Цитата:

Сообщение от рони (Сообщение 458224)
cadijob,
не понимаю

"#block-links" имеет стиль display. Когда display: none то jQuery не взаимодействует(как должно быть, но это не так) с ".tags li"
$(".tags li").on("click", function(){
        alert($("a", this).text());
        // if (OpenArea == false) {
        //     console.log(OpenArea);
        //     $(this).css( "transform", "scale(0.85)" );
        // }
    });

То есть эта функция не будет работать. Когда display != none то будет.
if(OpenArea == false){
        $(".tags li").on("click", function(){
            alert($("a", this).text());
            // if (OpenArea == false) {
            //     console.log(OpenArea);
            //     $(this).css( "transform", "scale(0.85)" );
            // }
        });

    }

Пример выше не работает.

рони 11.07.2017 22:26

cadijob,
не понимаю!!! видимо более ничем помочь не могу.

laimas 11.07.2017 22:27

cadijob,
if(OpenArea == false), это для упертых. )

0 - это тоже false, а 1 - это тоже true, если проверяется истина/ложь (булево значение), то есть писать if(OpenArea == false), это мягко говоря лишние хлопоты, так как если OpenArea равна или 0 или false, то if(!OpenArea) в обоих случаях вернет true.

Бывает, что например функция может возвращать как 0 так и false, в этом случае проверка if(!name(props)) не годится, вот тогда проверять нужно не только значение, но и тип:

if(OpenArea === false)

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

cadijob 11.07.2017 22:49

Цитата:

Сообщение от laimas (Сообщение 458227)
cadijob,
У вас же проблемы не потому что вместо true ноль или наоборот, а в том, что где-то логика кода вашего не соответствует ожиданиям.

Почему?
Сделал так -
if (OpenArea === false) {
        $(".tags li").on("click", function(){
            alert($("a", this).text());
            // if (OpenArea == false) {
            //     console.log(OpenArea);
            //     $(this).css( "transform", "scale(0.85)" );
            // }
        });
    }

В консоли OpenArea - true. Но код, выше, выполняется.

рони 11.07.2017 22:51

Цитата:

Сообщение от cadijob
Сделал так -

так делать вредно!!!

cadijob 11.07.2017 22:51

Всё.
$(".tags li").on("click", function(){
        if (OpenArea === false) {
            alert($("a", this).text());
            // if (OpenArea == false) {
            //     console.log(OpenArea);
            //     $(this).css( "transform", "scale(0.85)" );
            // }
        }
    });

Работает. Спасибо за совет с ===.

рони 11.07.2017 22:52

cadijob,
лучше бы не колдовали, а обьяснили алгоритм, того что хотите сделать.

cadijob 11.07.2017 22:57

Цитата:

Сообщение от рони (Сообщение 458234)
cadijob,
лучше бы не колдовали, а обьяснили алгоритм, того что хотите сделать.

Вам тоже кажется, что "говнокод"?)
Сейчас постараюсь объяснить.
Вы же макет видели? Так вот, когда форма открывается то по тегам нельзя перейти(то есть не редеректит на другую страницу во время клика) и в дальнейшем ajax будет эти теги в массив собирать по кликам(когда форма открыта, опять же). А вот когда форма закрыта то можно и перейти по ссылке в теге, и "в дальнейшем ajax будет эти теги в массив собирать по кликам" не будет работать.
P.S. Заноситься в массив будет id тега, который в свою очередь берётся из БД.

рони 11.07.2017 22:58

Цитата:

Сообщение от cadijob
Работает.

интересно чем ваш код отличается от кода в посте 27

cadijob 11.07.2017 23:03

Цитата:

Сообщение от рони (Сообщение 458236)
интересно чем ваш код отличается от кода в посте 27

Я его пробовал использовать. Не работало.

рони 11.07.2017 23:07

cadijob,
что не так?
<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>title</title>

    <link href="https://fonts.googleapis.com/css?family=Roboto&amp;subset=cyrillic" rel="stylesheet">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
    <script>
$(function() {
    $("#open-close").show();
    $("#block-links").hide();
    $("#open-close").click(function(a) {
        a.preventDefault();
        $("#block-links").slideToggle(400)
    });
    $(".canDisable").on("click", function(a) {
 if ($("#block-links").is(":visible"))  a.preventDefault();
})
});
    </script>
</head>
<body>
    <div class="wrapper" id="scroll">

        <div class="container">
            <div class="botHeader">
                <a href="#" id="open-close">
                    <div class="talkBtn">
                        <p>Кнопка которая октрывает форму</p>
                    </div>
                </a>
            </div>
            <div class="borderShadow"></div>
            <div class="talk" id="block-links">
                <form action="">
                    <input type="text" name="textTitle" placeholder="Тема сообщения">
                    <textarea name="textarea" rows="8" cols="80" placeholder="Текст"></textarea>
                </form>
            </div>
            <div class="tags">
                <ul>
                    <li><a href=""  class="canDisable">Тег 1</a></li>
                    <li><a href=""  class="canDisable">Тег 2</a></li>
                    <li><a href=""  class="canDisable">Тег 3</a></li>
                    <li><a href=""  class="canDisable">Тег 4</a></li>
                    <li><a href=""  class="canDisable">Тег 4</a></li>
                    <li><a href=""  class="canDisable">Тег 5</a></li>
                    <li><a href=""  class="canDisable">Тег 6</a></li>
                    <li><a href=""  class="canDisable">Тег 7</a></li>
                    <li><a href=""  class="canDisable">Тег 8</a></li>
                    <li><a href=""  class="canDisable">Тег 9</a></li>
                    <li><a href=""  class="canDisable">Тег 10</a></li>
                    <li><a href=""  class="canDisable">Тег 11</a></li>
                    <li><a href=""  class="canDisable">Тег 12</a></li>
                </ul>
            </div>
            <div class="borderShadow"></div>
            <div class="posts">

                </div>
            </div>
        </div>
        <div class="footer">

        </div>

</body>
</html>


Часовой пояс GMT +3, время: 03:25.