Удаление динамически добавленных обработчиков событий с помощью .off () [duplicate]

Pickle только сохраняет атрибуты экземпляра класса, но Synonyms - это список, определенный на уровне класса. Вы должны создать список в __init__ -методе:

import pickle

class Entry:
    def __init__(self, text):
       self.Text = text

class Term:
    def __init__(self):
        self.Main = None
        self.Synonyms = []

def Save():
    term = Term()
    term.Main = Entry("Dog")
    term.Synonyms.append(Entry("Canine"))
    term.Synonyms.append(Entry("Pursue"))
    term.Synonyms.append(Entry("Follow"))
    term.Synonyms.append(Entry("Plague"))

    terms = []
    terms.append(term)

    with open('output.pickle', 'wb') as p:
        pickle.dump(terms, p)

def Load():
    with open('output.pickle', 'rb') as p:
        loadedTerms = pickle.load(p)
    return loadedTerms
5
задан MegaMatt 28 May 2015 в 19:17
поделиться

3 ответа

После того, как вы прочитали через Интернет, ответ вы не можете! Вы можете удалить все или ничего. Обходной путь может быть примерно следующим:

$(document).on('click', '.btn', function (ev) {
    alert('pressed');
    $(this).removeClass("btn");
});

Demo @ Fiddle

Пример HTML:

<button class="btn">One</button>
<button class="btn">Two</button>
<button class="btn">Three</button>
6
ответ дан lshettyl 22 August 2018 в 09:36
поделиться
  • 1
    Таким образом, этот ответ будет работать для меня, но только потому, что мои обстоятельства таковы, что мне нужно только одно событие для запуска. Тем не менее, я вижу другие случаи, когда вам нужно будет удалить делегированное событие для определенного элемента на основе некоторой условной логики, которая может быть неверной при первом пожаре события. По этой причине я хотел бы увидеть способ сделать это. – MegaMatt 28 May 2015 в 17:11
  • 2
    В свете моего комментария выше, для меня имеет смысл, что один обработчик событий в самом документе - это только один обработчик событий, даже если он распространяется на другие элементы. Если вы посмотрите на это таким образом, не представляется логичным удалять обработчики из своих дочерних элементов, потому что они все равно не существуют. Вы либо удалили бы все это, либо вообще ничего. – MegaMatt 28 May 2015 в 17:12
  • 3
    Этот ответ, кажется, дает много понимания этой проблемы codereview.stackexchange.com/questions/16466/… – Zack 28 May 2015 в 17:17

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

Что это будет делать, так это предотвращать перемещение события по DOM и попадание на обработчик событий, который первоначально привязан к документу. Также это позволит вам сохранить некоторые функции при нажатии кнопки, например, предупреждение пользователю, что эта кнопка уже нажата - или что-то в этом роде.

$(document).on('click', 'button', function(ev) {
    // Your logic to occur on button click

    // Prevent further click on just this button
    $(this).click(function(event) {
        event.stopPropagation();
    }):
});
0
ответ дан kjb085 22 August 2018 в 09:36
поделиться

Вопрос: Вам нужно использовать делегированные события? LIke LShetty сказал, что невозможно удалить делегированное событие для одного элемента. Вы либо удаляете всю делегацию событий, либо оставляете ее. Вместо этого вы можете попробовать использовать другой селектор, как в этом примере

$('button').on('click', function(ev) {
    $('#output').append('Clicked! ');
    $(this).off('click');
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<button>One</button>
<button>Two</button>
<button>Three</button>
<div id="output"></div>

0
ответ дан Zack 22 August 2018 в 09:36
поделиться
  • 1
    Да, это нужно делегировать, потому что эти элементы будут появляться и выходить из страницы. Это динамическое веб-приложение. – MegaMatt 28 May 2015 в 17:13
  • 2
    В этом случае лучшим решением может быть что-то вроде решения LShetty, где вы добавляете / удаляете класс по элементам после их нажатия, поэтому делегированное событие больше не применяется к этим элементам. – Zack 28 May 2015 в 17:21
  • 3
    Да, это действительно похоже на лучшее решение. – MegaMatt 28 May 2015 в 20:08
Другие вопросы по тегам:

Похожие вопросы: