Webview不加载javascript获取内容
Webview does not load javascript to get content
我想获取 url 正文标记中的所有文本,但它不起作用。我搜索了很多,但找不到任何东西。我还添加了android.permission.INTERNET
。
所以问题是什么?
这是我的代码:
public class Activity_Main extends Activity {
@SuppressLint("JavascriptInterface")
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final WebView webView = (WebView) findViewById(R.id.webView);
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setDomStorageEnabled(true);
final TextView contentView = (TextView) findViewById(R.id.contentView);
class MyJavaScriptInterface
{
private TextView contentView;
public MyJavaScriptInterface(TextView aContentView)
{
contentView = aContentView;
}
@SuppressWarnings("unused")
public void processContent(String aContent)
{
final String content = aContent;
contentView.setText(content);
}
}
webView.getSettings().setJavaScriptEnabled(true);
webView.addJavascriptInterface(new MyJavaScriptInterface(contentView), "INTERFACE");
webView.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url)
{
webView.loadUrl("javascript:window.INTERFACE.processContent(document.getElementsByTagName('body')[0].innerText);");
}
});
webView.loadUrl("https://whosebug.com");
}
}
为您的接口函数更新@JavascriptInterface 并检查
class MyJavaScriptInterface
{
private TextView contentView;
public MyJavaScriptInterface(TextView aContentView)
{
contentView = aContentView;
}
@JavascriptInterface
public void processContent(String aContent)
{
final String content = aContent;
contentView.setText(content);
}
}
对于上面的 KITKAT
,还有另一种方法可以做到这一点
webView.evaluateJavascript("alert('pass here some ...')", new ValueCallback<String>() {
@Override
public void onReceiveValue(String s) {
}
});
这是android
执行js的更新方案
完整代码在这里
final WebView webView = (WebView) findViewById(R.id.webView);
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setDomStorageEnabled(true);
final TextView contentView = (TextView) findViewById(R.id.contentView);
class MyJavaScriptInterface
{
private TextView contentView;
public MyJavaScriptInterface(TextView aContentView)
{
contentView = aContentView;
}
@JavascriptInterface
public void processContent(String aContent)
{
final String content = aContent;
contentView.setText(content);
}
}
webView.getSettings().setJavaScriptEnabled(true);
webView.addJavascriptInterface(new MyJavaScriptInterface(contentView), "INTERFACE");
webView.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url)
{
super.onPageFinished(view,url);
if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.KITKAT) {
webView.evaluateJavascript("document.getElementsByTagName('body')[0].innerText", new ValueCallback<String>() {
@Override
public void onReceiveValue(String s) {
contentView.setText(s);
}
});
}
else {
webView.loadUrl("javascript:window.INTERFACE.processContent(document.getElementsByTagName('body')[0].innerText)");
}
}
});
webView.loadUrl("https://whosebug.com");
要从 Android 调用 JavaScript 函数,您不需要添加接口前缀:
webView.loadUrl("javascript:processContent(document.getElementsByTagName('body')[0].innerText);");
注意:您必须在 HTML 页面中实现调用的 javascript 函数。所以如果你在你的webview中调用第三方网站,你只能访问该页面中当前存在的功能。
例如 https://whosebug.com 没有名为 INTERFACE.processContent
!
的 javascript 函数
相反,当你想从 javascript 调用 Android 方法时,你需要那个前缀:
<script>INTERFACE.myAndroidMethod()</script>
最后,如果您想处理第三方网页的 HTML 内容,您无法使用 Webview 和 JavaScript 函数(该页面中不存在)提取内容,但您需要 Android 无需 WebView 中介即可加载网页内容的代码。
我想获取 url 正文标记中的所有文本,但它不起作用。我搜索了很多,但找不到任何东西。我还添加了android.permission.INTERNET
。
所以问题是什么?
这是我的代码:
public class Activity_Main extends Activity {
@SuppressLint("JavascriptInterface")
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final WebView webView = (WebView) findViewById(R.id.webView);
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setDomStorageEnabled(true);
final TextView contentView = (TextView) findViewById(R.id.contentView);
class MyJavaScriptInterface
{
private TextView contentView;
public MyJavaScriptInterface(TextView aContentView)
{
contentView = aContentView;
}
@SuppressWarnings("unused")
public void processContent(String aContent)
{
final String content = aContent;
contentView.setText(content);
}
}
webView.getSettings().setJavaScriptEnabled(true);
webView.addJavascriptInterface(new MyJavaScriptInterface(contentView), "INTERFACE");
webView.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url)
{
webView.loadUrl("javascript:window.INTERFACE.processContent(document.getElementsByTagName('body')[0].innerText);");
}
});
webView.loadUrl("https://whosebug.com");
}
}
为您的接口函数更新@JavascriptInterface 并检查
class MyJavaScriptInterface
{
private TextView contentView;
public MyJavaScriptInterface(TextView aContentView)
{
contentView = aContentView;
}
@JavascriptInterface
public void processContent(String aContent)
{
final String content = aContent;
contentView.setText(content);
}
}
对于上面的 KITKAT
,还有另一种方法可以做到这一点 webView.evaluateJavascript("alert('pass here some ...')", new ValueCallback<String>() {
@Override
public void onReceiveValue(String s) {
}
});
这是android
执行js的更新方案完整代码在这里
final WebView webView = (WebView) findViewById(R.id.webView);
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setDomStorageEnabled(true);
final TextView contentView = (TextView) findViewById(R.id.contentView);
class MyJavaScriptInterface
{
private TextView contentView;
public MyJavaScriptInterface(TextView aContentView)
{
contentView = aContentView;
}
@JavascriptInterface
public void processContent(String aContent)
{
final String content = aContent;
contentView.setText(content);
}
}
webView.getSettings().setJavaScriptEnabled(true);
webView.addJavascriptInterface(new MyJavaScriptInterface(contentView), "INTERFACE");
webView.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url)
{
super.onPageFinished(view,url);
if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.KITKAT) {
webView.evaluateJavascript("document.getElementsByTagName('body')[0].innerText", new ValueCallback<String>() {
@Override
public void onReceiveValue(String s) {
contentView.setText(s);
}
});
}
else {
webView.loadUrl("javascript:window.INTERFACE.processContent(document.getElementsByTagName('body')[0].innerText)");
}
}
});
webView.loadUrl("https://whosebug.com");
要从 Android 调用 JavaScript 函数,您不需要添加接口前缀:
webView.loadUrl("javascript:processContent(document.getElementsByTagName('body')[0].innerText);");
注意:您必须在 HTML 页面中实现调用的 javascript 函数。所以如果你在你的webview中调用第三方网站,你只能访问该页面中当前存在的功能。
例如 https://whosebug.com 没有名为 INTERFACE.processContent
!
相反,当你想从 javascript 调用 Android 方法时,你需要那个前缀:
<script>INTERFACE.myAndroidMethod()</script>
最后,如果您想处理第三方网页的 HTML 内容,您无法使用 Webview 和 JavaScript 函数(该页面中不存在)提取内容,但您需要 Android 无需 WebView 中介即可加载网页内容的代码。