Звоните в функцию членства на необъекте [дубликат]

Google для надежного обнаружения браузера часто приводит к проверке строки агента пользователя. Этот метод не является надежным, так как тривиально обманывать это значение. Я написал метод обнаружения браузеров с помощью duck-typing .

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

Демо: https://jsfiddle.net/311aLtkz/

// Opera 8.0+
var isOpera = (!!window.opr && !!opr.addons) || !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0;

// Firefox 1.0+
var isFirefox = typeof InstallTrigger !== 'undefined';

// Safari 3.0+ "[object HTMLElementConstructor]" 
var isSafari = /constructor/i.test(window.HTMLElement) || (function (p) { return p.toString() === "[object SafariRemoteNotification]"; })(!window['safari'] || (typeof safari !== 'undefined' && safari.pushNotification));

// Internet Explorer 6-11
var isIE = /*@cc_on!@*/false || !!document.documentMode;

// Edge 20+
var isEdge = !isIE && !!window.StyleMedia;

// Chrome 1+
var isChrome = !!window.chrome && !!window.chrome.webstore;

// Blink engine detection
var isBlink = (isChrome || isOpera) && !!window.CSS;

Анализ надежности

предыдущий метод зависел от свойств механизма рендеринга ( -moz-box-sizing и -webkit-transform) для обнаружения браузера. Эти префиксы в конечном итоге будут удалены, поэтому, чтобы сделать обнаружение еще более надежным, я переключился на специфические для браузера характеристики:

  • Internet Explorer: JScript Условная компиляция (до IE9 ) и document.documentMode .
  • Edge: в браузерах Trident и Edge реализация Microsoft предоставляет конструктор StyleMedia. Исключение Trident оставляет нас с Edge.
  • Firefox: API Firefox для установки надстроек: InstallTrigger
  • Chrome: глобальный объект chrome содержащий несколько свойств, включая документированный объект chrome.webstore .
  • Safari: уникальный шаблон именования в его именах конструкторов. Это наименее прочный метод всех перечисленных свойств и угадайте, что? В Safari 9.1.3 он был исправлен. Поэтому мы проверяем SafariRemoteNotification, который был введен после версии 7.1, чтобы охватить все Safaris от 3.0 и выше.
  • Opera: window.opera существует в течение многих лет, но будет отброшена , когда Opera заменит свой движок Blink + V8 (используется Chromium). Обновление 1: Выпущена Opera 15 , ее строка UA выглядит как Chrome, но с добавлением «OPR». В этой версии определяется chrome объект (но chrome.webstore - нет). Так как Opera пытается клонировать Chrome, я использую для этого нюансы агента пользователя. Обновление 2: !!window.opr && opr.addons можно использовать для обнаружения Opera 20 + (вечнозеленых).
  • Blink: CSS.supports() был введен в Blink , как только Google включил Chrome 28. Это, конечно, тот же Blink, который используется в Opera.

Успешно протестировано в:

  • Firefox 0.8 - 61
  • Chrome 1.0 - 68
  • Opera 8.0 - 34
  • Safari 3.0 - 10
  • IE 6 - 11
  • Edge - 20-42

Обновлено в ноябре 2016 года, чтобы включить обнаружение браузеров Safari от 9.1.3 и выше

Обновлено в августе 2018 года, чтобы обновить последние успешные тесты на chrome, IE IE Firefox и краю.

blockquote>

67
задан Anant Singh---Alive to Die 5 June 2015 в 17:38
поделиться

2 ответа

Это означает, что $objPage не экземпляр объекта. Мы можем видеть код, Вы раньше инициализировали переменную?

, Поскольку Вы ожидаете тип конкретного объекта, можно также использовать подсказывающая типу функция PHPs <глоток> Документы для получения ошибки, когда логика нарушена:

function page_properties(PageAtrributes $objPortal) {    
    ...
    $objPage->set_page_title($myrow['title']);
}

Эта функция только примет PageAtrributes для первого параметра.

44
ответ дан Peter Warrington 24 November 2019 в 14:43
поделиться

Я понял, что не передавал $objPage в page_properties () . Это хорошо работает теперь.

-1
ответ дан Scott Gottreu 24 November 2019 в 14:43
поделиться
Другие вопросы по тегам:

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