Новое обновление Chrome блокирует Java; как я могу дождаться предоставления разрешения перед вызовом кода моего апплета?

#java #javascript #plugins #google-chrome #applet

#java #javascript #Плагины #google-chrome #апплет

Вопрос:

Недавно Chrome получил новое обновление, которое автоматически блокирует все подключаемые модули. Появляется панель, запрашивающая у пользователя разрешение на ее включение. Вот как выглядит панель.

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

Как я могу сказать моей кнопке подождать, пока апплету не будет предоставлено разрешение, прежде чем вызывать его методы? Я не могу предварительно загрузить апплет, потому что он самоподписан, и я не хочу, чтобы диалоговое окно безопасности появлялось до тех пор, пока это не потребуется. Обычно это диалоговое окно приостанавливает Javascript и возобновляет его, когда доступ был предоставлен или отклонен, но это новое диалоговое окно Chrome запускается параллельно сайту.

Ответ №1:

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

Для обмена данными с Java на Javascript у вас есть несколько вариантов. Вы могли бы поискать в Google JSObject класс, хотя, насколько я понимаю, для этого требуются двоичные файлы, зависящие от браузера, и поэтому это может оказаться неработоспособным решением. Что проще, так это просто использовать метод AppletContext ‘s showDocument для выполнения Javascript, как описано в http://www.brilliantsheep.com/java-to-javascript-communication-made-simple /.

Например, в методе init () вашего апплета у вас был бы код, подобный следующему:

 getAppletContext().showDocument( "javascript:onAppletIsReady()", "_self" );
  

А затем просто определите в вашем javascript метод с именем onAppletIsReady, который выполняет любую логику, которую вы ранее запускали, как только был загружен апплет.

Комментарии:

1. Приятно! Я попробовал это, и это прекрасно работает. Однако у меня есть еще одна проблема: я не могу определить, решил ли пользователь заблокировать плагин. Апплет никогда не инициализируется, поэтому я ничего не могу вызвать из него. Я бы хотел, чтобы моя страница завершалась корректным завершением работы с сообщением об ошибке и предложением, а не зависала бесконечно. Как вы думаете, есть ли решение для этого?

2. @terence Я не уверен в решении этой проблемы, хотя у меня есть идея. Предполагается, что веб-браузеры должны включать содержимое внутри тегов апплета, если браузер не поддерживает апплеты или они были отключены. Я не уверен, относится ли это к описываемому вами случаю, но вы могли бы попробовать что-то вроде <applet …><script type=»text / javascript»>onJavaDisabled();</script></applet> для выполнения некоторого JS, если пользователь отказывается от Java. (Или просто поместите содержимое здесь с предложением.) Если вы нашли мой ответ полезным, я также высоко ценю его принятие. Удачи с вашим приложением!

3. Хорошая идея, хотя Chrome, похоже, просто блокирует его напрямую, а отклонение Java просто приводит к исчезновению диалогового окна, ничего не меняя в состоянии. Из-за этого я не думаю, что есть какое-либо решение. Я думаю, я просто установлю таймер, и если ответа не будет, я напомню пользователю обновить страницу и принять плагин. Спасибо за вашу помощь!

4. Сработала ли ваша идея с таймером? Не могли бы вы опубликовать полученный код, пожалуйста?