Как привязать после отмены привязки в jQuery? - PullRequest
2 голосов
/ 03 декабря 2011

Мне нужна помощь с привязкой после того, как я открепил элемент По сути, у меня есть три элемента привязки, и я хочу добиться этого:

Когда один из них щелкается, два других не могут быть нажаты. Затем, когда пользователь нажимает кнопку закрытия, я хочу привязать событие щелчка ко всем трем ссылкам.

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

Может быть, есть какой-то другой способ добиться того, чего я хочу, кроме использования bind / unbind или on / off?

Edit:

Вот как я это сделал. Анимированный div называется miniContainer. Это пример для одного якоря, но он одинаков для всех трех.

       //First Link         
krug1Link.click(function(element){
   if(miniContainer.hasClass('animirano')){
       return false;
   };
   element.preventDefault();
   miniContainer.stop().animate({ height:360 },{duration:500,easing: 'easeOutBack'});
   miniTekst1.animate({opacity:'1'},1200);
   polaroidMali.animate({opacity:'1'},1200);
   miniContainer.addClass('animirano');
});

//Close Mini Container
close.click(function(element){
    miniTekst1.animate({opacity:'0'},1200);
    miniTekst2.animate({opacity:'0'},1200);
    polaroidMali.animate({opacity:'0'},1200);
    polaroidMali2.animate({opacity:'0'},1200);
    miniContainer.animate({marginTop: 10, height:1},{duration:600,easing: 'easeInBack'});
    miniContainer.removeClass('animirano');
});

Ответы [ 2 ]

8 голосов
/ 03 декабря 2011

Не bind и unbind, чтобы сделать это.

Выберите общего предка и используйте делегирование событий на основе селектора jQuery.

var clickables = $('.clickable');

$('#some_ancestor').delegate( '.clickable', 'click', function() {
    // to disable the others
    clickables.not( this ).removeClass('clickable');
});

Затем, чтобы снова включить их, просто добавьте класс обратно.

clickables.addClass( 'clickable' );

Если вы используете jQuery 1.7 или более позднюю версию, используйте вместо этого .on(), поскольку в него встроено делегирование событий.

$('#some_ancestor').on( 'click', '.clickable', function() {
    // to disable the others
    clickables.not( this ).removeClass('clickable');
});

Вот одно из решений из комментариев ниже.

демо: http://jsfiddle.net/c9Ydy/3/

<ul id="container"> 
    <li id="link1" class="box clickable">
        <a href="#">LINK ONE</a>
    </li>
    <li id="link2" class="box clickable">
        <a href="#">LINK TWO</a>
    </li>
    <li id="link3" class="box clickable">
        <a href="#">LINK THREE</a>
    </li>
</ul>

<div id="content_display">
    <button>CLOSE</button>
    <p id="link1_content">THIS IS THE CONTENT FOR THE FIRST LINK.</p>
    <p id="link2_content">THIS ONE IS FOR THE SECOND LINK</p>
    <p id="link3_content">AND THIS IS THE THIRD LINK</p>
</div>

1025 * JS *

var clickables = $('.clickable'),
    display = $('#content_display'),

    $content, // remember the one that was clicked
    display_animation_enabled = false;

$('#container').delegate( '.clickable', 'click', function() {

    display_animation_enabled = true;
    clickables.removeClass('clickable');

    if( $content ) { $content.hide(); }

    $content = $('#' + this.id + '_content').show();
    cycle();
});
display.find('p').hide();
display.find('button').click(function() {
    display_animation_enabled = false;
    clickables.addClass( 'clickable' );
    if( $content ) { $content.hide(); }
});
function cycle() {
    if( display_animation_enabled ) {
        display.animate({width:300,height:300})
               .animate({width:200,height:200}, cycle);
    }
}

1028 * CSS *

div.box {
    width: 50px;
    height: 50px;
    background: yellow;
    margin: 10px;
}

div.clickable {
    background: orange;
}

#content_display {
    width: 200px;
    height: 200px;
    background: yellow;
}
#content_display > p {
    margin: 10px;
    color: blue;
}
5 голосов
/ 03 декабря 2011

Не похоже, что вам нужно было бы отвязать / повторно связать, чтобы достичь желаемого результата.Просто используйте флаг.т. е.

//This is a variable that you will use to check whether any of the anchors have been
//clicked. If this flag is set to true, then the click handler below will not 
//perform any action when the other anchors are clicked. When this flag is set to false
//the click handler will take the desired action. From your description it sounds like
//the action might be opening a window of some sort...  
var buttonClicked = false;

//Bind a click handler to each anchor
$('#anchor-1').click(function(){

     //check to see if one of the anchors has already been clicked. If none have been
     //clicked take execute the code inside the if statement.
     if(!buttonClicked){

          //set the flag to true, indicating that one of the anchors has been clicked.
          buttonClicked = true;

          //Here you would open your window or popup...
          //i.e. popup.open();
     }
});

$('#anchor-2').click(function(){
     if(!buttonClicked){
           //logic for second anchor..
     }
});

//Bind a click handler to the close button you mentioned
$('.close-button').click(function(){

     //Close the window or popup here...
     //i.e. popup.close();

     //set the flag to false, which will allow all of the anchors to be clicked.
     buttonClicked = false;
});

Если ваша кнопка закрытия генерируется динамически, вам нужно будет использовать функцию live, делегировать или включить, а не функцию быстрого нажатия ...

...