в javascript, возможно ли сохранить триггер по нажатию и повторно применить его позже? - PullRequest
0 голосов
/ 24 апреля 2011

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

для элементов, использующих триггеры по нажатию, хотели бы:

  • сохранить текущий триггер по нажатиюв атрибуте
  • удалить текущий триггер по щелчку
  • добавить триггер без параметров по умолчанию и без пропусков

для повторного включения:

  • избавиться от триггера без значения по умолчанию
  • повторно применить ранее сохраненный триггер
  • очистить атрибут, где он был сохранен

из ответов до сих пор:

гипотеза: с использованием чистого уровня javascript html5, без делегирования или какого-либо другого внешнего механизма, невозможно извлечь триггер по нажатию из элемента.

Решение

было очень соблазненным делегациями - и было побеждено неспособностью предотвратить утечки памяти.в конечном итоге это все равно было сделано с помощью простого gc.

расширяет (добавляет | удаляет) EventListener с (добавляет | толкает | поп | удаляет) PopableEventListener, делая изменение кода тривиальным.позволяет мне выдвигать и выдвигать слушателей на любой уровень - замечательно для изменений контекста формы, кроме простого включения / выключения.

source: http://code.google.com/p/chess-spider/source/browse/http/scripts/popable.js

doc: http://code.google.com/p/chess-spider/wiki/PopableEventListener?ts=1303738300&updated=PopableEventListener

Редакция

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

Ответы [ 4 ]

1 голос
/ 24 апреля 2011

Лучший способ обработки сотен триггеров - использовать делегирование события .

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

Реализация jQuery будет выглядеть примерно так:

$('.trigger', document.body).live('click', function(e) {
  var target = $(e.target);
  if (target.parents('.disabled').length > 0) {
    // handle click
  }
});

Очевидно, что вы можете использовать другие фреймворки или простой JavaScript, который вам больше подходит.

1 голос
/ 24 апреля 2011

Полагаю, вы говорите о добавлении и удалении слушателей. Вы можете сделать это несколькими способами, самый простой, если у вас есть только один прослушиватель для события, это добавить его как свойство элемента. Чтобы удалить его, просто присвойте null:

function sayHi() {
  alert('hi');
}

// Add a listener
var someElement = document.getElementById('someElementID');
someElement.onclick = sayHi;

// Remove it
someElement.onclick = null;

Если вам требуется более одного слушателя для события, вы можете использовать другие схемы, такие как addEventListener и attachEvent

Конечно, вы можете просто отслеживать состояние элементов (скажем, в классе или объекте), тогда слушатель может ответить на основании состояния.

1 голос
/ 24 апреля 2011

А как насчет классов?Что-то вроде

function act(e) {
    var target = e.currentTarget;
    if (target.className === 'active') {
        //element active, disable it
        target.className = 'disabled';
        //other stuff
    }
    else if (target.className === 'disabled') {
        //element disabled, enable it
        target.className = 'active';
        e.preventDefault();
        //other stuff
    }
}


elem.onclick = act;

Вы также можете быть смелым и использовать data-* атрибуты ( ссылка )

1 голос
/ 24 апреля 2011

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

Вот моя идея: http://jsfiddle.net/mazzzzz/MXEjv/1/ Это немного грязно, но две главные функции являются важными. Первый будет переключаться (в зависимости от класса), а второй скажет, включен ли элемент onclick (снова по классу). Просто убедитесь, что объекты имеют один и тот же класс, и один будет влиять на другой, и наоборот. С другой стороны, вы можете просто передать идентификатор вместо использования класса (как я сделал).
Надеюсь, это немного поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...