Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Компактно переписать функцию (https://javascript.ru/forum/misc/67753-kompaktno-perepisat-funkciyu.html)

AlexTrader 06.03.2017 15:50

Компактно переписать функцию
 
Здравствуйте форумчане! Подскажите пожалуйста, как более компактно можно переписать функцию:
$(document).mouseup(function (e) { 
            var div = $("#treeview");
            var div1 = $("#CategoryTitle"); 
            var div2 = $("#treeviewDropdownBtn"); 
            if (!div.is(e.target) && div.has(e.target).length === 0) {
                if (!div1.is(e.target) && div1.has(e.target).length === 0) {
                    if (!div2.is(e.target) && div2.has(e.target).length === 0) {
                        kendoWindow.data("kendoWindow").close();
                    }
                }
            }
        });

AlexTrader 06.03.2017 15:51

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

ksa 06.03.2017 15:56

Цитата:

Сообщение от AlexTrader
если был клик не по указанным дивам, то окно закрывается

Как вариант...
$(document).mouseup(function (e) { 
	var div = $("#treeview, #CategoryTitle, #treeviewDropdownBtn"); 
	if (!div.is(e.target) && div.has(e.target).length === 0) {
		kendoWindow.data("kendoWindow").close();
	};
});

ksa 06.03.2017 15:57

Цитата:

Сообщение от AlexTrader
Подскажите пожалуйста, как более компактно можно переписать функцию

Если этим элементам дать уникальный класс - селектор будет еще короче...

laimas 06.03.2017 17:25

Цитата:

Сообщение от ksa
элементам дать уникальный класс

Как это?

рони 06.03.2017 17:32

AlexTrader,
$(function() {
    $("document").on("click", function(e) {
        $(e.target).closest("#treeview, #CategoryTitle, #treeviewDropdownBtn").length
        || kendoWindow.data("kendoWindow").close()
    })
});

рони 06.03.2017 17:35

Цитата:

Сообщение от laimas
Как это?

было
var div = $("#treeview, #CategoryTitle, #treeviewDropdownBtn");

стало
var div = $(".noClose");

:-?

laimas 06.03.2017 18:03

Цитата:

Сообщение от рони
стало
var div = $(".noClose");

Ну это понятно, но какое отношение имя класса имеет к уникальности, если оно не может быть уникальным?

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

рони 06.03.2017 18:11

laimas,
не понимаю о чём вы.

laimas 06.03.2017 18:20

Цитата:

Сообщение от ksa
Если этим элементам дать уникальный класс - селектор будет еще короче...

Да, селектор будет короче. Но имя класса для браузера не является уникальным значением, и при поиске по имени класса он будет проверять все, без исключения, элементы документа. Можно не обременять его поиском среди всех, а только, например среди параграфов - p.class-name.

Другими словами, вряд ли можно быть уверенным в том, что заменив селектор "#treeview, #CategoryTitle, #treeviewDropdownBtn" на ".noClose" мы выиграем.

рони 06.03.2017 18:25

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

laimas 06.03.2017 19:02

Цитата:

Сообщение от рони
будет уже выигрыш по простоте добавления/удаления элемента

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

рони 06.03.2017 19:25

laimas,
надо делать тест :) что быстрее?
$(e.target).closest("#treeview, #CategoryTitle, #treeviewDropdownBtn")


или
$(e.target).closest(".noClose")

laimas 06.03.2017 20:24

Цитата:

Сообщение от рони
надо делать тест

нет, это уже от лукавого, привязываться к конкретному случаю. Да и какая разница в данном случае, и по классу, и по ID поиск закончится при первом же совпадении ибо так заказано. :)

рони 06.03.2017 20:28

laimas,
не понимаю ваших сообщений в этой теме, для меня однозначно $(e.target).closest(".noClose") лучше, если вам удобно иначе, дело ваше.

laimas 06.03.2017 20:39

:)

Я вот о чем. В данном случае, с closest(), пофиг как ищется по классу ли или по ID, метод определяет действия - нашли первое совпадение и успокоились. То есть ну выиграли только в сокращении записи, не более.

А теперь представим, что речь идет о наборе именно уникальных элементов. Пусть этот набор размещен так:

<body><div><div id=a1 class=as><div id=a2 class=as><div id=a3 class=as>

и требуется получить этот набор являющийся родителями, то есть используем .parents(). Если в этом случае искать по селектору класса .parents('.as'), то будут опрошены элементы вплоть до body, а если по id, .parents('#a1, #a2, #a3'), то поиск остановится после нахождения третьего в наборе, ибо ID уникально и нечего более искать выше.

рони 06.03.2017 20:54

laimas,
в обоих случая будет искать до document не останавливась

laimas 06.03.2017 20:56

Цитата:

Сообщение от рони
в обоих случая будет искать до document

Это почему?

рони 06.03.2017 21:15

laimas,
так устроен parents --- нужен break тогда parentsUntil

laimas 06.03.2017 21:22

Цитата:

Сообщение от рони
так устроен parents

А смысл? В селекторе указано три, причем эти три это уникальные значения, следовательно искать далее глупо и break вроде бы уже подразумевается. А вот если по классу тогда и нужен parentsUntil, чтобы не искать выше. Или я не прав?

рони 06.03.2017 21:35

laimas,
Цитата:

Осуществляет поиск всех предков выбранных элементов, то есть, не только прямых родителей, но и прародителей, прапрародителей и так далее, до начало дерева DOM. Метод имеет один вариант использования:


.parents([selector]):jQueryv:1.0


Возвращает всех предков выбранных элементов. При необходимости, можно указать селектор selector для фильтрации результата.

рони 06.03.2017 21:38

laimas,
parents идёт по дереву вверх (запоминая нужное), parentsUntil идёт по дереву вверх до первого ограничителя сколько бы их небыло (запоминая всех)

laimas 06.03.2017 22:14

Цитата:

Сообщение от рони
При необходимости, можно указать селектор selector для фильтрации

А тем более если речь идет об уникальных значениях. То есть при ID, зная, что найдены все указанные, искать далее просто глупо, имеется ввиду если такое поведение заложено в скрипт. Уникальность, это же не прерогатива DOM и JS, это используется везде, и даже трудно представить, чтобы например запрос в базу продолжал бы искать далее после того, как нашел конкретно указанную запись. Это не только глупо, но и слишком расточительно.

Надо исходник JQ посмотреть по данному поводу, что-то мне не верится, чтобы такая глупость была заложена в метод. :)

рони 06.03.2017 22:19

laimas,
не вижу никакой глупости

laimas 06.03.2017 22:35

Цитата:

Сообщение от рони
не вижу никакой глупости

Тогда я не понимаю. :)

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

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

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

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<script> 
$(function() {
    $('input').change(function() {
        alert(this.checked ? $('.as').text() : $('#a1').text())
    })
});
</script> 
</head>
<body>
<p id="a1" class="as">1</p>
<p id="a2" class="as">2</p>
<p id="a3" class="as">3</p>
<input type="checkbox" />
</body>
</html>


при поиске по ID опрашивает также и '#a2', и '#a3', фильтруя полученное в для выбора нужного, а не прекращает поиск после найденного '#a1'. Также поступит и браузер, смысла то ведь нет, он то знает, что ID есть значение уникальное и он его уже нашел.

Именно исходя из уникально/не уникально, поиск по классу лучше конкретизировать, чтобы не расточать зря ресурсы - не .as, а p.as.

В противном случае я буду разочарован и глупым поведением браузера, и его подспорьем - Javascript. :)

рони 06.03.2017 22:42

laimas,
извини, но я пас, не понимаю ход твоих мыслей, воздержусь от дальнейших комментариев.

laimas 06.03.2017 22:46

Цитата:

Сообщение от рони
я пас, не понимаю ход твоих мыслей

Да что тут понимать :lol:

Обязали найти в подъезде 2, на втором этаже, среди 4-х квартир, жильца Петрова. Знаем, что таковую фамилию в данной дислокации имеет только один человек, найдя его, нужно продолжать его искать?

Если да, то какой в этом смысл? :)

ksa 07.03.2017 08:33

Цитата:

Сообщение от laimas
Но имя класса для браузера не является уникальным значением

Под уникальностью тут имел ввиду, что такой класс будет только у трех этих элементов. Т.е. уникален среди других классов...

laimas 07.03.2017 08:40

Цитата:

Сообщение от ksa
такой класс будет только у трех этих элементов. Т.е. уникален среди других классов...

Уже разобрались, что имелось ввиду, но браузеру в общем то на это плевать, у него свои интересы. )

ksa 07.03.2017 08:46

Цитата:

Сообщение от laimas
но браузеру в общем то на это плевать, у него свои интересы. )

Так он на нашей стороне? :blink:

laimas 07.03.2017 10:46

Да кто же их, буржуев, разберет - улыбаются и руку жмут, а за улыбкой коварный спрут.

Товарищ!
Не ведись на буржуазную хрень!
14 февраля - обычный день!

;)

ksa 07.03.2017 10:55

Цитата:

Сообщение от laimas
14 февраля - обычный день!

А я рафаелки подарил... :-?

Paguo-86PK 07.03.2017 11:06


ksa 07.03.2017 11:25

Не на то держите курс, ребята. :D

laimas 07.03.2017 14:28

Цитата:

Сообщение от ksa
А я рафаелки подарил...

Ну так и я шучу. ) А если серьезно, буквально недавно словил каку, с браузерами начался полный ахтунг. Вылечил, но оказалось не все. В ослике в отладчике отображаются только пустые его вкладки, а тут как по заказу нужен именно он, так как нужно выяснить причину почему в ослике 11 не отображается нечто. И уже вроде бы все перепробовано, включая его удаление и переустновку. Что в системе не так или не хватает, молчит интернет или найти не могу. В гостевой W10, но у нее уже другой ослик, а ставить еще одну ради 11, это слишком...

Буржуи, мать их.... :)


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