Страница справочника scandir () опытная странность

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

Может работать область действия селектора запросов до элемента, который вы храните в listItem . Вот пример:

const label = listItem.querySelector('.completedLabel');

Таким образом, он работает с повторным использованием вашего образца кода:

//move li item to completed list when checkbox selected
ul.addEventListener('change', (e) => {
	const checkbox = e.target;
	const checked = checkbox.checked;
	const listItem = e.target.parentNode.parentNode;
	const completedItems = document.querySelector('.completedItems');
	const label = listItem.querySelector('.completedLabel');

	if (checked) {
		completedItems.appendChild(listItem);
		label.style.display = 'none';
	}
});

Однако реализация может быть немного улучшена.

6
задан MattBelanger 1 November 2008 в 16:04
поделиться

3 ответа

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

Проблема состоит в том, что страница справочника для scandir () немного вводит в заблуждение. Прототип в для 4-го параметра является на самом деле интервалом (*cmp) (константа пусто *, константа пусто *).

Поэтому необходимо изменить код как так:

static inline int RubyCompare(const void *a, const void *b)
{
    return(strcmp((*(struct dirent **)a)->d_name, 
                  (*(struct dirent **)b)->d_name));
}

Я не на самом деле уверен, почему Вы пишете эту функцию, тем не менее, потому что можно использовать обеспеченный alphasort, сравнивают функцию:

num = scandir(buf, &entries, NULL, alphasort);
5
ответ дан 10 December 2019 в 02:55
поделиться

Вы даете ему подсказку к подставляемой функции? Это не имеет смысла, на самом деле интересно, который он даже компилирует только с предупреждением.

Править: Chris выше прав, встроенное ключевое слово просто проигнорировано тихо, когда оно не имеет смысла / не применимо.

1
ответ дан 10 December 2019 в 02:55
поделиться

Этот прототип фактически был изменен в последней версии GNU libc, чтобы отразить стандарт POSIX.

Если у вас есть код, который вы хотите работать как со старым, так и с новым кодом, используйте макрос __GLIBC_PREREQ, например

#define USE_SCANDIR_VOIDPTR 
#if defined( __GLIBC_PREREQ  )
# if  __GLIBC_PREREQ(2,10)
#  undef USE_SCANDIR_VOIDPTR
# endif
#endif

#ifdef USE_SCANDIR_VOIDPTR
 static int RubyCompare(const void *a,  const void *b)
#else 
 static int RubyCompare(const struct dirent **a,  const struct dirent **b)
#endif

...

3
ответ дан 10 December 2019 в 02:55
поделиться
Другие вопросы по тегам:

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