Лучший способ определить, что HTML5 не поддерживается

Я бы проанализировал все дерево как JObject, а затем позвонил ToObject<> на соответствующие под-объекты. Пример кода:

using System;
using System.IO;
using System.Linq;
using Newtonsoft.Json.Linq;

class Example
{
    public string Name { get; set; }
    public int Age { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        var json = File.ReadAllText("test.json");
        var root = JObject.Parse(json);        
        var profile = (JObject) root["Profile"];
        var map = profile.Properties()
                         .ToDictionary(p => p.Name, p => p.Value.ToObject<Example>());
        foreach (var entry in map)
        {
            Console.WriteLine($"Key: {entry.Key}; Name: {entry.Value.Name}; Age: {entry.Value.Age}");
        }
    }
}

JSON:

{
  "Profile": {
    "dProperty1": {
      "name": "First",
      "age": 30,
      "extra": "Ignored"
    },
    "dProperty2": {
      "name": "Second",
      "age": 25
    },
    "dProperty3": {
      "name": "Third",
      "age": 50
    }
  }
}

Результат:

Key: dProperty1; Name: First; Age: 30
Key: dProperty2; Name: Second; Age: 25
Key: dProperty3; Name: Third; Age: 50
137
задан kangax 23 October 2013 в 10:41
поделиться

6 ответов

Это метод, используемый в Modernizr и практически во всех других библиотеках, которые работают с холстами:

function isCanvasSupported(){
  var elem = document.createElement('canvas');
  return !!(elem.getContext && elem.getContext('2d'));
}

Поскольку ваш вопрос был для обнаружения, когда это не поддерживается, я рекомендую использовать его так:

if (!isCanvasSupported()){ ...
215
ответ дан 23 November 2019 в 23:31
поделиться

Если Вы собираетесь получить контекст своего холста, Вы могли бы также использовать его в качестве теста:

var canvas = document.getElementById('canvas');
var context = (canvas.getContext?canvas.getContext('2d'):undefined);
if(!!context){
  /*some code goes here, and you can use 'context', it is already defined*/
}else{
  /*oof, no canvas support :(*/
}
0
ответ дан 23 November 2019 в 23:31
поделиться

Существует два популярных метода обнаружения поддержки холста в браузерах:

  1. Предложение Мэтта проверки существования getContext , также аналогичным образом используется библиотекой Modernizr:

     var canvasSupported = !! document.createElement ("canvas"). getContext; 
     
  2. Проверка существования интерфейса HTMLCanvasElement , как определено в WebIDL и спецификации HTML . Этот подход был также рекомендован в сообщении в блоге команды IE 9 .

     var canvasSupported = !! window.HTMLCanvasElement; 
     

Я рекомендую вариант последнего (см. Дополнительные примечания ) по нескольким причинам:

  • Все известные браузеры поддержка Canvas - включая IE 9 - реализует этот интерфейс;
  • Он более краток и сразу становится очевидным, что делает код;
  • Подход getContext значительно медленнее во всех браузерах , потому что это предполагает создание HTML-элемента. Это не идеально, когда вам нужно максимально увеличить производительность (например, в такой библиотеке, как Modernizr).

Использование первого метода не дает заметных преимуществ. Оба подхода можно подделать, но это вряд ли произойдет случайно.

Дополнительные примечания

По-прежнему может потребоваться проверка возможности получения двухмерного контекста. Как сообщается, некоторые мобильные браузеры могут возвращать true для обеих вышеуказанных проверок, но возвращать null для .getContext ('2d') . Вот почему Modernizr также проверяет результат .getContext ('2d') . Однако WebIDL и HTML - опять же - дают нам еще один лучший, более быстрый вариант:

var canvas2DSupported = !!window.CanvasRenderingContext2D;

Обратите внимание, что мы можем полностью пропустить проверку элемента холста и сразу перейти к проверке поддержки 2D-рендеринга. Интерфейс CanvasRenderingContext2D также является частью спецификации HTML.

Вы должны использовать подход getContext для обнаружения поддержки WebGL , потому что, хотя браузер может поддерживать WebGLRenderingContext , ] getContext () может вернуть null , если браузер не может взаимодействовать с графическим процессором из-за проблем с драйверами, а программная реализация отсутствует. В этом случае проверка интерфейса сначала позволяет пропустить проверку для getContext :

var cvsEl, ctx;
if (!window.WebGLRenderingContext)
    window.location = "http://get.webgl.org";
else {
    cvsEl = document.createElement("canvas");
    ctx = cvsEl.getContext("webgl") || cvsEl.getContext("experimental-webgl");

    if (!ctx) {
        // Browser supports WebGL, but cannot create the context
    }
}

Сравнение производительности

Производительность подхода getContext в Firefox на 85-90% ниже. 11 и Opera 11 и примерно на 55% медленнее в Chromium 18.

Simple comparison table, click to run a test in your browser

103
ответ дан 23 November 2019 в 23:31
поделиться

Здесь может быть ошибка - некоторые клиенты не поддерживают все методы холста.

var hascanvas= (function(){
    var dc= document.createElement('canvas');
    if(!dc.getContext) return 0;
    var c= dc.getContext('2d');
    return typeof c.fillText== 'function'? 2: 1;
})();

alert(hascanvas)
2
ответ дан 23 November 2019 в 23:31
поделиться

Обычно я проверяю getContext при создании объекта canvas.

(function () {
    var canvas = document.createElement('canvas'), context;
    if (!canvas.getContext) {
        // not supported
        return;
    }

    canvas.width = 800;
    canvas.height = 600;
    context = canvas.getContext('2d');
    document.body.appendChild(canvas);
}());

Если он поддерживается, то можно продолжить настройку холста и добавить его в DOM. Это простой пример Progressive Enhancement, который я (лично) предпочитаю Graceful Degradation.

13
ответ дан 23 November 2019 в 23:31
поделиться

Почему бы не попробовать modernizr ? Это библиотека JS, обеспечивающая возможность обнаружения.

Цитата:

Вы когда-нибудь хотели сделать if-выражения в своем CSS для доступности таких интересных функций, как border-radius? Что ж, с Modernizr вы можете этого добиться!

6
ответ дан 23 November 2019 в 23:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: