按下后退按钮时删除 webview 文本区域中的字符
Delete a character in textarea on webview when press back button
我有一个 android 应用程序,其中有一个 webview。如何在android上按下后退键时可以删除webview文本区的一个字符?
package com.example.nqc.myapplication;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.webkit.WebView;
public class MainActivity extends AppCompatActivity {
private WebView mWebView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mWebView = findViewById(R.id.mWebView);
mWebView.loadUrl("https://www.google.com");
}
@Override
public void onBackPressed() {
//delete a character
Log.d("Debug", "Delete text on TextArea");
}
}
不明白的请看下图。
Before press back
After press back
不能保证用户加载的页面中只有一个Form
。
但是,如果它特别针对 Google
搜索表单,您可以执行 JavaScript
以在 Google.com
页面中获得 Form
id=tsf
(这是Google.com
中搜索表单的唯一id)。
尽管如此,您在评论中提到:
This will happen to all other pages
除非您知道页面中表单的 id
(这对于 WWW
中包含多个 Form
[的每个页面几乎是不可能的=85=]).
您可以遍历所有 Forms
和 删除 text[=85 的最后一个 char
=] 在类型 text
的 Form
的 input
中。
例子
首先为 运行 JS
脚本创建一个方法(请注意,有不同的方法可以在 WebView
中执行 JS
in Android,如果以下方法对您不起作用,请查看 here):
了解更多详情
public void run(final String script) {
mWebView.post(new Runnable() {
@Override
public void run() {
mWebView.loadUrl("javascript:" + script);
}
});
}
然后创建一个方法,returns一个JS String到:
- 获取页面中的所有表单。
- 全部循环。
- 循环浏览每个表单的元素..
- 将其值设置为(其旧值 - 最后一个字符)。
private String deleteLastCharScript() {
return "var listOfForms = document.forms;\n" +
"for(var i = 0; i < listOfForms.length; i++) {\n" +
" var elements = listOfForms[i].elements;\n" +
" for(var j = 0 ; j < elements.length ; j++){\n" +
" var item = elements.item(j);\n" +
" item.value = item.value.substring(0, item.value.length - 1);\n" +
" }\n" +
"};";
}
您可以在 onBackPressed()
方法中 运行 该脚本,如下所示:
@Override
public void onBackPressed() {
run(deleteLastCharScript());
}
这是MCVE:
添加到清单:
<uses-permission android:name="android.permission.INTERNET" />
创建简单的WebView
布局:
<?xml version="1.0" encoding="utf-8"?>
<WebView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/webView1"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
Activity 中的实施:
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.webkit.WebView;
public class MainActivity extends AppCompatActivity {
private WebView mWebView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.webview);
mWebView = findViewById(R.id.webView1);
mWebView.getSettings().setJavaScriptEnabled(true); // enable JS
mWebView.loadUrl("https://www.google.com");
}
/**
* Execute JS String Asynchronously
* @param script
*/
public void run(final String script) {
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
// run JavaScript asynchronously
// it works on KitKat onwards
mWebView.evaluateJavascript(script, null);
}else {
// use different thread to run JavaScript asynchronously
// because evaluateJavascript doesn't work on versions before KitKat
new Thread(new Runnable() {
@Override
public void run() {
mWebView.post(new Runnable() {
@Override
public void run() {
mWebView.loadUrl("javascript:" + script);
}
});
}
}).start();
}
}
/**
* This JS Script tp Loop through all
* inputs in all forms in the page
* and remove last char from each
* @return
*/
private String deleteLastCharScript() {
return "var listOfForms = document.forms;\n" +
"for(var i = 0; i < listOfForms.length; i++) {\n" +
" var elements = listOfForms[i].elements;\n" +
" for(var j = 0 ; j < elements.length ; j++){\n" +
" var item = elements.item(j);\n" +
" item.value = item.value.substring(0, item.value.length - 1);\n" +
" }\n" +
"};";
}
@Override
public void onBackPressed() {
run(deleteLastCharScript());
}
}
结果
我有一个 android 应用程序,其中有一个 webview。如何在android上按下后退键时可以删除webview文本区的一个字符?
package com.example.nqc.myapplication;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.webkit.WebView;
public class MainActivity extends AppCompatActivity {
private WebView mWebView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mWebView = findViewById(R.id.mWebView);
mWebView.loadUrl("https://www.google.com");
}
@Override
public void onBackPressed() {
//delete a character
Log.d("Debug", "Delete text on TextArea");
}
}
不明白的请看下图。
Before press back
After press back
不能保证用户加载的页面中只有一个Form
。
但是,如果它特别针对 Google
搜索表单,您可以执行 JavaScript
以在 Google.com
页面中获得 Form
id=tsf
(这是Google.com
中搜索表单的唯一id)。
尽管如此,您在评论中提到:
This will happen to all other pages
除非您知道页面中表单的 id
(这对于 WWW
中包含多个 Form
[的每个页面几乎是不可能的=85=]).
您可以遍历所有 Forms
和 删除 text[=85 的最后一个 char
=] 在类型 text
的 Form
的 input
中。
例子
首先为 运行 JS
脚本创建一个方法(请注意,有不同的方法可以在 WebView
中执行 JS
in Android,如果以下方法对您不起作用,请查看 here):
public void run(final String script) {
mWebView.post(new Runnable() {
@Override
public void run() {
mWebView.loadUrl("javascript:" + script);
}
});
}
然后创建一个方法,returns一个JS String到:
- 获取页面中的所有表单。
- 全部循环。
- 循环浏览每个表单的元素..
- 将其值设置为(其旧值 - 最后一个字符)。
private String deleteLastCharScript() {
return "var listOfForms = document.forms;\n" +
"for(var i = 0; i < listOfForms.length; i++) {\n" +
" var elements = listOfForms[i].elements;\n" +
" for(var j = 0 ; j < elements.length ; j++){\n" +
" var item = elements.item(j);\n" +
" item.value = item.value.substring(0, item.value.length - 1);\n" +
" }\n" +
"};";
}
您可以在 onBackPressed()
方法中 运行 该脚本,如下所示:
@Override
public void onBackPressed() {
run(deleteLastCharScript());
}
这是MCVE:
添加到清单:
<uses-permission android:name="android.permission.INTERNET" />
创建简单的WebView
布局:
<?xml version="1.0" encoding="utf-8"?>
<WebView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/webView1"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
Activity 中的实施:
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.webkit.WebView;
public class MainActivity extends AppCompatActivity {
private WebView mWebView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.webview);
mWebView = findViewById(R.id.webView1);
mWebView.getSettings().setJavaScriptEnabled(true); // enable JS
mWebView.loadUrl("https://www.google.com");
}
/**
* Execute JS String Asynchronously
* @param script
*/
public void run(final String script) {
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
// run JavaScript asynchronously
// it works on KitKat onwards
mWebView.evaluateJavascript(script, null);
}else {
// use different thread to run JavaScript asynchronously
// because evaluateJavascript doesn't work on versions before KitKat
new Thread(new Runnable() {
@Override
public void run() {
mWebView.post(new Runnable() {
@Override
public void run() {
mWebView.loadUrl("javascript:" + script);
}
});
}
}).start();
}
}
/**
* This JS Script tp Loop through all
* inputs in all forms in the page
* and remove last char from each
* @return
*/
private String deleteLastCharScript() {
return "var listOfForms = document.forms;\n" +
"for(var i = 0; i < listOfForms.length; i++) {\n" +
" var elements = listOfForms[i].elements;\n" +
" for(var j = 0 ; j < elements.length ; j++){\n" +
" var item = elements.item(j);\n" +
" item.value = item.value.substring(0, item.value.length - 1);\n" +
" }\n" +
"};";
}
@Override
public void onBackPressed() {
run(deleteLastCharScript());
}
}