#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. Сработала ли ваша идея с таймером? Не могли бы вы опубликовать полученный код, пожалуйста?