Xpoint
   [напомнить пароль]

Правильный способ определить наличие/отсутствие JVM в броузере

Метки: [без меток]
[арх]
2006-02-16 15:55:55 [обр] Даниэль Алиевский(35/125)[досье]

Должен сознаться, что очень долго я использовал совершенно негодный метод (JavaScript):

if (window.navigator.javaEnabled()) 
    есть Java
else 
    нет Java

Даже в голову не приходило, что это может не работать. Соответственно не тестировал (у меня-то Java всегда была). На ошибку напоролись уже мои пользователи. Деинсталлировал все свои многочисленные JVM, начал тестировать. Выяснил, что в MSIE и FireFox метод javaEnabled() возвращает состояние флага "Enable Java", не обращая внимания на фактическое наличие Java-машины. И лишь Opera разумно возвращает false, когда никакая JVM не инсталлирована, невзирая на свой флаг "Enable Java".

Кстати, поэтому моей статистике Статистика присутствия в броузерах версий JVM доверять не следует. Каюсь. Если не забуду, через недельку опубликую новые (правильные) данные.

Хочу описать, как я сейчас определяю отсутствие Java. Покритикуйте, пожалуйста - может быть, есть способ лучше (надежнее).

Метод довольно простой, конечно. Вначале JavaScript проверяет javaEnabled(). Если false, будем считать, что Java выключена (рекомендую пользователю проверить настройку броузера). Если true, то (слегка упрощаю) document.writeln печатает теги <applet...>...</applet> (специально написанный микро-апплет, размер 1x1). Если Java есть, то апплет, загрузившись, выполняет внешний JavaScript (через netscape.javascript.JSObject), с помощью которого я могу узнать версию Java. Все это было и раньше.

Но теперь перед </applet>, после параметров, добавляется некий прозрачный img размером 1x1, у которого есть атрибуты name="nnnnn" и id="nnnnn". (Обычно в этом месте пишут что-нибудь типа "Требуется Java".) Выдав на страницу весь этот HTML-код, я запускаю цикл setTimeout (10 раз по секунде), ожидая следующего условия:

    if (document.getElementById!=null && document.getElementById("nnnnn")!=null) {
        noJava= true;
    } else if (document.images["nnnnn"]!=null) { 
        // для старых броузеров
        // я знаю, что в Netscape 4.X, когда все находится внутри layer, это не сработает - ну и ладно
        noJava= true;
    }
    if (noJava) 
        прекращаем цикл setTimeout;

Понятно, что уже через секунду, при отсутствии Java, скрипт увидит img с именем и id "nnnnn". 10 итераций - это перестраховка.

У метода очевидные минусы. Громоздко. Нельзя определить отсутствие Java немедленно. Засоряет страницу, даже когда Java нет. Наконец, я не до конца уверен, что ни один броузер, в котором апплеты все же работают, не найдут по getElementById объект nnnnn. (Они обязаны его не показывать, но, может быть, в DOM он все же будет отражен?)

Можно ли сделать лучше?

Я пробовал вместо img вписывать туда <script...>noJava= true</script>, но это никогда не срабатывает в MSIE / Opera, а в FireFox, наоборот, срабатывает даже при наличии JVM. Т.е. глючит, надо полагать.

Подскажите, пожалуйста. Хотелось бы использовать максимально надежный метод.

спустя 41 минуту [обр] 30-ый(59/584)[досье]
А что мешает не из апплета обращаться к скрипту, а из скрипта к апплету?
спустя 17 минут [обр] Даниэль Алиевский(35/125)[досье]
30-ый[досье] Для данного вопроса это неважно - такое обращение нужно лишь для уточнения версии Java, а не для проверки ее наличия. Однако, если Вам интересно - просто так проще. И работает на всех современных броузерах. Кажется, не работало лишь в MSIE 4.X. Если обращаться из скрипта к апплету, то пришлось бы вначале дожидаться, пока апплет загрузится, а это нетривиальная задача. Тема уже обсуждалась, странно, что не могу найти через поиск. (Удалили?)
спустя 2 часа 34 минуты [обр] 30-ый(59/584)[досье]

Мне просто казалось, что так было бы надежнее. Такой метод уж точно не зависит от того, будет ли броузер подверстывать в DOM невидимые элементы или нет. Тем более, что ждать загрузки апплета вроде так и так придется...

Мне кажется тут очень важно избежать ложного определения отсутствия(!) джавы. Если у меня джавы нет и все осыпется у меня останется шанс самому догадаться в чем дело. Если же у меня джава есть, а ничего не работает, то это значительно страншее и меня бы чертовски разозолило.

спустя 52 минуты [обр] Даниэль Алиевский(35/125)[досье]

30-ый[досье]

Мне просто казалось, что так было бы надежнее.

Да, но как я отличу ситуацию, когда Java нет, от ситуации, когда апплет просто не успел скачаться / инициализироваться? Поставить тайм-аут? На сколько? На плохом модеме и слабой машине скачивание апплета + инициализация JVM 1.5 может занять минуту. А минутный таймаут, в течение которого мы не уверены в отсутствии Java - чересчур долго.

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

В моем случае, пожалуй, наоборот. Я использую Java в Анти-Анонимайзере (см. Об анти-анонимайзере). Если Java есть, а мне кажется, что апплет просто не успел загрузиться, и пользователь пытается отправить сообщение в форум, то в этой ситуации пользователю предлагается "чуть-чуть подождать". Представляете ситуацию: человек ждет, ждет, а каждая новая попытка послать сообщение приводит к сообщению "подождите еще". Вот если обнаружено отсутствие Java, ему внятно посоветуют ее скачать и инсталлировать.

Да и в других случаях. Если отсутствие Java мы ошибочно принимаем за недогруженный апплет, то нам остается только проинформировать посетителя о продолжении загрузки. Без всяких указаний, что можно предпринять. А вот в случае ложного обнаружения отсутствия Java всегда можно предложить что-то осмысленное: в худшем случае предложить скачать JVM и проверить настройки броузера, в лучшем - перейти на альтернативую ветку.

Все это, конечно, при условии, что мой метод в принципе верен и не будет на некоторых броузерах стабильно обнаруживать DOM-эдемент img, когда он расположен внутри <applet...>...</applet>, даже при наличии Java. Я проверял в FireFox 1.5, MSIE 6 и Opera 8.5.

спустя 19 часов [обр] Александр Самойлов(37/342)[досье]
<script>
if (window.navigator.javaEnabled()) {
    try {
        java.lang.System.getProperty("java.vm.version")
        alert(true)
    } catch(exception) {
        alert(false)
    }
} else {
    alert(false)
}
</script>
спустя 2 дня 17 часов [обр] Даниэль Алиевский(35/125)[досье]
Александр Самойлов[досье]
Спасибо, это очень изящно. Но, к сожалению, не работает с самой популярной (пока) микрософтовской Java-машиной 1.1.4, встроенной в MSIE. По крайней мере, у меня (MSIE 6, XP SP 2) сработала ветка catch.
спустя 1 день 1 час [обр] Даниэль Алиевский(35/125)[досье]

Кто-нибудь в курсе, что говорят стандарты (или, лучше, как ведут себя 99% броузеров) в следующих случаях:

  1. <applet...><script>lalala</script></applet>, Java присутствует. Правильно ли, что скрипт выполняется в FilreFox? И что не выполняется даже при отсутствующей Java в MSIE/Opera?
  2. <applet name=myApplet ...>...</applet>, Java отсутствует. Может быть, в этой ситуации есть какое-то коренное отличие у объекта document.myApplet с самого начала? Скажем, его просто нет? :) (Мои извинения, что пока не проверил сам. Почти уверен, что объект имеется.)
  3. <applet...><img id=myImg name=myImg...></applet>, Java присутствует. De facto в этом случае DOM-объект myImg отсутствует, что при доступе через getDocumentById, что через древний "железобетонный" document.images. А что говорят стандарты?
  4. document.writeln('<applet...><img id=myImg name=myImg...></applet>'), Java отсутствует. Подскажите: можно ли немедленно после этого document.writeln обратиться к getElementById('myImg')? А к document.images['myImg']? Я помню, что MSIE (5.0, кажется) в какой-то степени не разрешал работать с DOM, пока страница не сформирована. Но здесь, наверно, не та ситуация.

Вопрос 1 - это, скорее, любопытство. Вроде бы работает неправильно. Очевидно, заставить работать, как я ожидал, не удастся.
Вопрос 2 требует больших исследований. Вдруг кто-то уже проводил такие?
Вопрос 3 важен даже в моем нынешнем решении.
Вопрос 4, в случае утвердительного ответа, позволяет определить отсутствие Java без ожидания. В сочетании с предложением уважаемого Александра, это позволило бы несколько улучшить мое решение. (Для Java 1.1.4 откладывать загрузку апплета нет необходимости - Microsoft JVM почти не требует времени на инициализацию.) Впрочем, это не так уж важно.

спустя 4 часа 11 минут [обр] Даниэль Алиевский(35/125)[досье]

После длительного тестирования обнаружил неприятную проблему в моем решении. Однажды, когда мне не повезло :), FireFox в совершенно нормальной ситуации обнаружил отсутствие Java. Правда, через секунду после этого сработал JavaScript, вызванный из Java, и диагностика сменилась на "все OK".

Дело в том, что даже при наличии JVM, пока апплет грузится (пусть это и быстро), FireFox использует HTML-код из <applet...>...</applet> для временного отображения загружающегося апплета. (Или, может быть, это происходит в течение инициализации Java-машины.) Понятно, что в это время DOM-объект, соответствующий img изнутри <applet...>...</applet>, существует. Потом исчезает - когда начинает работать апплет. Получается, есть маленькая вероятность ложно обнаружить отсутствие Java.

Неужели нет надежного решения?

спустя 32 минуты [обр] Александр Самойлов(37/342)[досье]
сообщение промодерировано
Для проверки ms java можно использовать какой-либо встроенный апплет.
Сильно апплеты не искал взял первый попавшийся.
<applet code="com.ms.dxmedia.DXMApplet"></applet>
спустя 9 минут [обр] Александр Самойлов(37/342)[досье]

Кстати, у меня, что-то совсем не работает в IE.

java.lang.System.getProperty("java.vm.version")

Даже при установленном плагине от Sun.

спустя 2 минуты [обр] Александр Самойлов(37/342)[досье]
А можно ведь проще. Должно сработать в java и от sun и от ms.
<applet code="java.applet.Applet"></applet>
спустя 3 минуты [обр] Владимир Палант(253/4445)[досье]

Александр Самойлов[досье]
Зачем так сложно? С тем же успехом можно и так сделать:

<applet code="java.applet.Applet"></applet>

PS: О, вы тоже уже догадались :)

спустя 21 минуту [обр] Даниэль Алиевский(35/125)[досье]
Александр Самойлов[досье]
Спасибо, оригинально. Ну а что дальше? Как узнать, инициализировался ли он успешно? Подождать и попробовать повызывать его методы из JavaScript? Типа, если через 10 секунд не удается вызвать некий стандартный метод вроде getParameters, значит, нет Java?
спустя 37 минут [обр] Александр Самойлов(37/342)[досье]
Даниэль Алиевский[досье]
Так вызвать у него isActive после срабатывания onload у body.
<html>
<head>
<script>
onload = function () {
alert(document.applets[0].isActive)
}
</script>
</head>
<body>
<applet code="java.applet.Applet" width="0" height="0"></applet>
</body>
</html>
спустя 5 минут [обр] Александр Самойлов(37/342)[досье]
alert(document.applets[0].isActive())
спустя 31 минуту [обр] Даниэль Алиевский(35/125)[досье]

Ну и откуда следует, что он обязан быть active после onload у body? Апплет - это вам не DOM-объект, его загрузкой занимается JVM по своим правилам и законам. Асинхронно с DOM и JavaScript. К тому же onload у body - это слишком жестоко, бывают страницы, которые грузятся (в смысле body.onload) несколько минут из-за каких-нибудь кривых баннеров.

Я так понял, идея применения java.applet.Applet - гарантированно не ждать закачки апплета. Но закачка - не единственный период, когда Java считает апплет не готовым. В этом и проблема. К тому же этот период можно, вероятно, ликвидировать и внешинми средствами. К примеру, загрузить .class-файл просто как файл данных средствами JS - он тогда заведомо попадет в кэш броузера.

спустя 4 часа 1 минуту [обр] Александр Самойлов(37/342)[досье]

Не уверен, что загузка идет асинхронно.

public class a extends java.applet.Applet {
    public void init() {
        try {
            Thread.currentThread().sleep(10000);
        } catch(Exception exception) {
        }
    }
}

У меня сообщение об окончании загрузки страницы появляется примерно через 10 секунд после загрузки. Не удивлюсь, если это где-то прописано в стандартах. А впрочем возможны и особенности конкретного плагина. Но для плагина от sun это так.

спустя 1 минуту [обр] Александр Самойлов(37/342)[досье]
У меня сообщение об окончании загрузки страницы появляется примерно через 10 секунд после сообщения об окончании загрузке апплета.
спустя 39 минут [обр] Александр Самойлов(37/342)[досье]
Для msjvm задержка тоже в 10 секунд, правда isActive возвращает false в первый раз.
Так что видимо надо еще подождать в javascript.
спустя 3 дня [обр] Даниэль Алиевский(35/125)[досье]

Странно. Взял ваш апплет, вставил в страницу.

<html>
<script>
setTimeout('alert(document.a.isActive())',3000);
</script>
<body onload="alert('loaded')">
<applet width=100 height=100 code="a">
Applet will be here
</applet>
</body>
</html>

В случае JRE 1.5 сообщение "loaded" появляется немедленно, а вовсе не через 10 секунд. Зато таймаут откладывается на 10 секунд - очевидно, метод isAlive ждет окончания метода init.
В случае Microsoft JRE 1.1.4 "loaded" появляется через 10 секунд, а вот обращение к isAlive честно срабатывает через 3 секунды и возвращается false.
При выключенной java метод isAlive у document.a, естественно, отсутствует - данный тест выдает сообщение об ошибке.
Текст "Applet will be here" виден лишь при отключенной Java и лишь в MSIE.

Пока что мое решение (проверять наличие фиктивного объекта img и вызывать скрипт из Java) кажется оптимальным. Несмотря на неприятную особенность, что пока Java грузит апплет и стартует, скрипт временно может "подумать", что Java отсутствует. Но зато потом это неверное предположение заведомо сменится правильным решением о наличии Java. Не считая самых древних версий MSIE, которые не умели вызывать JavaScript из Java - их можно спокойно проигнорировать.

Как мне кажется, единственное альтернативное решение, которое можно построить на ваших идеях, - вставить java.applet.Applet и начать бесконечное ожидание на setTimeout, пока у document.имя_апплета не появится метод isAlive и не вернет true. Если в течение, допустим, 20-30 секунд этого не произойдет, можно считать, что Java отсутствует. Ждать меньше - рискованно, иногда Java-машина инициализируется медленно, особенно когда компьютер занят какими-то интенсивными вычислениями (вроде проверки на вирусы). Получается, что при отсутствии Java в течение довольно большого промежутка времени скрипт будет "не уверен". Например, при нажатии на некую кнопку придется сообщать пользователю "пожалуйста, подождите".

В моем же решении период, когда может решение может быть неверным, по-видимому, соответствует лишь этапу закачки маленького апплета. Вполне вероятно, пользователь никогда не увидит ошибочного сообщения "Java отсутствует". Особенно, если выложить мой диагностический апплет куда-нибудь на главные страницы, задолго до того, как он реально понадобится. Тогда при реальном использовании, скорее всего, он будет взят из кэша. В любом случае, по-видимому, можно подождать onload, после наступления которого уже 100-процентно утверждать, что Java отсутствует, если "виден" мой img. А до onload предлагать посетителю подождать.

К сожалению, уж больно тут много недоказанных предположений... Даже странно: почему такая очевидная задача не имеет общепризнанного и документированного решения?

спустя 3 часа 52 минуты [обр] Андрей Гора(0/29)[досье]
в частном случае - определение установленной Microsoft virtual machine для IE:
<SPAN STYLE="behavior:url(#default#clientCaps)" ID="sb"></SPAN>
<SCRIPT>
if(document.getElementById('sb').isComponentInstalled("{08B0E5C0-4FCB-11CF-AAA5-00401C608500}","ComponentID")) alert('MVM installed');
</SCRIPT>
спустя 40 минут [обр] Даниэль Алиевский(35/125)[досье]
Андрей Гора[досье] Нда, вот это хакерство :) Высшей марки :) Спасибо, конечно. Может, и правда пригодится.
спустя 6 часов [обр] Александр Самойлов(37/342)[досье]

Даниэль Алиевский[досье]
Да, похоже, что в IE действительно onload сходу срабатывает.
Просто я проверял так:

<script>
onload = function() {
alert(document.applets[0].isActive())
}
</script>

Как ни странно, в FireFox onload срабатывает с задержкой даже без обращения к isActive.
Кстати проверка isComponentInstalled скорее всего сработает и с sun jvm, так как по этому GUID vm и прописывается для поддержки в IE.

спустя 13 часов [обр] Даниэль Алиевский(35/125)[досье]

В поисках нормального решения, пришлось предпринять длительное исследование. И опять выяснилось, что я все понимал и делал не так :( Ох уж эти кривые недостандартизованные web-технологии.

Итак, мое решение - вставлять прозрачный именованный img 1x1 внутри тегов <applet...>...</applet> - вовсе никуда не годится. Оказывается, FireFox и Opera обнаруживают в DOM этот img ВСЕГДА, независимо от того, есть ли Java и загрузился ли апплет. Обнаруживают, но не показывают - даже при физическом отсутствии JVM. При этом, что интересно, offsetWidth у этого img-объекта равен 0, а не реальной ширине (1) - опять же независимо от наличия JVM. Лишь MSIE (6.0) при наличии Java "не видит" объекта img - getElementById возвращает null. Впрочем, поведение MSIE при отсутствии Java мне проверить не удалось (не сумел "истребить" Microsoft JVM). При запрещенной Java в MSIE тоже все логично - объект img присутствует, и offsetWidth у него нормальный (1).

Чтобы не быть голословным, привожу тестировавшийся HTML-код:

<applet name="testApp" code="java.applet.Applet" width="10" height="30">
    <img id="noJava" name="noJava" src="http://webwarper.net/wwgz/serv/images/empty.gif" width="10" height="10">
    <p>No Java!</p>
</applet>
<applet codebase="http://webwarper.net/wwgz/serv/" code="AppletLogJavaVersion.class" width="200" height="100" mayscript>
    <param name="OnLoadJavaScript" value="showJavaVersion('%VERSION%')">
    <p>No Java!</p>
</applet>

И к этому HTML - многословный JavaScript (в частности, с функцией showJavaVersion), исследующий ситуацию в разные моменты времени.

При отсутствии JVM "умные" FireFox и Opera норовят подсказать пользователю, что делать, на свой лад. Например, FireFox 1.5 игнорирует прописанные размеры апплета и показывает прямоугольник довольно "левых" размеров, с надписью "Click here to download plugin". Надо ли говорить, что эта надпись отнюдь не всегда влезает в отведенный прямоугольник, даром что апплет 1x1 "разъезжается" совершенно безбожно. Зато наверху страницы всплывает аналогичное сообщение в желтой полоске.

Opera вовсе показывает какую-то ерунду: маленький прямоугольник с надписью "Java a" (наверно, начало "applet"). Ни моего "<p>No Java!</p>", ни каких-либо иных подсказок пользователю.

Кстати, "разъезжание" апплетов при отсутствии Java (конечно, недопустимое в моем случае) удается победить только одним способом: помещая их внутрь

<div style="width:2px;height:2px;display:block;overflow:hidden">...</div>

При этом, увы, теряется свойство апплета быть inline-элементом. Если кто-то знает способ лучше, буду благодарен подсказке.

Раз объект img внутри <applet...>...</applet> "виден" и при наличии Java, использовать этот прием нельзя. Пока остановился на следующем решении.

Размещается 2 апплета (несколько упрощаю):

<applet name="ww___aaApplet_noww" codebase= "http://webwarper.net/" code="AppletShowIPInfo.class"
 width="1" height="1" mayscript>
   <param name="RequiredDomainEncoded" value="w e b w a r p e r . n e t">
   <param name="OnLoadJavaScript" value="ww___aaAppletOnLoad(&quot;~~IPINFO~~&quot;)">
</applet>
<applet name="ww___aa_StandardApplet" code="java.applet.Applet" width="1" height="1">
</applet>

Первый апплет делает некую дополнительную работу. Здесь важно, что в методе start вызывается JavaScript-функция ww___aaAppletOnLoad, которая окончательно принимает решение, что Java имеется.

Затем, спустя некоторый TIMEOUT, выполняется следующее:

    var app= document.ww___aa_StandardApplet;
    var isActive= null;
    if (app!=null) {
        try {
            isActive= app.isActive();
        } catch (ex) { 
// - увы, надо именно ловить исключение; простая проверка app.isActive==null приводит к ошибке
//          alert("No isActive method in app");
        }
    }
    if (isActive==null) {
        принимаем решение, что Java отсутствует;
        не исключено, что это решение впоследствии будет отменено исполнением ww___aaAppletOnLoad
    }

Эксперимент показывает, что в MSIE 6.0 и FireFox метод isActive при наличии Java появляется сразу, поэтому такая проверка работает надежно. Зато в Opera, увы, даже стандартный java.applet.Applet не сразу "приобретает" метод isActive. Поэтому, если TIMEOUT мал (на моем компьютере ~200 ms или меньше), то Opera ошибочно считает, что Java нет, так как обращение к методу isActive приводит к исключению. И исправлено это "мнение" будет лишь по мере загрузки первого апплета. Можно, конечно, в случае Opera ограничиться проверкой javaEnabled(), но какие гарантии, что этот метод во всех версиях Opera возвращает false при физическом отсутствии Java-машины? В других-то броузерах это не так. Я пока использую 2-секундный TIMEOUT.

В общем, печально все это. Остается только просить уважаемых коллег позапускать мой тест в различных ситуациях:
http://webwarper.net/ww/~av/algart.net/system/antianonymizetest.pl
В разделе "Client-side information" должен быть либо написан вычисленный IP, либо информация, что Java-машина отсутствует / запрещена / что-то другое. До сегодняшних исправлений, проблема была в том, что некоторое время показывалось сообщение "Java отсутствует", и лишь потом оно заменялось информацией об IP.

В частности, прошу проверить его в MSIE при отсутствии микрософтовской (и любой другой) Java-машины. Ну и всякие Konqueror, Mozilla, версии броузеров на *nix, Mac.

спустя 30 минут [обр] Александр Самойлов(37/342)[досье]

Чтобы удалить msjava надо сделать следующее

RunDll32 advpack.dll,LaunchINFSection Java.inf,UnInstall
удалить \%systemroot%\java
удалить \%systemroot%\inf\java.pnf
удалить \%systemroot%\system32\jview.exe
удалить \%systemroot%\system32\wjview.exe
удалить HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Java VM
удалить HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\AdvancedOptions\JAVA_VM

Перезагружаться, вроде бы, необязательно.

спустя 11 минут [обр] Даниэль Алиевский(35/125)[досье]
Александр Самойлов[досье] Спасибо, а обратно как? :) Не хотелось бы нечаянно насовсем ее удалить.
спустя 32 минуты [обр] Александр Самойлов(37/342)[досье]
спустя 4 минуты [обр] Даниэль Алиевский(35/125)[досье]

Да, сразу не подумал. Конечно, к моему методу обнаружения отсутствия Java (проверка isActive через тайм-аут) следует добавить уже упомянутую вами проверку java.lang.System.getProperty. То есть:

    var java2Version= null;
    try {
        java2Version= java.lang.System.getProperty("java.version");
    } catch (ex) {
    }
    if (java2Version!=null)
        return; // в этом-то случае мы уверены, что java есть: не надо прибегать к ненадежным способам

    var app= document.ww___aa_StandardApplet;
    var isActive= null;
    if (app!=null) {
        try {
            isActive= app.isActive();
        } catch (ex) { 
// - увы, надо именно ловить исключение; простая проверка app.isActive==null приводит к ошибке
//          alert("No isActive method in app");
        }
    }
    if (isActive==null) {
        принимаем решение, что Java отсутствует;
        не исключено, что это решение впоследствии будет отменено исполнением ww___aaAppletOnLoad
    }

Это решает оставшуюся возможную проблему с Opera (в которой метод isActive появляется у апплета не сразу). Остается только надеяться, что все версии MSIE и Microsoft JVM будут нормально обнаруживать isActive - либо генерироть исключение при отсутствии метода. Метод уважаемого Андрея Гора все-таки применять не хочется - уж больно смахивает на черную магию, вдруг где-нибудь не сработает...

http://secinfo.huji.ac.il/patches/Win-xp/msjavwu.exe

Спасибо. А все-таки страшно :) Вдруг приведу компьютер в совершенно нестандартное состояние: тогда грош цена всем будущим тестам. Попробую при случае на другом компьютере.

спустя 2 дня 21 час [обр] Даниэль Алиевский(35/125)[досье]

Увы, метод с обращением к java.lang.System.getProperty("java.version") не проходит. По крайней мере у меня, когда я деинсталлировал все Java-машины, соответствующее исключение не ловится (FireFox 1.5) - скрипт просто останавливается без каких-либо сообщений даже в javascript-консоли.

Убрал, оставил предыдушее решение.

Сколько фактов-то накопилось, прямо хоть статью пиши...

спустя 3 часа 17 минут [обр] Даниэль Алиевский(35/125)[досье]

Александр Самойлов[досье]

Чтобы удалить msjava надо сделать следующее

RunDll32 advpack.dll,LaunchINFSection Java.inf,UnInstall
удалить \%systemroot%\java
удалить \%systemroot%\inf\java.pnf
удалить \%systemroot%\system32\jview.exe
удалить \%systemroot%\system32\wjview.exe
удалить HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Java VM
удалить HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\AdvancedOptions\JAVA_VM

Я все-таки рискнул и убрал Microsoft JVM, как вы советовали - для тестирования. Увы, зря. Утилитка msjavwu.exe отказывается восстанавливать JVM, пишет "This setup will only upgrade over an existing version of the Microsoft VM". И ничего не делает. Что за existing, если ее нет...

Вручную, понятно, восстановить не получается. Команда "RunDll32 advpack.dll,LaunchINFSection Java.inf,UnInstall" удалила что-то важное, обратная команда "Install" не срабатывает. А восстановление файлов и ключей реестра оказалось недостаточным.

Перезагружаться, разумеется, пробовал. Переодеваться, естественно, не очень хочется. Хорошо, что сохранился второй компьютер с установленной Microsoft JVM.

спустя 5 минут [обр] Александр Самойлов(37/342)[досье]
Даниэль Алиевский[досье]
У меня было тоже самое, пока не нашел msjavwu.exe для win 98, что ли.
Она корректно обновляет. Ссылку позже дам.
Тут еще момент, что версия должна быть 3810, в ней последняя ошибка исправлена.
спустя 1 час 2 минуты [обр] Даниэль Алиевский(35/125)[досье]
Гм, а у меня ведь XP. Почему 98? :)
спустя 40 минут [обр] Александр Самойлов(37/342)[досье]

Там, вроде такая же Java, только убрана проверка того, что Java является системным компонентом.

Вот тут собраны ссылки на разнообразные версии jvm.
http://www.eggheadcafe.com/ng/.......explorer.java/post3913393.asp

спустя 17 часов [обр] Даниэль Алиевский(35/125)[досье]

Нда, странности продолжаются.

Пару раз переустановил разные Java-машины от Sun и еще раз протестировал

    var java2Version= null;
    try {
        java2Version= java.lang.System.getProperty("java.version");
    } catch (ex) {
    }
    if (java2Version!=null)
        return; // в этом-то случае мы уверены, что java есть: не надо прибегать к ненадежным способам

Теперь результаты другие. Исключение теперь ловится и при полном отсутствии Java. Зато в MSIE это же исключение возникает всегда, даже при наличии JRE 1.3 и JRE 1.5! Интересно, а как у вас?

То есть способ оказался почти бесполезным. В MSIE, кстати, оказалось, что виртуальная машина (по крайней мере, 1.3) может инициализироваться довольно долго (секунду-две - это на моем не самом плохом компьютере!), и все это время метод isActive() у апплета отсутствует. Пришлось увеличить таймаут до 5 секунд. То есть после появления апплета java.applet.Applet я жду 5 секунд, и только тогда проверяю его метод isActive - если метод отсутствует, считаю, что Java не установлена. Т.е. так и не нашел я надежного способа быстро определить отсутствие Java :(

спустя 16 минут [обр] Александр Самойлов(37/342)[досье]
Так я писал уже, что у меня в MSIE java.lang.System.getProperty не работает.
Думаю, в случае MSIE isComponentInstalled достаточно быстр и надежен.
А в случае FireFox java.lang.System.getProperty.
спустя 1 час 24 минуты [обр] Даниэль Алиевский(35/125)[досье]

Вы писали про java.vm.version. Я подумал, может быть, на определение этого свойства не хватает прав (не все свойства можно читать из апплета). Теперь вижу, что был неправ.

Не знаю, совсем не хочется мне связываться с isComponentInstalled. Требующего, к тому же, какого-нибудь элемента вроде span. Черная магия. Разве что вы покажете ссылку на официальный документ, где утверждается, что все JVM от всех производителей под MSIE всегда регистрируется как 08B0E5C0-4FCB-11CF-AAA5-00401C608500. А заодно написано, с какой версии MSIE этот прием работает. Кстати, со встроенной JVM 1.1.4 проблем нет: там метод isActive() появляется либо сразу, либо через пару десятков миллисекунд.

Кстати, спасибо за совет на счет "msjavwu.exe для win 98" и за ссылку
http://www.eggheadcafe.com/ng/.......explorer.java/post3913393.asp
Вот эта JVM успешно установилась: http://ftp.idilis.ro/windows/sp/jvm98/msjavwu.exe
Правда, это 3809. Сейчас попробую 3810:
http://download.windowsupdate.......87b82d41db93f4c2a04af2b34d.exe

спустя 44 минуты [обр] Даниэль Алиевский(35/125)[досье]
Кажется, 3810 тоже нормально инсталлируется. Спасибо.
спустя 52 минуты [обр] Александр Самойлов(37/342)[досье]

Вместо span, думаю вполне можно использовать body.
Работает начиная с IE 5.

http://msdn.microsoft.com/work......thods/iscomponentinstalled.asp

Sun JVM по другому GUID прописывается, но дает ссылку с микрософтовского GUID на свой.

http://www.imint.com/support/sp110.htm

спустя 18 часов [обр] Даниэль Алиевский(35/125)[досье]

Александр Самойлов[досье]
body не подходит. Мне ведь нужен сравнительно универсальный скрипт, который достаточно вставить в некоторое место произвольной страницы - и через некоторое время наличие/отсутствие/версия Java будут установлены. В этом плане как раз лучше span.

Использовать указанную вами проверку для того, чтобы убедиться в наличии Java под MSIE, пожалуй, вполне нормально. Но это и не нужно - когда Java есть, она достаточно быстро проявит себя исполнением JavaScript-а. Стопроцентно надежный способ (если уж апплет смог исполнить JavaScript, значит, апплеты заведомо нормально загружаются, инициализируются и вообще рапотоспособны).

А вот для того, чтобы гарантировать отсутствие Java, я бы все таки не стал полагаться на отсутствие соответствующей компоненты - даже в MSIE. В конце концов, не только Sun выпускает Java-машины. И утверждение в http://www.imint.com/support/sp110.htm, кажется, не носит характера официального стандарта, которого обязаны придерживаться сейчас и в будущем все JVM от Sun. Пока я не уверен стопроцентно, что на компьютере нет никакой Java, я вынужден ждать тот самый неприятный таймаут.

спустя 13 дней [обр] Даниэль Алиевский(35/125)[досье]
Погорячился я - после очередного сноса MS JVM версия 3810 устанавливаться не хочет.
Вначале надо поставить 3809-ю:
http://ftp.idilis.ro/windows/sp/jvm98/msjavwu.exe
И только потом 3810-ю:
http://download.windowsupdate.......87b82d41db93f4c2a04af2b34d.exe
Powered by POEM™ Engine Copyright © 2002-2005