Существует плагин jQuery для общего случая прокрутки к элементу DOM, но если производительность является проблемой (и когда это нет?), я предложил бы делать его вручную. Это включает два шага:
quirksmode дает хорошее объяснение механизма позади первого. Вот мое предпочтительное решение:
function absoluteOffset(elem) {
return elem.offsetParent && elem.offsetTop + absoluteOffset(elem.offsetParent);
}
Это использует кастинг от пустого указателя до 0, который не является надлежащим этикетом в некоторых кругах, но мне нравится он:) Второе использование части window.scroll
. Таким образом, остальная часть решения:
function scrollToElement(elem) {
window.scroll(absoluteOffset(elem));
}
Вуаля!
Как правило, можно считать объявление переменной справа налево. Поэтому в случае int *ptr;
, это означает, что Вы имеете Указатель *
к Целочисленная переменная int
. Также, когда это объявило int **ptr2;
, это Переменная указателя *
к Переменная указателя *
указывающий Целочисленная переменная int
, который совпадает с "(int *)* ptr2;"
Теперь, после синтаксиса путем объявления int*& rPtr;
, мы говорим, что это Ссылка &
к Указатель *
, который указывает на переменная из типа int
. Наконец, можно применить снова этот подход также для [1 112] заключение, что он имеет значение Ссылка &
к Указатель *
к Указатель *
к Целое число int
.
Этот *& в теории, а также в практическом ее возможное и названный как ссылка на переменную указателя. и это - действие как то же. Этот *& комбинация используется в в качестве параметра функции для 'передачи' определением типа. в отличие от этого, ** может также использоваться для объявления двойной переменной указателя.
передача параметра разделена на передача значением, передача ссылкой, передача указателем . существует различный ответ о "передаче" доступными типами. однако основное, которого мы требуем для понимания для этой темы.
передача ссылкой -> обычно воздействует на уже созданную переменную, рецензируемую при передаче функции, например, fun(int &a);
, передача указателем -> Управляет на уже инициализированной 'переменной указателя / переменным адресом, передающим для функционирования, например, fun(int* a);
auto addControl = [](SomeLabel** label, SomeControl** control) {
*label = new SomeLabel;
*control = new SomeControl;
// few more operation further.
};
addControl(&m_label1,&m_control1);
addControl(&m_label2,&m_control2);
addControl(&m_label3,&m_control3);
в вышеупомянутом примере (это - реальная проблема, с которой я столкнулся), я пробую к init немногих переменная указателя от функции лямбды, и для этого мы должны передать его двойным указателем, так, чтобы шел с d-ссылкой указателя для ее всего использования в той лямбде +, в то время как передающий указатель в функции, которая берет двойной указатель, необходимо передать ссылку на переменную указателя.
так с этой ссылкой того же самого на переменную указателя, *& эта комбинация помогает. в ниже уступленного дорогу для того же примера я упомянул выше.
auto addControl = [](SomeLabel*& label, SomeControl*& control) {
label = new SomeLabel;
control = new SomeControl;
// few more operation further.
};
addControl(m_label1,m_control1);
addControl(m_label2,m_control2);
addControl(m_label3,m_control3);
, таким образом, здесь Вы видите, что ни требуете d-ссылки, ни мы требуем для передачи ссылки на переменную указателя при передаче в функции, поскольку текущая передача типом является уже ссылочной к указателю.
Hope это помогает :-)