Лучший способ найти элементы DOM с css селекторами

Хотя Base и Derived являются ковариантными и необработанные указатели на них будут действовать соответственно, shared_ptr<Base> и shared_ptr<Derived> не являются не ковариантными. dynamic_pointer_cast является правильным и простым способом решения этой проблемы.

( Редактировать: static_pointer_cast было бы более уместно, потому что вы проводите от производной к базовой, что безопасно и не требует проверок во время выполнения. См. Комментарии ниже.)

Однако, если ваша функция foo() не желает участвовать в продлении срока службы (или, скорее, участвовать в общем владении объектом), то лучше всего принять const Base& и разыменовать shared_ptr ] при передаче его на foo().

void foo(const Base& base);
[...]
shared_ptr<Derived> spDerived = getDerived();
foo(*spDerived);

Кроме того, поскольку типы shared_ptr не могут быть ковариантными, правила неявного преобразования через ковариантные типы возвращаемых данных не применяются при возврате типов shared_ptr<T>.

21
задан Stefan 20 May 2009 в 08:52
поделиться

4 ответа

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

Имея это в виду, функция выбора должна включать много операторов if / else / else if или switch case для обработки всех разные селекторы. Пример:

function select( selector ) {
 if(selector.indexOf('.') > 0) //this might be a css class
   return document.getElementsByClassName(selector);
 else if(selector.indexOf('#') > 0) // this might be an id
   return document.getElementById(selector);
 else //this might be a tag name
   return document.getElementsByTagName(selector);
 //this is not taking all the different cases into account, but you get the idea.
};
3
ответ дан 29 November 2019 в 06:17
поделиться

Создание механизма выбора - непростая задача. Я бы посоветовал изучить то, что уже существует:

  • Sizzle (Создано Resig, используется в jQuery)
  • Peppy (Создано Джеймсом Донахью)
  • Sly (Создано Харальдом Киршнером) )
3
ответ дан 29 November 2019 в 06:17
поделиться

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

http://www.openjs.com/scripts/dom/css_selector/

2
ответ дан 29 November 2019 в 06:17
поделиться

Нет, встроенного способа нет. По сути, если вы решите отказаться от jQuery, вы скопируете его версию с ошибками в свой код.

0
ответ дан 29 November 2019 в 06:17
поделиться
Другие вопросы по тегам:

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