Передача значения из java в Javascript

Я делаю приложение для Android с помощью веб-просмотра. Приложение может распечатывать чеки. Что я хочу сделать, так это когда принтер не работает, появляется окно предупреждения, чтобы сообщить, что принтер не работает, и возвращать false в событие onsubmit формы, чтобы предотвратить отправку формы.

Код Java:

public class JSKicker {

    @JavascriptInterface
    public void callPrint(final String argumet) {
        Thread thread = new Thread(new Runnable() {
            public void run() {

                int nRtn;
                connectionNum = myPrinter.Connect("000.000.0.000");

                if (connectionNum < 0){ //Printer not working

                 webview.post(new Runnable() {
                        @Override
                        public void run() {
                            String script = "alert('Printer Error'); return printer_connection = false;";
                            webview.evaluateJavascript(script, new ValueCallback<String>() {
                                @Override
                                // I can't figure out what to do here...
                            });
                        }
                    });

                }else{ //Printer is working properly
                    connectionNum = myPrinter.SetLocale(8);
                    strText = argument;
                    nRtn = myPrinter.PrintText(strText, "SJIS");

                    nRtn = myPrinter.PaperFeed(64);
                    nRtn = myPrinter.CutPaper(1);

                    myPrinter.Disconnect();
                }
            }
        });
        thread.start();
    }

JavaScript в заголовке:

<script type = "text/javascript">
    function gate(){
        jQuery.ajax({
                    url:'/cart_info.php',
                    type:'GET'
                })
                .done( (data) => {
                    window.JSKicker.callPrint(data);
                })

                if (printer_connection = false) {
                    return false;
                }else{
                    return true;
                }
    }

</script>

Тег HTML-формы:

<form method = "post" id = "order_form" onsubmit = "return gate();">

Как мне получить эту работу?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
1 119
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Могли бы вы сделать это через WebView.evaluateJavascript ()?

https://developer.android.com/reference/android/webkit/WebView.html#evaluateJavascript(java.lang.String,%20android.webkit.ValueCallback%3Cjava.lang.String%3E)

Таким образом, вы можете отправить простой CustomEvent в документ в WebView

webView.evaluateJavascript("document.dispatchEvent(new Event('printer_error', { details: "No printer found!" }));");

а в JavaScript вы можете подключить прослушиватель для реакции вашего пользовательского события.

document.addEventListener('printer_error', e => alert(e.details));

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

Я мог бы использовать evalJavascript (), чтобы показать окно предупреждения из Java! Можно ли отправить что-то в JS, чтобы форма не отправлялась ?? Я внес некоторые изменения в свой код.

Kiki 18.10.2018 09:53

С таким же подходом вы можете делать любые действия на своей странице. Например. document.addEventListener ('submit_form', e => document.getElementById ('my-form'). submit ()) будет самым простым способом. Проверить w3schools.com/jsref/met_form_submit.asp

sharko 18.10.2018 17:12

WebSocket может решить вашу проблему.

WebSockets обеспечивают постоянное соединение между клиентом и сервером, которое обе стороны могут использовать для начала отправки данных в любое время. Клиент устанавливает соединение WebSocket посредством процесса, известного как рукопожатие WebSocket.

Его очень просто и легко реализовать.

Вы можете перейти по ссылкам реферера для получения более подробной информации: -

JAVA WebSocket: - WebSocket с использованием Spring Boot, WebSocket с использованием Simple JEE

Браузер WebSocket (JavaScript): - WebSocket API

В Android, если вы хотите, чтобы веб-просмотр передавал значение в JavaScript. Во-первых, вам нужно настроить веб-просмотр, чтобы включить JavaScript,

    private WebView mWebView;

    void onCreate(){
    mWebView = findViewById(R.id.webview);
    WebSettings webSettings = mWebView.getSettings();
    webSettings.setJavaScriptEnabled(true);
    webSettings.setSupportZoom(false);
    }

И, если вы хотите что-то сделать, код

if (connectionNum < 0){ //Printer not working
// I need to do something here to send a message that the printer isn't working to JS.
//In thread can not use mWebView,should send message to MainThread to do
     // mWebView.loadUrl("javascript:javaCall()");
        Message msg = new Message();
        msg.what = 1;
        myHandler.sendMessage(msg);
    //myHandler can be your MainThread send to here
}

И если mWebView, созданный в вашем коде, находится в основном потоке, вы можете использовать Обработчик сообщения, отправленного сюда.

private Handler myHandler = new Handler() {
  @Override 
    public void handleMessage(Message msg) { 
      // this 1 is just thread send to here
      if (msg.what == 1) {
         //and here can do the webview UI method
         mWebView.loadUrl("javascript:javaCall()");
      }
  }

};

javaCall () - это то место, где вы вызываете метод JacaScript, в javaScript вы можете написать так:

<script language = "javascript">  
function javaCall(){  
    alert("Printer Error");
    //other thing you can do
}  
</script>  

если у вас возникла проблема, вы можете обратиться к официальному документу.

public void loadUrl (String url)
Loads the given URL.
Also see compatibility note on evaluateJavascript(String, ValueCallback).

веб-просмотр использовать ссылку

Я попробовал, но выдает ошибку, говоря: E: FATAL EXCEPTION: Thread-22528 Процесс: com.my_web.new_project, PID: 9186 java.lang.RuntimeException: java.lang.Throwable: в потоке Thread-22528 был вызван метод WebView. Все методы WebView должны вызываться в одном потоке… и т. д. Вызвано: java.lang.Throwable: метод WebView был вызван в потоке «Thread-22528». Все методы WebView должны вызываться в одном потоке. (Ожидаемый Looper Looper (main, tid 1) {36b83ccf} вызывается по нулю, FYI main Looper - Looper (main, tid 1) {36b83ccf})

Kiki 17.10.2018 01:54

Я понял, ваш код находится в потоке, чтобы уведомить о следующем, поэтому вы можете использовать Handler для решения этой ошибки. Отредактирую ответ.

Junior Jiang 17.10.2018 02:56

В sendMessage есть ошибка, в которой говорится, что на нестатический метод sendMessage (android.os.Message) нельзя ссылаться из статического контекста :( Я не могу найти, как это исправить

Kiki 17.10.2018 06:58

Другие вопросы по теме