Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

HTML+CSS+JavaScript

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: глобальные переменные
 
 автор: ladan   (02.05.2013 в 10:47)   письмо автору
18.9 Кб
 
 

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

Написал так:

$(function () {
$('body').mousedown(function(e) { 

var param = 1;    
        
        if(e.which == 1) {
                            
                                        
                $('.content').mousedown(function(e) { if(e.which == 1) {param = 0;} });
                                
                                 /* здесь param всегда со значением 1, даже когда нажимаешь на элемент .content */
                             if(param) { $('content').hide(); }        
            
            }
        
 });

)};


Можете объяснить как сделать так, чтобы param менялся как глобальная переменная, а не только внутри функции? Прикрепил скриншот

  Ответить  
 
 автор: яса1   (02.05.2013 в 13:29)   письмо автору
 
   для: ladan   (02.05.2013 в 10:47)
 

var param = 1; 

  Ответить  
 
 автор: ladan   (02.05.2013 в 13:44)   письмо автору
 
   для: яса1   (02.05.2013 в 13:29)
 

не помогло



$(function () { 
$('body').mousedown(function(e) {  

param = 1;     
                                         
$('.content').mousedown(function(e) { param = 0; alert(param);  }); //Тут 0 
      
       alert(param);
// Здесь всегда 1, но нужно чтобы тоже был 0, если в строчке 
// выше я присваиваю 0. Получается, что из строчки выше 
// param доступен только в той функции         
             
         
 }); 

}); 

  Ответить  
 
 автор: яса1   (02.05.2013 в 14:05)   письмо автору
 
   для: ladan   (02.05.2013 в 13:44)
 

тарабарского (jquery) не знаю

потому объясню "на пальцах" работу системы закрытия тултипа по клику вне его:
-- в момент всплывания тултипа объекту document.body по событию onmousedown
назначается некая поименованная функция (методом addEventListener () или
attachEvent () для ранних версий MSIE)
-- эта функция определяет объект, по которому кликнули
-- и сразу проверяет - является ли этот объект тултипом
-- если НЕ является, функция начинает перебирать родителей этого объекта и каждого
из них спрашивает - не тултип ли он или не <body>?
-- если очередной объект отвечает "тултип", то происходит выход из функции без каких либо действий
-- если же отвечает <body>, то тултип закрывается и одновременно эта самая поименованная функция
с тела документа "снимается" (методом removeEventListener () или detachEvent () для
ранних версий MSIE)

  Ответить  
 
 автор: Deed   (02.05.2013 в 18:05)   письмо автору
852 байт
 
   для: яса1   (02.05.2013 в 14:05)
 

Вот архив:

P.S. Вполне можно обойтись без глобальной переменной.
P.P.S. "Закрывающий" клик целесообразнее назначать не "body", a "document".

  Ответить  
 
 автор: confirm   (02.05.2013 в 18:28)   письмо автору
 
   для: Deed   (02.05.2013 в 18:05)
 

Вообще-то вы используете глобальную переменную, утверждая, что можно обойтись без нее.
<script>
function setVar() {
   my = 1; //это установка ГЛОБАЛЬНОЙ переменной
}
</script>
<button onclick="setVar()">SET VAR</button>
<button onclick="alert(my)">GET VAR</button>

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

  Ответить  
 
 автор: Deed   (02.05.2013 в 18:35)   письмо автору
 
   для: confirm   (02.05.2013 в 18:28)
 

Так я и использовал эту param потому, что она была в вопросе.
Можно вполне обойтись без нее, достаточно проверки условия, что клик был сделан вне "диалога" с id="content":

$(e.target.id)!='content'

  Ответить  
 
 автор: confirm   (02.05.2013 в 18:47)   письмо автору
 
   для: Deed   (02.05.2013 в 18:35)
 

А к чему тогда вы архив прицепили? Утверждаете одно, приводите другое, да еще прицепом.

Проверка источника, это решение когда требуется скрывать один единственный объект, в противном случае это не удобно. Лучше использовать $.data() для body, в который записывать ссылку на объект, обработчик которого в данный момент обрабатывается.
Body вообще хорошее место "для свалки" ссылок, например для тех же глобальных событий, которые есть в jQuery.

  Ответить  
 
 автор: Deed   (02.05.2013 в 18:54)   письмо автору
 
   для: confirm   (02.05.2013 в 18:47)
 

Архив я "прицепил" для наглядной демонстрации примера. Это раз. А, во-вторых, месье Laban эту переменную использует в своем примере, фрагмент которого он привел. Откуда мне знать, что там у него вообще в планах с этим param'oм?
Я заметил, что эта переменная для реализации скрытия 'content' не нужна вообще, как бы вскользь, мимоходом, небрежно так...
Не придирайтесь к мелочам, мэтр!

  Ответить  
 
 автор: confirm   (02.05.2013 в 19:09)   письмо автору
 
   для: Deed   (02.05.2013 в 18:54)
 

Не Laban, а Ladan (отца перепутали), и не придираюсь, а просто не понял к чему это все, потому и написал так. )

  Ответить  
 
 автор: confirm   (02.05.2013 в 14:06)   письмо автору
 
   для: ladan   (02.05.2013 в 13:44)
 

Вы какой-то кошмар пишите, в обработчик события body прячете обработчик такого же события элемента. Вы понимаете, что за хрень в данном случае будет происходить? Писать надо либо раздельно, так:
$(function() {
   $('body').mousedown(function(e) {   
      param = 1;
      alert(param);      
   });
   
   $('.content').mousedown(function(e) { 
      e.stopPropagation();
      param = 0; 
      alert(param);  
   });
});
либо делегировать обработку. А если это глобальная переменная для всех, а изменением ее управляют эти два объекта, то нужно ее вынести:
var param;
$(function() {
   $('body').mousedown(function(e) {
......

  Ответить  
 
 автор: ladan   (02.05.2013 в 18:55)   письмо автору
 
   для: confirm   (02.05.2013 в 14:06)
 

всем спасибо за ответы, пойду разбираться :)



stopPropagation() - не знал этого метода, так теперь все понятно как-такие вещи делать )

  Ответить  
 
 автор: ladan   (02.05.2013 в 19:16)   письмо автору
 
   для: ladan   (02.05.2013 в 18:55)
 



$(function () {
            
                    
            $('body').click(function () {
                
                   $('div#fixed').fadeOut('fast');
                
                });
                
            
            $('div.content').click(function (event) {
                
                event.stopPropagation();
                
            });    
        
        });



да, тут без параметров все можно было сделать! Спасибо за советы и подсказки!!

  Ответить  
 
 автор: confirm   (02.05.2013 в 21:37)   письмо автору
 
   для: ladan   (02.05.2013 в 19:16)
 

Можно, но только в случаях, о которых говорилось выше. Например, при делегировании событий элементами нужно скрыть родителя этих элементов, если источником события не является определенный элемент из этого набора элементов. В этом случае нужно проверять источник. Но если такое действие определено для ряда элементов из их набора, то проверка источника для каждого из набора, это уже плохо. В этом случае нужно иметь ссылки на такие определенные элементы (организовать удобное представление элементов в DOM иерархии всегда можно, а значит и иметь такой список ссылок удобный для обращения по нему).

Задача "исполнить действие, если вне источника" возникает часто. Ваша задача пустяковая, но зачастую такая задача может иметь массу условий. К примеру, страница с товарами, при этом каждый товар можно набирать двумя способами - щелчками по кнопкам +/- и прямым вводом в поле ввода. При любом из способов набора товара где-то рядом с этим "полем боя" должна отображаться информации о сумме набранного в данный момент товара (просчитывается на клиенте, и выводится клиентом). Добавление набранного товара в корзину производится по нажатию на кнопу "Добавить в корзину".

Есть условие - если набран товар и не добавлен в корзину, а происходит переход в поле ввода (поле ввода получает фокус) или щелчок по кнопкам +/-/ "Добавить в корзину" другого товара, то поле предыдущего товара, в котором происходил набор должно быть очищено, а также удалена информация о его набранной сумме.

Вроде бы ничего сверх сложного, но нужно учитывать - различные источники; различные по типу события. Вот в этом случае становится ясно, что необходимо хранить ссылку на текущий источник (поле ввода), проверяя его на событиях потери фокуса. А так как добавление товара по кнопке и непосредственным вводом в поле, это одни и те же задачи, то разные типы событий от поле ввода и кнопок +/-/"Добавить в корзину" нужно делегировать родителю, обрабатывая их одним обработчиком, одновременно выполняя действие "щелкнули вне меня".

  Ответить  
 
 автор: ladan   (03.05.2013 в 10:45)   письмо автору
 
   для: confirm   (02.05.2013 в 21:37)
 

Спасибо, буду иметь ввиду! :)

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования