12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- Using the OpenLayers Javascript from the OpenLayers module can present some
- problems with rendering vector layers in IE.
- The root cause of the issue:
- Internet Explorer has a thing called VML: Vector Markup Language, which it uses
- to draw graphics. VML is what you use in IE: canvas4ie is way slow, google maps
- uses VML to draw routes, and OpenLayers uses it to draw vectors.
- VML elements are styled by creating CSS-like styles in a namespace. OpenLayers
- creates an ol: namespace and then creates styles like ol:line ol:circle, etc.
- To do this, it has to access document.namespaces. Document.namespaces is not
- always around: notably, you can't depend on it being around before
- document.ready.
- But, sometimes document.namespaces *is* around before document.ready and that's
- the thing that messed up my worldview. So, the theory was, there are modes.
- Something in HTML can prevent document.namespaces being filled in before
- document.ready.
- Here's how it goes.
- ### $( or $(document).ready()
- * If there is a broken image on the page, then namespaces is not filled in.
- * If the page has no broken images, then document.namespaces is accessible
- ### document.load()
- * document.namespaces is always filled in.
- ### 31 stylesheets
- IE cannot handle more than 31 stylesheets on a page at a time. This is clearly
- the devil's work, but it persists beyond IE8. If there are 31 stylesheets and
- you run an OpenLayers map, it cannot add another stylesheet to initialize its
- VML namespace. Therefore, the map breaks. You must aggregate your CSS.
- ### The Fix
- We can't move openlayers to document.load() because it is dependent on the
- Drupal behaviors stack, that runs on document.ready(). We need to just define
- document.namespaces before OpenLayers asks its VML renderer whether the current
- browser is capable of rendering VML (a task it tries to complete by calling
- !!(document.namespaces))
- ### Other Fixes
- Adding a tag
- <code><meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" /></code>
- will allow IE8 to render vectors if it doesn't render them correctly on a normal
- pageload. Note that this must be the first element inside the header tag.
- ### Image Opacity
- The opacity of image pointers are created with IE filters, which do not function
- correctly when combined with semi-transparent PNG images. Thus it is necessary
- to set opacity of such elements to 1.0 in order for alpha-transparent PNG images
- to appear correctly.
|