Спящий парикмахер с использованием семафоров, дающий ошибку: устаревший [дубликат]

Вот почему динамически созданные элементы не реагируют на клики & nbsp;:

var body = $("body");
var btns = $("button");
var btnB = $("<button>B</button>");
// `<button>B</button>` is not yet in the document.
// Thus, `$("button")` gives `[<button>A</button>]`.
// Only `<button>A</button>` gets a click listener.
btns.on("click", function () {
  console.log(this);
});
// Too late for `<button>B</button>`...
body.append(btnB);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button>A</button>

В качестве обходного пути вы должны прослушивать все клики и проверять исходный элемент & nbsp;:

var body = $("body");
var btnB = $("<button>B</button>");
var btnC = $("<button>C</button>");
// Listen to all clicks and
// check if the source element
// is a `<button></button>`.
body.on("click", function (ev) {
  if ($(ev.target).is("button")) {
    console.log(ev.target);
  }
});
// Now you can add any number
// of `<button></button>`.
body.append(btnB);
body.append(btnC);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button>A</button>

Это называется «Event Delegation». Хорошие новости, это встроенная функция в jQuery: -)

var i = 11;
var body = $("body");
body.on("click", "button", function () {
  var letter = (i++).toString(36).toUpperCase();
  body.append($("<button>" + letter + "</button>"));
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button>A</button>

22
задан Community 13 April 2017 в 12:45
поделиться

1 ответ

Я сам столкнулся с этой проблемой, пытаясь перенести библиотеку, над которой я работал, в OS X. Я искал какое-то время, не найдя отличный ответ. Когда я нашел ответ, я был немного обеспокоен: ответ действительно ", если Apple внедрила неназванные семафоры POSIX, сколько X Serves вы бы купили?" .

To суммировать точки, почему они устарели и почему некоторые функции остаются нереализованными:

  • Приложение 9 Единой спецификации UNIX заявляет, что они не являются обязательными интерфейсами
  • «Большинство переносных код "использует семафоры SYSV
  • Обратная совместимость с POSIX семафорами, которые совместно используют тип sem_t, трудно

Что касается того, что делать, я пошел с GCD семафоры. Что касается того, почему замена предпочтительнее: это единственный собственный неназванный интерфейс семафора, доступный на ванильной ОС X. Очевидно, GCD помог им продать больше X Serves. Я боюсь, что лучшего ответа нет.

Однако, надеюсь, какой-то код будет полезен. Результатом всего этого является то, что вам действительно нужно реализовать свой собственный переносимый интерфейс семафора:

#ifdef __APPLE__
#include <dispatch/dispatch.h>
#else
#include <semaphore.h>
#endif

struct rk_sema {
#ifdef __APPLE__
    dispatch_semaphore_t    sem;
#else
    sem_t                   sem;
#endif
};


static inline void
rk_sema_init(struct rk_sema *s, uint32_t value)
{
#ifdef __APPLE__
    dispatch_semaphore_t *sem = &s->sem;

    *sem = dispatch_semaphore_create(value);
#else
    sem_init(&s->sem, 0, value);
#endif
}

static inline void
rk_sema_wait(struct rk_sema *s)
{

#ifdef __APPLE__
    dispatch_semaphore_wait(s->sem, DISPATCH_TIME_FOREVER);
#else
    int r;

    do {
            r = sem_wait(&s->sem);
    } while (r == -1 && errno == EINTR);
#endif
}

static inline void
rk_sema_post(struct rk_sema *s)
{

#ifdef __APPLE__
    dispatch_semaphore_signal(s->sem);
#else
    sem_post(&s->sem);
#endif
}

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

23
ответ дан dho 19 August 2018 в 17:44
поделиться
Другие вопросы по тегам:

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