Проверьте, доступна ли/поддерживается ли (собственная) функция/класс/функция (например, MediaSource)

как я могу проверить с помощью Google Dart, доступна ли функция (например, MediaSource).

new MediaSource() выдает ошибку. Как программно проверить, существует ли этот класс или функция? Любые идеи? Есть ли встроенная функция для этого?

Я попытался попробовать/поймать, но похоже, что тип исключения отличается в браузере, который я использую.

РЕДАКТИРОВАНИЕ №2

youtube.com/html5 делает это так:

var mse = window['MediaSource'] || window['WebKitMediaSource'];
setCompatibility('c-mse', !!mse);

Так должен ли я просто использовать jsobject (пакет dart:js)?

С уважением и благодарностью, Роберт


person Robert    schedule 25.06.2014    source источник


Ответы (3)


Я нашел это:

import 'dart:js';
bool available = context.hasProperty('MediaSource');

У кого-нибудь есть лучшее решение? Для меня это выглядит как самое чистое решение.

С уважением, Роберт

person Robert    schedule 26.06.2014

Я думаю, что выдается TypeError, так что насчет перехвата исключения, если MediaSource не существует?

try {
  new MediaSource();
  // do something if MediaSource is available
} on TypeError catch(e) {
  // do something else if MediaSource is not available
}
person marfis    schedule 25.06.2014
comment
В Safari я получаю «UnknownJavaScriptObject». - person Robert; 26.06.2014
comment
Я думаю, что try-catch - это самое чистое решение, предполагающее, что context.hasProperty() имеет больше накладных расходов в отношении обменов dart ‹-› js. - person marfis; 26.06.2014
comment
Ну, может быть ошибка типа после того, как я создал объект MediaSource. Так что мне придется написать еще одну попытку/поймать, что, на мой взгляд, уродливо. И проверка должна быть сделана только один раз. - person Robert; 26.06.2014
comment
Я не понимаю этого, извините... вы можете просто проверять один класс за раз, и вы также можете сделать это только один раз. Если бы Dart предоставлял какую-то функцию для проверки существования класса, вам также приходилось бы вызывать ее каждый раз. - person marfis; 26.06.2014
comment
После выполнения new MediaSource() следует код для использования MediaSource. По какой-то неизвестной причине может случиться так, что произойдет ошибка TypeError (которая, кстати, не выдается). Таким образом, внешний блок catch поймает эту ошибку и сделает вид, что у нас нет MediaSource. Таким образом, нам пришлось бы писать try { new MediaSource(); try { further code } catch on TypeError (e1) { internal error } } catch on TypeError (e) { MS is not available }. Вот что мне не нравится. - person Robert; 26.06.2014
comment
Почему тогда вы помещаете все в одно предложение try? - person marfis; 27.06.2014

Dart предоставляет специальную аннотацию:

/**
 * An annotation used to mark a feature as only being supported by a subset
 * of the browsers that Dart supports by default.
 *
 * If an API is not annotated with [SupportedBrowser] then it is assumed to
 * work on all browsers Dart supports.
 */
class SupportedBrowser {
  static const String CHROME = "Chrome";
  static const String FIREFOX = "Firefox";
  static const String IE = "Internet Explorer";
  static const String OPERA = "Opera";
  static const String SAFARI = "Safari";

  /// The name of the browser.
  final String browserName;
  /// The minimum version of the browser that supports the feature, or null
  /// if supported on all versions.
  final String minimumVersion;

  const SupportedBrowser(this.browserName, [this.minimumVersion]);
}

Например:

@DomName('ApplicationCache')
@SupportedBrowser(SupportedBrowser.CHROME)
@SupportedBrowser(SupportedBrowser.FIREFOX)
@SupportedBrowser(SupportedBrowser.IE, '10')
@SupportedBrowser(SupportedBrowser.OPERA)
@SupportedBrowser(SupportedBrowser.SAFARI)
@Unstable()
class ApplicationCache extends EventTarget {
 ...

Вы можете определить версию браузера и получить (с зеркалами) аннотацию класса, который представляет некоторую веб-функцию. Если у него есть @Experimental и, возможно, @Unstable, то на него нельзя полагаться даже в поддерживаемых браузерах. Если у него есть аннотация @SupportedBrowser, а браузер пользователей есть в списке или у него вообще нет @SupportedBrowser, то все должно быть в порядке.

person JAre    schedule 04.07.2014
comment
Все еще немного громоздко, но мне нравится подход! Я надеюсь, что они добавят свойства, которые упростят проверку поддерживаемых функций. - person Günter Zöchbauer; 04.07.2014
comment
@GünterZöchbauer Я думаю, вы можете создать сценарий, который будет импортировать dart:html и обрабатывать его аннотации (с помощью зеркальной системы) во что-то вроде JSON, чтобы избежать накладных расходов во время выполнения. Этот скрипт может быть частью цепочки сборки, например, как преобразователь. - person JAre; 04.07.2014
comment
Для MediaSource это не работает. При использовании одной и той же и идентичной версии IE11 в Windows7 и Windows8.1 будут получены разные результаты. Поскольку IE11 в Win7 не поддерживает MediaSource, в отличие от Windows8.1. Таким образом, я бы предпочел проверку во время выполнения. - person Robert; 04.07.2014
comment
@Robert MediaSource имеет аннотацию @Experimental(), поэтому вам следует по возможности избегать ее использования в производстве. Но если вам это абсолютно необходимо, то вам подойдет проверка во время выполнения, но имейте в виду, что ваш код может сломаться в любой момент из-за обновления браузера или Dart SDK. - person JAre; 04.07.2014
comment
Мне это нужно, потому что это единственный способ заставить VideoStreaming работать в IE11 на Win8.1 для одного из наших видео - по какой-то неизвестной причине:/ - person Robert; 04.07.2014
comment
@Robert Можете ли вы использовать резервную копию Flash? У меня есть неудачный опыт работы с видео HTML5 в IE - оно действительно глючит. А крупные потоковые платформы, такие как twitch.tv, используют Flash. - person JAre; 04.07.2014
comment
Мы могли бы использовать флэш, но это немного сложно, потому что за этим стоит наша собственная рекламная/стриминговая система. Видео HTML5 в IE работает нормально. - person Robert; 04.07.2014