Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как правильно выбирать элементы для Jquery (https://javascript.ru/forum/misc/46300-kak-pravilno-vybirat-ehlementy-dlya-jquery.html)

Bizon4ik 04.04.2014 20:28

Как правильно выбирать элементы для Jquery
 
Доброе время суток.

Объясните, пожалуйста, почему в этом примере http://jsfiddle.net/Bizon4ik/nZ3q8/ функция hide() вызывается при нажатии на кнопку, и тем самым не дает запустить функцию show()?

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

Заранее спасибо за ответ.

рони 04.04.2014 21:24

Закрытие по клику вне блока
 
Bizon4ik,
:-?
<!DOCTYPE html>
<html>
<head>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  <title> - jsFiddle demo by Bizon4ik</title>
  <script type='text/javascript' src='http://code.jquery.com/jquery-1.9.1.js'></script>
  <style type='text/css'>
    body, html {
    background:#ddd;
}

#marginfirstscreen {
	width:100%;
	height:100%;
	position:relative;
	z-index:1;
}

#marginfirstscreen .mainbutton {
	margin:50px 0 50px 150px;
	display:inline-block;
	width: 200px;
	height: 70px;
	position: relative;
	z-index:5;
}
#marginfirstscreen .mainbutton h4 {
	display:inline-block;
	position:relative;
	z-index:10;
	color:#000;
	text-align:center;
	width:100%;
	height:100%;
	margin:0;
    padding:0;
    line-height:70px;
	font-size:2em;
	font-family:sans-serif;

}
#marginfirstscreen .mainbutton svg {
    position: absolute;
    top: 0;
    left: 0;
	z-index:0;

}
#marginfirstscreen .mainbutton svg line {
    stroke-width: 2;
    stroke: #fff;
    fill: none;
    stroke-dasharray: 200;
    -webkit-transition: -webkit-transform .6s ease-out;
    transition: transform .6s ease-out;
}


#marginfirstscreen .mainbutton:hover svg line.top-line {
    -webkit-transform: translateX(-400px);
    transform: translateX(-400px);
}
#marginfirstscreen .mainbutton:hover svg line.bottom-line {
    -webkit-transform: translateX(400px);
    transform: translateX(400px);
}
#marginfirstscreen .mainbutton:hover svg line.left-line {
    -webkit-transform: translateY(400px);
    transform: translateY(400px);
}
#marginfirstscreen .mainbutton:hover svg line.right-line {
    -webkit-transform: translateY(-400px);
    transform: translateY(-400px);
}

#buttom-purchase-info {
	position:absolute;
	margin-top:-70px;
	width:400px;
	height:400px;
	border:1px solid red;
	z-index:9;
	display:none;
	background:#fff;
}
  </style>



<script>
$(window).load(function () {
    $("#buttom-purchase").click(function (event) {
        $("#buttom-purchase-info").show();
        event.stopPropagation()
    });
    $(document).on("click", function (event) {
        if ($("#marginfirstscreen").has(event.target).length === 0) $("#buttom-purchase-info").hide();
    });
});
</script>
</head>
<body>
  			<div id="marginfirstscreen">
				<div class="mainbutton" >
					<h4 id="buttom-purchase">КУПИТЬ</h4>
					<svg width="200" height="70">
						<line class="top-line"    x1="0" y1="0" x2="600" y2="0" />
						<line class="bottom-line" x1="200" y1="70" x2="-400" y2="70" />
						<line class="left-line"   x1="0" y1="70" x2="0" y2="-400" />
						<line class="right-line"  x1="200" y1="0" x2="200" y2="470" />
					</svg>
				<div id="buttom-purchase-info" >
				</div>
				</div>
			</div>

</body>
</html>

Vlasenko Fedor 04.04.2014 23:24

Без Jquery
<!DOCTYPE html>
<html>
  
  <head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <title>- jsFiddle demo by Bizon4ik</title>
    <style>
      body, html {
        background:#ddd;
      }
      #marginfirstscreen {
        width:100%;
        height:100%;
        position:relative;
        z-index:1;
      }
      #marginfirstscreen .mainbutton {
        margin:50px 0 50px 150px;
        display:inline-block;
        width: 200px;
        height: 70px;
        position: relative;
        z-index:5;
      }
      #marginfirstscreen .mainbutton h4 {
        display:inline-block;
        position:relative;
        z-index:10;
        color:#000;
        text-align:center;
        width:100%;
        height:100%;
        margin:0;
        padding:0;
        line-height:70px;
        font-size:2em;
        font-family:sans-serif;
      }
      #marginfirstscreen .mainbutton svg {
        position: absolute;
        top: 0;
        left: 0;
        z-index:0;
      }
      #marginfirstscreen .mainbutton svg line {
        stroke-width: 2;
        stroke: #fff;
        fill: none;
        stroke-dasharray: 200;
        -webkit-transition: -webkit-transform .6s ease-out;
        transition: transform .6s ease-out;
      }
      #marginfirstscreen .mainbutton:hover svg line.top-line {
        -webkit-transform: translateX(-400px);
        transform: translateX(-400px);
      }
      #marginfirstscreen .mainbutton:hover svg line.bottom-line {
        -webkit-transform: translateX(400px);
        transform: translateX(400px);
      }
      #marginfirstscreen .mainbutton:hover svg line.left-line {
        -webkit-transform: translateY(400px);
        transform: translateY(400px);
      }
      #marginfirstscreen .mainbutton:hover svg line.right-line {
        -webkit-transform: translateY(-400px);
        transform: translateY(-400px);
      }
      #buttom-purchase-info {
        position:absolute;
        margin-top:-70px;
        width:400px;
        height:400px;
        border:1px solid red;
        z-index:9;
        display:none;
        background:#fff;
      }
      #buttom-purchase-info.active {
        display:block;
      }
    </style>
  </head>
  
  <body>
    <div id="marginfirstscreen">
      <div class="mainbutton">
        <h4 id="buttom-purchase">КУПИТЬ</h4>
        <svg width="200" height="70">
          <line class="top-line" x1="0" y1="0" x2="600" y2="0" />
          <line class="bottom-line" x1="200" y1="70" x2="-400" y2="70" />
          <line class="left-line" x1="0" y1="70" x2="0" y2="-400" />
          <line class="right-line" x1="200" y1="0" x2="200" y2="470" />
        </svg>
        <div id="buttom-purchase-info"></div>
      </div>
    </div>
    <script>
      document.onclick = function (e) {
        var info = document.getElementById("buttom-purchase-info");
        var el = e ? e.target : window.event.srcElement;
          if (el.id == "buttom-purchase" & !info.className) {
            info.className = "active";
          } else {
            info.className = "";
          }
        };
    </script>
  </body>

</html>

рони 04.04.2014 23:37

Poznakomlus,
Цитата:

Сообщение от Bizon4ik
когда наживает на любое место кроме открытого блока, то этот блок исчезал.


Vlasenko Fedor 04.04.2014 23:46

рони,
так исчезает же и ли я опять не понял
все докурил сейчас

Vlasenko Fedor 05.04.2014 00:24

document.onclick = function (e) {
	var info = document.getElementById("buttom-purchase-info");
	var but = document.getElementById("buttom-purchase");
	var el = e ? e.target : window.event.srcElement;
	switch (el) {
		case but:
			!info.className & (info.className = "active");
			break;
		case info:
			break;
		default:
			info.className = "";
	}
};

http://learn.javascript.ru/play/SPOkgb

Bizon4ik 05.04.2014 22:27

Всем спасибо за правильный вариант. А не могли бы вы немного объяснить.
В чем ошибка моей логики?

рони 05.04.2014 22:32

Bizon4ik,
http://learn.javascript.ru/bubbling-and-capturing

Bizon4ik 05.04.2014 22:55

Цитата:

Сообщение от рони (Сообщение 306282)

Спасибо, я по вашему коду дошел до этой ссылки. :)
Но проблема в том что ваш код не работает если на страницы есть еще элементы (если на них наживать, то инфо блок не прячется)

Пример: http://jsfiddle.net/Bizon4ik/nZ3q8/1/

ПС: Не годиться вод этот кусок вашего кода: $("#marginfirstscreen").has(event.target).length === 0

Sweet 05.04.2014 22:55

Посоны, мы же все знаем, что document.onclick - абсолютно не жизнеспособный метод навешивания событий. К чём смысл такого совета?
Но вот такие конструкции просто убивают:
!info.className & (info.className = "active");

Ну давай, рассказывай, зачем это нужно:)

Vlasenko Fedor 05.04.2014 22:59

Sweet,
хочешь вернутся к своему говнокоду где переопределяешь системные объекты http://javascript.ru/forum/305063-post37.html

рони 05.04.2014 22:59

Цитата:

Сообщение от Bizon4ik
Не годиться вод этот кусок вашего кода: $("#marginfirstscreen").has(event.target).length === 0

id это уникальный идентификатор -- в нормальном случае он неповторяется

Bizon4ik 05.04.2014 23:09

Спасибо за ответ, я понял

рони 05.04.2014 23:12

Bizon4ik,
Цитата:

Сообщение от Bizon4ik
Разве от того что я буду использовать id или класс поменяется логика кода?

да
<!DOCTYPE html>
<html>
<head>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  <title> - jsFiddle demo by Bizon4ik</title>

  <script type='text/javascript' src='http://code.jquery.com/jquery-1.9.1.js'></script>



  <link rel="stylesheet" type="text/css" href="/css/result-light.css">

  <style type='text/css'>
    body, html {
    background:#ddd;
}

.marginfirstscreen {
	width:100%;
	height:100%;
	position:relative;
	z-index:1;
}

.marginfirstscreen .mainbutton {
	margin:50px 0 50px 150px;
	display:inline-block;
	width: 200px;
	height: 70px;
	position: relative;
	z-index:5;
    float:left;
}
.marginfirstscreen .mainbutton h4 {
	display:inline-block;
	position:relative;
	z-index:10;
	color:#000;
	text-align:center;
	width:100%;
	height:100%;
	margin:0;
    padding:0;
    line-height:70px;
	font-size:2em;
	font-family:sans-serif;

}
.marginfirstscreen .mainbutton svg {
    position: absolute;
    top: 0;
    left: 0;
	z-index:0;

}
.marginfirstscreen .mainbutton svg line {
    stroke-width: 2;
    stroke: #fff;
    fill: none;
    stroke-dasharray: 200;
    -webkit-transition: -webkit-transform .6s ease-out;
    transition: transform .6s ease-out;
}


.marginfirstscreen .mainbutton:hover svg line.top-line {
    -webkit-transform: translateX(-400px);
    transform: translateX(-400px);
}
.marginfirstscreen .mainbutton:hover svg line.bottom-line {
    -webkit-transform: translateX(400px);
    transform: translateX(400px);
}
.marginfirstscreen .mainbutton:hover svg line.left-line {
    -webkit-transform: translateY(400px);
    transform: translateY(400px);
}
.marginfirstscreen .mainbutton:hover svg line.right-line {
    -webkit-transform: translateY(-400px);
    transform: translateY(-400px);
}

#buttom-purchase-info {
	position:absolute;
	margin-top:-70px;
	width:400px;
	height:400px;
	border:1px solid red;
	z-index:9;
	display:none;
	background:#fff;
}



  </style>



<script>
$(window).load(function(){



    $(".buttom-purchase").click(function (event) {

        $("#buttom-purchase-info").show();

        event.stopPropagation()

    });

    $(document).on("click", function (event) {

        if ($(".marginfirstscreen").has(event.target).length === 0) $("#buttom-purchase-info").hide();

    });



});
</script>


</head>
<body>
  			<div class="marginfirstscreen">
				<div class="mainbutton" >
					<h4 class="buttom-purchase">КУПИТЬ</h4>
					<svg width="200" height="70">
						<line class="top-line"    x1="0" y1="0" x2="600" y2="0" />
						<line class="bottom-line" x1="200" y1="70" x2="-400" y2="70" />
						<line class="left-line"   x1="0" y1="70" x2="0" y2="-400" />
						<line class="right-line"  x1="200" y1="0" x2="200" y2="470" />
					</svg>
				<div id="buttom-purchase-info" >
				</div>
				</div>

                <div class="mainbutton" id="secondbuttom" >
					<h4 class="buttom-purchase">Продать</h4>
					<svg width="200" height="70">
						<line class="top-line"    x1="0" y1="0" x2="600" y2="0" />
						<line class="bottom-line" x1="200" y1="70" x2="-400" y2="70" />
						<line class="left-line"   x1="0" y1="70" x2="0" y2="-400" />
						<line class="right-line"  x1="200" y1="0" x2="200" y2="470" />
					</svg>

				</div>

			</div>

</body>


</html>

Sweet 05.04.2014 23:16

Цитата:

Сообщение от Poznakomlus
хочешь вернутся к своему говнокоду

Злишсо? Обоснуй, почему считаешь, что я наговнокодил, когда не переопределил системный объект.
А знаешь, в чём мякотка, Poznakomlus? Дело в том, что код:
!info.className & (info.className = "active");
, эквивалентен этому:
info.className = "active";
Ты, видимо, имел ввиду вот такой код:
!info.className && (info.className = "active");
Твой ход!:dance:

Bizon4ik 05.04.2014 23:18

рони
Я понял о чем вы. Но меня волнует тот факт что блок не прячется, если нажать на кнопку продать.


http://jsfiddle.net/Bizon4ik/nZ3q8/2/

рони 06.04.2014 00:18

Bizon4ik,
http://jsfiddle.net/nZ3q8/3/

Vlasenko Fedor 06.04.2014 00:19

Bizon4ik,
здесь работает
http://learn.javascript.ru/play/3T84ec

Sweet,
Цитата:

Сообщение от Sweet
Ты, видимо, имел ввиду вот такой код:
!info.className && (info.className = "active");

именно так, но и он не нужен достаточно info.className = "active"

Цитата:

Сообщение от Sweet
Твой ход

зачем переопределять глобальные объекты
уверен что XMLHttpRequest, Msxml2.XMLHTTP, Microsoft.XMLHTTP полностью взаимозаменяемые и аналогичные при поведении. Что будет если будет работать к примеру еще одно расширение которое проверив XMLHttpRequest будет применять некорректные методы и подходы для браузера. И все это только ради того, чтобы не объявлять переменную request

рони 06.04.2014 00:28

Цитата:

Сообщение от Poznakomlus
здесь работает
http://learn.javascript.ru/play/YxBnz

неа -- кликаю внизу страницы блок незакрывается

Vlasenko Fedor 06.04.2014 00:40

Цитата:

Сообщение от рони
неа -- кликаю внизу страницы блок незакрывается

поправил, эт уже к стилям
http://learn.javascript.ru/play/3T84ec
body, html {
        background:#ddd;
        width:100%;
        height:100%;
      }

рони 06.04.2014 01:27

Poznakomlus,
http://learn.javascript.ru/play/R8gIwb
кликни по тест блок и закроется а не должен

Bizon4ik 06.04.2014 01:28

Цитата:

Сообщение от рони (Сообщение 306304)

Спасибо, все работает

Sweet 06.04.2014 01:47

Цитата:

Сообщение от Poznakomlus
зачем переопределять глобальные объекты

Никакие глобальные объекты не переопределяются! Забудь! Ты это выдумал! Просто посмотри мой говнокод ещё раз.
Цитата:

Сообщение от Poznakomlus
уверен что XMLHttpRequest, Msxml2.XMLHTTP, Microsoft.XMLHTTP полностью взаимозаменяемые и аналогичные при поведении. Что будет если будет работать к примеру еще одно расширение которое проверив XMLHttpRequest будет применять некорректные методы и подходы для браузера.

Лолшто? Можешь привести пример кода или как-то по-другому мысль оформить, потому что я не понял, о чём ты.
Цитата:

Сообщение от Poznakomlus
И все это только ради того, чтобы не объявлять переменную request

Нет! Это называется полифил. Весьма распростронённая в js практика. Именно в этом и была моя мысль здесь! Если развить эту мысль и сделать реализацию XMLHttpRequest по уму, то, конечно, мало просто сделать обёртку. Нужно сделать нормальный конструктор, чтобы работал оператор instanceof и можно было добавлять свои методы в XMLHttpRequest.prototype.

Так вооот... Я услышал обвинение в том, что пишу говнокод, но не услышал ни одного аргумента! Обоснуй или признай свою неправоту и извинись!

Позволь, я продемонстрирую тебе, что такое аргументы.. Ты говнокодишь, потому что:
1. Пишешь код, который не понятен большинству разработчиков. Такие сотрудники, как ты, нафиг не сдались работодателю: ты увольняешься, на твоё место приходит другой и тихо офигевает от твоего "творчества".
2. В твоём коде легко могут быть совершенно неочевидные ошибки, он сложно отлаживается (особенно если это делает не автор). Возвращаясь к & вместо &&. Если бы ты писал как белый человек и опечатался вот так:
if (!info.className) [
    info.className = "active";
]
, такая ошибка была бы сразу замечена и исправлена.
3. Ты хардкодишь как конченый говнокодер. Изменились id-шники - твой код не работает. Поменялась структура html и в кнопку вложен элемент - твой код не работает, потому что кнопка уже будет e.target. Добавили кнопке класс - твой код всё ломает, потому что: а) проверка !info.className уже не актуальна, но мы-то знаем, что это не важно:) б) info.className = "active" "убивает" все другие классы.

Вывод: такого говнокодера как ты, я бы на работу не взял!:)

Sweet 06.04.2014 02:01

Кстати, Poznakomlus, вот тебе на вооружение конструкция в твоём стиле:
var condition = true;

if (condition) [
    alert("Fuck мой мозг!!!")
]
:lol:

Vlasenko Fedor 06.04.2014 02:14

Sweet,
window.XMLHttpRequest - это что?
Ошибка синтаксиса в моем коде не влияла на работоспособность скрипта.
Да вбивал прямо в песочнице и, что ты эти хочешь сказать
Идиот я пишу решение задачи как я вижу, потому и привязываюсь к разметке. Если ты не понял то Poznakomlus - говорит о том, что я знакомлюсь с языком. Лучше чем на форуме решив задачи пользователя руку не надобьешь.
Выбирай тон своего диалога работадатель хренов.

рони 06.04.2014 02:43

Poznakomlus,
на всякий случай код после строк
Цитата:

Для того, чтобы найти TD, на котором был клик, нам нужно пройти вверх по цепочке родителей от target. Если в процессе этого мы дойдём до TD, то это означает, что клик был внутри этой ячейки.
тут
http://learn.javascript.ru/event-delegation
возможно вы его и знали.

Sweet 06.04.2014 02:52

Цитата:

Сообщение от Poznakomlus
window.XMLHttpRequest - это что?

Это undefined! Я уже третий раз повторяю - я не переопределяю ничего! Ещё раз повторю:
Цитата:

Сообщение от Sweet
посмотри мой говнокод ещё раз

Там есть проверка
if (!window.XMLHttpRequest) {
    window.XMLHttpRequest = ...

+ этот полифил нужно подключать через условный комментарий, потому что актуально только для ie.
Хз, как еще это объяснить. Если ты ещё хоть раз скажешь, что я переопределяю что-нибудь, идиот, очевидно - это ты!
Цитата:

Сообщение от Poznakomlus
Идиот

Батхёрт.
Цитата:

Сообщение от Poznakomlus
я пишу решение задачи как я вижу, потому и привязываюсь к разметке.

Нет, ты привязываешься к разметке, потому что пишешь плохое решение задачи (говнокод). И пофиг, как ты это видишь, хардкод - это антипаттерн. К тому же "я так вижу" и "это просто моё личное мнение" - это не аргумент. Всем насрать на твоё видиние.
Цитата:

Сообщение от Poznakomlus
я знакомлюсь с языком. Лучше чем на форуме решив задачи пользователя руку не надобьешь.

Те, кому ты выдаешь свои решения и не подозревают, что ты просто руку набиваешь:)
Цитата:

Сообщение от Poznakomlus
Выбирай тон своего диалога работадатель хренов.

Ты сам задал тон. Ты первый сказал, что я - говнокодер.

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

Vlasenko Fedor 06.04.2014 03:02

рони,
спасибо еще раз :)
http://javascript.ru/forum/misc/4411...-sobytiya.html
Sweet,
Цитата:

Сообщение от Sweet
Это такой способ enlarge your penis?


Sweet 06.04.2014 03:19

Poznakomlus, чувак, это же шутка. В которой есть доля шутки.:) К тому же почувствуй разницу: "ты дурак?" или "ты дурак!" Я ведь ничего не утверждал.

Sweet 06.04.2014 03:26

И ваще:

Vlasenko Fedor 07.04.2014 01:07

Sweet,
я кстати и 10 лет назад писал код :) . И как видишь тогда другого мнения были. http://www.vbnet.ru/samples/download.aspx?id=416
Я знаю несколько языков и мне не раз предлагали написать книги и быть рецензентом. По поводу твоего стеба в адрес моего кода. Скажу не говорите, что мне делать и я не скажу куда вам идти. Причем все начал ты же. На самом деле моими разработками решениями и велосипедами пользуются достаточно людей. И их отзывы для меня более важны чем твои высказывания как и что мне писать.


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