2009-12-21 2 views
0

Прежде всего, спасибо за ваше внимание.JQuery не проблема выбора

У меня есть html-документ с оберткой (контейнером) внутри. Я хочу сделать так, чтобы, когда кто-то нажимает на раздел тела страницы, они перенаправляются на xxx, но если они нажимают на оболочку (содержимое страницы), они не перенаправляются. Я пробовал все, но селектор jquery для $ ('body') выбирает все внутри тела, и я, похоже, не понимаю, как выбрать все, что не в #wrapper. я пытался что-то вроде этого:

$('*').not('#wrapper').click(function(){ 
      window.location = 'http://www.example.com/example-page'; 
     }); 

не повезло,

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

alex_

+0

, вероятно, должно быть:. '$ ('Body> *') нет ('# обертка')' –

ответ

0

Наверное что-то вроде этого ..

$(document).click(function(e){ 
    var el = $(e.target); 
    if ( 
     (!$(el).is('#wrapper')) && 
     $(el).closest('#wrapper').length === 0 
    ) { 
     window.location.href = 'http://msn.com'; 
    } 
}); 

ли не тест , Я бы не рекомендовал этого вообще, хотя это было навязчивое и странное поведение.

+0

Я попытался это и не сработало. Спасибо, хотя – Alex

+0

Действительно? Ты уверен? Я просто протестировал его в stackoverflow, используя '.container' вместо' # wrapper', и он, похоже, сработал. Можете ли вы поставить тестовую страницу? –

+0

Кстати, для тестирования поместите границу вокруг #wrapper, если сможете, и убедитесь, что она содержит поплавки. –

-1

Возможно, попробуйте использовать функцию фильтра. Это позволяет вам выделять нежелательные результаты из набора элементов.

http://docs.jquery.com/Traversing/filter

+0

Я пробовал этот и казался многообещающим ... но, в конце концов, он просто фильтрует все это. Поэтому он не перенаправлялся. Спасибо, бутон. – Alex

1
$('*').not('#wrapper').click(function(){ 
      window.location = 'http://www.merkados.com/quote-request'; 
    }); 

будет связывать событие для всех элементов, кроме #wrapper. поэтому, если ваш HTML является

<div id="anotherdiv"><div id="wrapper">adsads</div></div> 

#anotherdiv получит нажмите на adsads. Вы можете использовать stopPropagation() для события

+0

Я думаю, что это может сработать, если лучше понять метод stopPropagation() ... Я собираюсь изучить его. Спасибо – Alex

0

Я думаю, что вы хотите использовать это:

$(':not(#wrapper)').click(function(){ 
    window.location = 'http://www.example.com/example-page'; 
}); 
+0

не будет ли это еще не учитывать детей #wrapper? и не будет ли это неэффективно, поскольку он прикрепляет обработчик события клика по нескольким элементам? –

+0

Я согласен с Медером, это выбирает много вещей ... Спасибо, хотя – Alex

1

ли stopPropagation() работает на IE вкусами? Возможно, использование старого «return false» в конце останавливает событие от получения в другом месте.

Кроме того, необходимо выполнить некоторую проверку нечетного агента - уже доступную в JQuery. (Если MSIE, а затем сделать

event.cancelBubble = true; 

еще, используйте метод stopPropagation

event.stopPropagation(); 

)

+0

Хм, ну, на данный момент мне придется обойтись без версии IE ... но спасибо ... – Alex

0

Я сделал это, ребята !! Спасибо, что открыли мне глаза! Вы, ребята, сделали это! Вот окончательный код:

$(':not(#wrapper)').click(function(event){ 
      if($(this).hasClass('cl')) { 
       window.location = 'http://www.example.com/example-page'; 
      } 
       event.stopPropagation(); 

     }); 

Как вы можете видеть, что я сделал, я добавил класс только к телу. StopPropagation в основном останавливает вызовы с #wrapper, поэтому он в основном работает только с той частью тела, которая имеет cl, а не с #wrapper.

Еще раз спасибо, ребята, рок!

+0

Можете ли вы предоставить разметку ? im все еще озадачен, почему мой не работает: p –

2

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

$("#wrapper").click(function(){ 
    return false; 
}); 

$("body").click(function(){ 
    console.log("body click"); 
});