在本文中,我们将带你了解为什么element.style在JS中总是返回空?在这篇文章中,我们将为您详细介绍为什么element.style在JS中总是返回空?的方方面面,并解答js中的element
在本文中,我们将带你了解为什么element.style在JS中总是返回空?在这篇文章中,我们将为您详细介绍为什么element.style在JS中总是返回空?的方方面面,并解答js中的element常见的疑惑,同时我们还将给您一些技巧,以帮助您实现更有效的ArrayList 中 elementData 为什么被 transient 修饰?、c# – 如何确定为什么Enyim memcache在存储项目时返回false?、com.google.gwt.dom.client.StyleElement的实例源码、css – 元素检查器中的element.style?。
本文目录一览:- 为什么element.style在JS中总是返回空?(js中的element)
- ArrayList 中 elementData 为什么被 transient 修饰?
- c# – 如何确定为什么Enyim memcache在存储项目时返回false?
- com.google.gwt.dom.client.StyleElement的实例源码
- css – 元素检查器中的element.style?
为什么element.style在JS中总是返回空?(js中的element)
display:block
在CSS中定义时,element.style.display
总是返回空。
console.log(document.getElementById(''test'').style.display)#map {display: block;}<div id="test">test</div>
但是,如果您在该元素中设置样式,则可以获取style.display详细信息。
console.log(document.getElementById(''test'').style.display) <divid="test">test</div>
我的问题不同。
内联样式不是编码的好方法。因此,我们总是在CSS中分配样式。但是,为什么在提供style属性
CSS
而不是通过element
时却显示为空?JavaScript是否特别无法读取css
style属性?
您可以在下面检查,即使我提供了,所有样式属性都为空display: block; align-content:center;
。 为什么?
console.log(document.getElementById(''test'').style)#map {display: block;align-content:center;}<div id="test">test</div>
答案1
小编典典element.style返回html文档中使用的内联样式,由于该样式不是直接在html中设置的,因此您将获得且值为空
您正在寻找的是computeedStyle,它将返回应用于元素的样式
console.log(window.getComputedStyle(document.getElementById(''test'')).display)#map { display: block; align-content:center; }<div id="test">test</div>
ArrayList 中 elementData 为什么被 transient 修饰?
Java 的 ArrayList 中,定义了一个数组 elementData 用来装载对象的,具体定义如下:
/**
* The array buffer into which the elements of the ArrayList are stored.
* The capacity of the ArrayList is the length of this array buffer. Any
* empty ArrayList with elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA
* will be expanded to DEFAULT_CAPACITY when the first element is added.
*/
transient Object[] elementData; // non-private to simplify nested class access
transient 用来表示一个域不是该对象序行化的一部分,当一个对象被序行化的时候,transient 修饰的变量的值是不包括在序行化的表示中的。但是 ArrayList 又是可序行化的类,elementData 是 ArrayList 具体存放元素的成员,用 transient 来修饰 elementData,岂不是反序列化后的 ArrayList 丢失了原先的元素?
其实玄机在于 ArrayList 中的两个方法:
/**
* Save the state of the <tt>ArrayList</tt> instance to a stream (that
* is, serialize it).
*
* @serialData The length of the array backing the <tt>ArrayList</tt>
* instance is emitted (int), followed by all of its elements
* (each an <tt>Object</tt>) in the proper order.
*/
private void writeObject(java.io.ObjectOutputStream s)
throws java.io.IOException{
// Write out element count, and any hidden stuff
int expectedModCount = modCount;
s.defaultWriteObject();
// Write out size as capacity for behavioural compatibility with clone()
s.writeInt(size);
// Write out all elements in the proper order.
for (int i=0; i<size; i++) {
s.writeObject(elementData[i]);
}
if (modCount != expectedModCount) {
throw new ConcurrentModificationException();
}
}
/**
* Reconstitute the <tt>ArrayList</tt> instance from a stream (that is,
* deserialize it).
*/
private void readObject(java.io.ObjectInputStream s)
throws java.io.IOException, ClassNotFoundException {
elementData = EMPTY_ELEMENTDATA;
// Read in size, and any hidden stuff
s.defaultReadObject();
// Read in capacity
s.readInt(); // ignored
if (size > 0) {
// be like clone(), allocate array based upon size not capacity
ensureCapacityInternal(size);
Object[] a = elementData;
// Read in all elements in the proper order.
for (int i=0; i<size; i++) {
a[i] = s.readObject();
}
}
}
ArrayList 在序列化的时候会调用 writeObject,直接将 size 和 element 写入 ObjectOutputStream;反序列化时调用 readObject,从 ObjectInputStream 获取 size 和 element,再恢复到 elementData。
为什么不直接用 elementData 来序列化,而采用上诉的方式来实现序列化呢?原因在于 elementData 是一个缓存数组,它通常会预留一些容量,等容量不足时再扩充容量,那么有些空间可能就没有实际存储元素,采用上诉的方式来实现序列化时,就可以保证只序列化实际存储的那些元素,而不是整个数组,从而节省空间和时间。
transient 分析
注意到的是 ArrayList 和 LinkedList 中的一些变量被 transient 关键字修饰。如 ArrayList 中的 elementData 数组,LinkedList 中指向头结点和尾结点的指针等。下面解释一下 transient 关键字的作用:
java 的 serialization 提供了一种持久化对象实例的机制。当持久化对象时,可能有一个特殊的对象数据成员,我不想用 serialization 机制来保存它。为了在一个特定对象的域上关闭 serialization,可以在这个域前加上关键字 transient。transient 是一个关键字,用来表示一个于不是该对象串行化的一部分。当一个对象被串行化的时候,被 transient 关键字修饰的变量的值不包括在串行化的表示中,非 transient 型的变量是被包括进去的。
那么既然用于保存数据的变量都被 transient 修饰,ArrayList 和 LinkedList 还能不能被序列化呢?
答案是可以的。对于 ArrayList 来说,如果不把 elementData 申明为 transient 类型,那么序列化的时候里面的数据都会被序列化,但是 elementData 这个数组很大程序是存在空值的情况(即 size《length),这时如果序列化就会导致磁盘空间被浪费。为了解决这个问题,ArrayList 将 elementData 申明为 transient,自己重写了 writeObject 方法,保证只序列化 elementData 中有数据的那部分,ArrayList 中的 writeObject 方法如下:
(见上文)
注意的是这里面也用到了 modCount,如果不一致说明这段时间集合发生了改变,抛出异常。
LinkedList 中的序列化和 ArrayList 中的序列化还不一样,LinkedList 中不会存在说有多余的元素这种说法,但是由于 LinkedList 中申明为 transient 类型的数据都可以不用进行序列化,所以进行申明,比如分别指向头结点和尾结点的 first 和 last 指针。
c# – 如何确定为什么Enyim memcache在存储项目时返回false?
cache.Store(Enyim.Caching.Memcached.StoreMode.Set,key,value);
其他项目的存储空间很好,所以连接到服务器似乎并不是一个问题.该对象似乎不超过1 MB.
那么如何确定是什么导致的错误?
解决方法
com.google.gwt.dom.client.StyleElement的实例源码
/** * Styles a multi-row selection with the number of elements. * * @param drag * the current drag event holding the context. */ void setmultirowDragdecoration(VDragEvent drag) { Widget widget = drag.getTransferable().getDragSource().getWidget(); if (widget instanceof VScrollTable) { VScrollTable table = (VScrollTable) widget; int rowCount = table.selectedRowKeys.size(); Element dragCountElement = Document.get().getElementById(SP_DRAG_COUNT); if (rowCount > 1 && table.selectedRowKeys.contains(table.focusedRow.getKey())) { if (dragCountElement == null) { dragCountElement = Document.get().createStyleElement(); dragCountElement.setId(SP_DRAG_COUNT); HeadElement head = HeadElement.as(Document.get().getElementsByTagName(HeadElement.TAG).getItem(0)); head.appendChild(dragCountElement); } SafeHtml formattedCssstyle = getDraggableTemplate().multiSelectionStyle(determineActiveTheme(drag),String.valueOf(rowCount)); StyleElement dragCountStyleElement = StyleElement.as(dragCountElement); dragCountStyleElement.setInnerSafeHtml(formattedCssstyle); } else if (dragCountElement != null) { dragCountElement.removeFromParent(); } } }
private static Registration injectCornerStyle(String id,Cell cell) { Color borderColor = cell.get(Cell.BORDER_COLOR); String border = borderColor == null ? "none" : "1px solid " + borderColor.toCssColor(); Color backgroundColor = cell.get(Cell.BACKGROUND); String background = backgroundColor == null ? Color.WHITE.toCssColor() : backgroundColor.toCssColor(); final StyleElement styleElement = StyleInjector.injectStylesheet("." + id + "::before { border-top: " + border + "; border-left: " + border + "; " + "background: linear-gradient(135deg," + background + " 0%," + background + " 70%,rgba(0,0) 71%,0) 100%) }"); StyleInjector.flush(); return new Registration() { @Override protected void doRemove() { styleElement.removeFromParent(); } }; }
@Test @Description("Check multi row drag decoration with a valid multi selection") public void processmultirowDragdecorationMultiSelection() { final ViewClientCriterion cut = new ViewClientCriterion(); // prepare table final VScrollTable table = Mockito.spy(new VScrollTable()); table.selectedRowKeys.add("one"); table.selectedRowKeys.add("two"); table.focusedRow = Mockito.mock(VScrollTable.VScrollTableBody.VScrollTableRow.class); when(table.focusedRow.getKey()).thenReturn("one"); // prepare drag-event with table widget: final VDragEvent dragEvent = CriterionTestHelper.createMockedVDragEvent("thisId",table,"myTheme"); dragEvent.getTransferable().getDragSource().getConnection().getUIConnector(); // prepare document final Document document = Document.get(); final StyleElement ele = Mockito.spy(StyleElement.class); when(ele.getTagName()).thenReturn(StyleElement.TAG); when(document.getElementById(ViewClientCriterion.SP_DRAG_COUNT)).thenReturn(ele); try { // act cut.setmultirowDragdecoration(dragEvent); // assure that multi-row decoration for the table was processed verify(document).getElementById(ViewClientCriterion.SP_DRAG_COUNT); // assure that no multi selection was detected verify(ele).setInnerSafeHtml(any(SafeHtml.class)); } finally { reset(Document.get()); } }
void init(Element css,Element header,Element footer) { cssElement = StyleElement.as(css); headerElement = header; footerElement = footer; csstext = getCsstext(this.cssElement); headerHtml = header.getInnerHTML(); footerHtml = footer.getInnerHTML(); }
private void handleStyling(String css) { if ((css == null) || (css.length() == 0)) { return; } if (isIE()) { addStyleSheet(css); } else { // Append custom css style as last thing in the Head element Element head = Document.get().getElementsByTagName("head").getItem(0); StyleElement styleElement = Document.get().createStyleElement(); styleElement.setType("text/css"); styleElement.setInnerText(css); head.appendChild(styleElement); } }
@Override protected String getCsstext(StyleElement el) { return el.getCsstext(); }
@Override protected void setCsstext(StyleElement el,String css) { el.setCsstext(css); }
protected String getCsstext(StyleElement el) { return el.getInnerHTML(); }
protected void setCsstext(StyleElement el,String css) { el.setInnerHTML(css); }
@Override public StyleElement injectStyle( Class<? extends HasstyleResources> bundle,Class<?>[] styles ) { throw new UnsupportedOperationException(); }
@Override public Out1<StyleElement> registerStyle( Class<? extends HasstyleResources> bundle,String css,Class<?>[] styles ) { throw new UnsupportedOperationException(); }
css – 元素检查器中的element.style?
解决方法
关于为什么element.style在JS中总是返回空?和js中的element的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于ArrayList 中 elementData 为什么被 transient 修饰?、c# – 如何确定为什么Enyim memcache在存储项目时返回false?、com.google.gwt.dom.client.StyleElement的实例源码、css – 元素检查器中的element.style?的相关知识,请在本站寻找。
本文标签: