Временно отключить событие jQuery

У меня есть что-то подобное, и оно было создано из jQuery .append(html)

 <div class="pPost">
<p>id</p>
<div class="pPostIn">
    <div class="link">
        <a href="http://www.google.com"></a>
    </div>
    <div class="id"></div>
    <div class="txt"></div>
</div>

Then a jQuery function like this:

РЕДАКТИРОВАТЬ: 3

$(function () {
$(".link").live({
    mouseenter: function () {
        $(this).css("background-position", "0 0"); //this works
        $(".pPost").die();
    },
    mouseleave: function () {
        $(this).css("background-position", ""); //this works
        $(".pPost").live("click", ajaxCall);
    }
});
return false;
});

И это работает, как и ожидалось, но проблема, которую я пытаюсь решить, заключается в том, как сделать этот .link исполняемый файл привязки, поскольку .pPost live функция «заняла 1-е место»? Я пытался .unbind()/.undelegate() .pPost, но безуспешно:

РЕДАКТИРОВАТЬ: 3

var ajaxLoad = function () {
    $(".pPost").live("click", function () {

        $.ajax({
            type: "POST",
            url: "rucno/php/archive_page_helper.php",
            data: idData,
            cache: false,

            success: function (html) {                    
                $(pPost).append(html).hide().slideDown(400, function () {
                    $(".link").hide().delay(1000).fadeIn(1000);
                });
            }
        });            
    });
  return false;
};

EDITED еще раз, но все равно, это не сработает :)


person InTry    schedule 09.02.2012    source источник


Ответы (2)


Когда вы используете live для привязки события, используйте die для его отмены.
Вы не можете повторно привязать событие, просто произнеся .bind() еще раз.

См. этот вопрос, чтобы временно отменить привязку события: jquery временные события отмены привязки

ИЗМЕНИТЬ

var ajaxLoad = function () {
  $.ajax({
    //blablabla
  });
  return false;
};

EDIT Перепривязать загрузку ajax.

// Rebind like this
$(".pPost").live("click", ajaxLoad);

РЕДАКТИРОВАНИЕ Поскольку ссылки находятся внутри .pPost, при перезагрузке ссылки теряют свою привязку и должны быть перепривязаны.

// Rebind links
$('a').click(fn);
$('.pPost').load('blabla.html',function() {
    $('.pPost a').click(fn);
});

EDIT Будьте осторожны со встроенными вызовами ajax:

var ajaxLoad = function () {
    $.ajax({
        type: "POST",
        url: "blabla.php",
        data: idData,
        cache: false,

        success: function (html) {

            $(pPost).append(html).hide().slideDown(400, function () {
                $(".link").hide().delay(1000).fadeIn(1000);
            });
        }
    });
};

А потом:

$(".pPost").live("click", ajaxCall);
person sinsedrix    schedule 09.02.2012
comment
die работает, а redbind нет :) ... я добавил код в первый пост - person InTry; 09.02.2012
comment
Никакая повторная привязка не работает, действительно перейдите на stackoverflow.com/questions/ 3408082/ и прочитайте лучший ответ! Нужно ли выполнять ваш вызов ajax несколько раз, если не связывать .pPost с .once(). - person sinsedrix; 09.02.2012
comment
да, он должен запускаться снова после того, как мышь покинет область .link - person InTry; 09.02.2012
comment
Извините, возможно, вам следует сделать скрипку, тогда мы сможем увидеть, что происходит не так. - person sinsedrix; 09.02.2012
comment
давайте продолжим это обсуждение в чате - person InTry; 09.02.2012

решено как «RamboNo5», предложенное в сообщении ">jQuery - Как я могу временно отключить прослушиватель событий onclick после того, как событие было запущено?

Мне нужно было просто изменить его, вот как это работает

HTML

 <div class="pPost">
<p>id</p>
<div class="pPostIn">
    <div class="link">
        <a href="http://www.google.com"></a>
    </div>
    <div class="id"></div>
    <div class="txt"></div>
</div>

js

$(function () {
var active= true;
$(function () {
    $(".link").live({
        mouseenter: function () {               
            active= false;                
        },
        mouseleave: function () {                
            active= true;              
        }
    });
    //return false;
});


$(function () {

    $(".pPost").live("click", function () {

        if (!active) {
            return;
        }

        $.ajax({
            type: "POST",
            url: "rucno/php/archive_page_helper.php",
            data: idData,
            cache: false,

            success: function (html) {                           
                $(pPost).append(html).hide().slideDown(400, function () {
                    $(".link").hide().delay(1000).fadeIn(1000);                        

                });

            }
        });

        return false;
    });
});
});
person InTry    schedule 11.02.2012