Интуитивный способ рассуждать о линеаризации - это ссылка на порядок построения и визуализацию линейной иерархии.
Вы могли бы так думать. Сначала создается базовый класс; но прежде, чем он сможет построить базовый класс, сначала должны быть построены его суперклассы / черты (это означает, что конструкция начинается в верхней части иерархии). Для каждого класса в иерархии смешанные черты строятся слева направо, потому что черта справа добавляется «позже» и, таким образом, имеет шанс «переопределить» предыдущие черты. Однако, подобно классам, для того, чтобы построить признак, его базовые черты должны быть построены первыми (очевидными); и, вполне разумно, если черта уже построена (в любом месте иерархии), она не восстанавливается снова. Теперь порядок построения является обратной линеаризации. Подумайте о «базовых» чертах / классах как более высоких в линейной иерархии, а черты ниже в иерархии ближе к классу / объекту, который является предметом линеаризации. Линеаризация влияет на то, как «супер» разрешается в признаке: он будет решать ближайший базовый признак (выше в иерархии).
Таким образом:
var d = new A with D with C with B;
Линеаризация A with D with C with B
является
Таким образом, линеаризация: ADBC. Вы можете думать об этом как о линейной иерархии, где A - корень (самый высокий) и построен сначала, а C - лист (самый низкий) и построенный последним. [3] С учетом этих интуитивных правил d.foo
вызывает C.foo
, который возвращает «C», за которым следует super.foo()
, который разрешен на B
(черта слева от B
, т.е. выше / до, в линеаризации), которая возвращает «B», а затем super.foo()
, которая разрешена на D
, которая возвращает «D», а затем super.foo()
, который разрешен на A
, который, наконец, возвращает «A». Итак, у вас есть «CBDA».
В качестве другого примера я подготовил следующее:
class X { print("X") }
class A extends X { print("A") }
trait H { print("H") }
trait S extends H { print("S") }
trait R { print("R") }
trait T extends R with H { print("T") }
class B extends A with T with S { print("B") }
new B // X A R H T S B (the prints follow the construction order)
// Linearization is the reverse of the construction order.
// Note: the rightmost "H" wins (traits are not re-constructed)
// lin(B) = B >> lin(S) >> lin(T) >> lin(A)
// = B >> (S >> H) >> (T >> H >> R) >> (A >> X)
// = B >> S >> T >> H >> R >> A >> X
<div>
не должно быть способно к получению фокуса, если Вы не добавили tabIndex.
Если Вы добавили tabIndex
, необходимо удалить его
document.getElementById("yourElement").removeAttribute("tabIndex");
Я не уверен, можно ли сделать элемент 'un-focusable', но можно, конечно, не сфокусировать его в отдельном моменте во время с помощью blur
метод:
document.getElementById("myElement").blur();
Править:
Я думаю, что можно сделать элемент 'un-focusable' путем дефокусировки его каждый раз, когда это фокусируется. Можно выполнить это через:
document.getElementById("myElement").onfocus = function() {
this.blur();
};
... или (использующий встроенный JavaScript в Вашем HTML):
<div onfocus="this.blur();"></div>
Steve
Легкая фиксация могла быть сделана путем добавления CSS:
div_selector{
pointer-events: none;
}
Или Путем добавления той же CSS с помощью jQuery:
$(div_selector).css('pointer-events', 'none');