Используя стандартный тег OBJECT, как я могу отобразить Java-апплет с автоматическими подсказками для установки Java и с резервным контентом? - PullRequest
2 голосов
/ 08 ноября 2010

Это код, который я сейчас использую: (примечание -% s заменен на стороне сервера)

<!--[if !IE]>-->
<object
        type="application/x-java-applet"
        width="300" height="300"
>
<!--<![endif]-->
<!--[if IE]>
<object
        classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93"
        codebase="http://java.sun.com/update/1.6.0/jinstall-6u22-windows-i586.cab"
        type="application/x-java-applet"
        width="300" height="300"
>
<!--><!-- <![endif]-->
        <param name="codebase" value="/media/vnc/" >
        <param name="archive" value="TightVncViewer.jar" />
        <param name="code" value="com.tightvnc.vncviewer.VncViewer" />

        <param name="port" value="%s" />
        <param name="Open New Window" value="yes" />
</object>

Когда установлена ​​Java, это прекрасно работает как в IE, так и в Firefox. Когда Java не установлена, IE и Firefox правильно запрашивают автоматическую загрузку Java 1.6 из строки кодовой базы. (IE через URL-адрес activex, предоставленный firefox через службу поиска плагинов)

Теперь предположим, что я хочу, чтобы содержимое резервной копии отображалось, если плагин не установлен, скажем, простое сообщение типа «Получить Java». Из прочтения спецификации я бы предположил, что это не должно изменять подсказку для поиска плагина - то есть отрисовка отступления должна рассматриваться как сбой при визуализации тега объекта. Таким образом, я все еще должен получить сервис поиска плагинов, предлагающий мне установить Java. Вместо этого простое добавление одного символа к innerHTML элемента объекта приводит к тому, что Firefox больше не запрашивает. Проверьте это, посетив data:text/html,<object type='application/x-java-applet'>Java failed to load</object>.

Как сохранить Firefox, запрашивающий установку Java, с предоставлением запасного контента?

URL-адрес для проверки службы поиска плагинов Java в Firefox: data:text/html,<object type='application/x-java-applet'/>

Ответы [ 3 ]

1 голос
/ 27 июля 2011

Мне кажется, что использование [if IE] атрибутов classid и codebase усложняет HTML.Кроме того, они используются только для направления пользователя, если Java не установлена.Вместо этого, почему бы не использовать setTimeout в JS для вызова метода в апплете через несколько секунд, а если он не отвечает, тогда используйте JS, чтобы сообщить пользователю о действиях.Это упрощает объектный код примерно до следующего: -

<p>
<object type="application/x-java-applet"
    name="accessName" width="300" height="300">
    <param name="codebase" value="/media/vnc/" />
    <param name="code" value="com.tightvnc.vncviewer.VncViewer" />
    <param name="archive" value="TightVncViewer.jar" />
    <param name="scriptable" value="true" />
    <param name="mayscript" value="true" />
    <param name="port" value="%s" />
    <param name="Open New Window" value="yes" />
</object>
</p>

Если апплет должен вызывать JS, параметр mayscript необходим для плагинов Java до 1.6.0.10.Параметр сценария все еще требуется согласно javadocs 1.6.0.21, если JS должен вызвать апплет.Тем не менее, в одном из моих тестов с 1.6.0.24 для подписанного апплета IE8 назвал его «ОК» из JS без использования сценариев со значением true.Для вышеприведенного апплета вам не нужен «mayscript», иначе автор включил бы его, но вам может потребоваться «scriptable» для любого вызова setTimeout.

1 голос
/ 28 июля 2011

Как сохранить запрос Firefox на установку Java, предоставляя запасной контент?

Отредактируйте / сделайте метод start () апплета VncViewer, чтобы установить переменную Javascript. Из Javascript проверьте наличие переменной с помощью setTimeout или setInterval через несколько секунд. Если он не появляется, то java не работает, поэтому предупредите пользователя, чтобы получить последнюю версию java runtime от java.com. Вы даже можете использовать DOM, чтобы вставить кликабельную ссылку.

Должно работать для любого браузера, и появится резервный текст. HTML тоже проще: -

<object type="application/x-java-applet" width="300" height="300">
    <param name="codebase" value="/media/vnc/" />
    <param name="code" value="com.tightvnc.vncviewer.VncViewer" />
    <param name="archive" value="TightVncViewer.jar" />
    <param name="mayscript" value="true" />
    Java failed to load
</object>

Примечания

classid, используемый в вопросе для IE, находит версию java с самой высокой установленной пользователем. Если найденная версия меньше 1.6, тогда атрибут codebase предлагает пользователю скачать 1.6. Однако, если последняя версия была 1.7, исправления безопасности могли быть пропущены, так что не лучше ли запросить последнюю версию.

В плагине Java 1.5.0_06 (декабрь 2005 г.) в любом случае автоматически выбирается версия Java, установленная пользователем. Таким образом, использованный в этом вопросе classid кажется неуместным в 2011 году. Будет ли кодовая база работать самостоятельно, я не знаю.

В HTML4 атрибуты объекта classid и codebase должны представлять местоположение реализации (например, сам апплет), а не версию java. Таким образом, система IE выглядит совершенно нестандартно.

В HTML5 атрибуты classid и codebase устарели.

Использование атрибута или параметра «код» не указано ни в спецификации объекта HTML4, ни в HTML5.

Не удалось получить атрибут «data» HTML4 / 5, работающий в IE8 или FF5.

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

1 голос
/ 07 января 2011

Проверьте здесь: https://eyeasme.com/Shayne/XHTML/appletObject.html

Вопрос: почему существует только один закрывающий тег? Браузеры не IE увидят два открывающих тега OBJECT [да, второй не будет работать из-за неузнаваемого значения в атрибуте CLASSID], и они будут сопровождаться только одним закрывающим аналогом.

РЕДАКТИРОВАТЬ 2: К сожалению, я не мог заставить метод, описанный на этой странице, работать на Chrome. Все остальные браузеры [FF, IE, Safari и Opera - последние версии] работают отлично, кроме Chrome - он даже не загружает апплет / объект.

...