Подтвердить что ты не робот

Ошибка IE10 d3.v3.js: невозможно получить свойство 'prototype' из undefined или нулевую ссылку

Моя страница отлично загружается в IE9, Safari, Chrome и Firefox.

Но когда он соединяется с IE10, он выдает ошибку: Не удалось получить свойство 'prototype' из undefined или null reference в d3.v3.js в строке: d3_window.CSSStyleDeclaration.prototype.

 try {
    d3_document.createElement("div").style.setProperty("opacity", 0, "");
  } catch (error) {
    var d3_style_prototype = d3_window.CSSStyleDeclaration.prototype, d3_style_setProperty = d3_style_prototype.setProperty;
    d3_style_prototype.setProperty = function(name, value, priority) {
      d3_style_setProperty.call(this, name, value + "", priority);
    };
  }

Я не понимаю, что именно делается здесь.

В блоке try, хотя метод setProperty можно увидеть в отладчике на d3_document.createElement("div").style это бросает ошибку как: Объект не поддерживает свойство или метод 'setProperty'

В блоке catch он пытается получить доступ к прототипу окна CSSStyleDeclaration, но это undefined.

Кто-то сталкивался с одной и той же проблемой при использовании d3.v3.js

4b9b3361

Ответ 1

Это можно исправить с помощью DOCTYPE:

<!DOCTYPE html>

И тег meta:

<meta http-equiv="X-UA-Compatible" content="IE=edge" />

Без них IE перейдет в режим quirks и не поймет, что такое CSSStyleDeclaration.

Ответ 2

Если бы такая же проблема случалась случайным образом, после некоторых исследований я пришел к выводу, что она устанавливает недопустимые свойства css (с точки зрения IE), которые вызвали ее, в моем случае:    someSvg.append('svg:text') .text(function (d) { return d.label; }) .attr('text-anchor', 'left')

Где он должен был быть

.attr('text-anchor', 'start')

Таким образом, мой совет будет состоять в том, чтобы просмотреть все стили из-scritpt или, что еще лучше, переместить их в css полностью. После такого исправления он должен работать как прелесть в IE9 +

Ответ 3

Похоже, это известная проблема, и вряд ли она будет исправлена.

https://groups.google.com/forum/?fromgroups=#!topic/d3-js/8lQ2BCR45BM

Обход - это выборочно загружать d3 - это работает для меня -

// load d3.js selectively
try { 
            // if this doesnt throw an error then we can load d3.js 
            // this is known to fail in IE < 8
            document.createElement("div").style.setProperty("opacity", 0, "")

            var d3Script = document.createElement( "script" )

            d3Script.src = "@Href("~/JavaScript/d3.js")"

            d3Script.onload = function (){
                // do stuff
            }

            document.getElementsByTagName("head")[0].appendChild( d3Script )
} catch( error ) {
            // upgrade your browser
}