2

我有 wep 应用程序,其中一些页面必须执行 ajax 请求才能获取和更新该页面而不刷新页面。

我使用 android WebView 加载该 wep 应用程序时的问题。所有请求 ajax 的页面都不会更新页面,这意味着 ajax 请求不起作用。

这是 MainActivity.java 的代码

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.webview_layout);
        webView = (WebView) findViewById(R.id.webView);
        webView.clearCache(true);
        webView.setWebChromeClient(new WebChromeClient() {
            @Override
            public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
                Log.d(LOG_TAG, message);
                new AlertDialog.Builder(view.getContext())
                        .setMessage(message).setCancelable(true).show();
                result.confirm();
                return true;
            }
        });
        webView.setWebViewClient(new WebViewClient() {
            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                Toast.makeText(view.getContext(), "onPageStarted", Toast.LENGTH_SHORT).show();
                super.onPageStarted(view, url, favicon); //To change body of generated methods, choose Tools | Templates.
            }

            @Override
            public void onPageFinished(WebView view, String url) {
                Toast.makeText(view.getContext(), "onPageFinished", Toast.LENGTH_SHORT).show();
                super.onPageFinished(view, url); //To change body of generated methods, choose Tools | Templates.
            }
        });

        WebSettings webSettings = webView.getSettings();
        webSettings.setBuiltInZoomControls(true);
        webSettings.setJavaScriptEnabled(true);
        webSettings.setLoadWithOverviewMode(true);
        webSettings.setAllowContentAccess(true);
        webSettings.setUseWideViewPort(true);
        webView.loadUrl("http://192.168.1.236:8080/mobile/android.html");
}

并且 android.html 有 ajax 请求。android 应用程序工作正常并加载 android.html 但没有获取 ajax 数据

4

4 回答 4

4

经过漫长的3天,我终于找到了答案。
问题出在我请求的具有以下代码的页面中:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

在与 android webview 冲突且不适用于 jquery 选择器的响应中......不知道为什么!

但是当我从响应页面中删除上述代码时,它的 ajax 工作正常。

PS:我所有的页面都是 xhtml 而不是 html。

于 2013-04-16T21:08:24.200 回答
1
  1. 检查<uses-permission android:name="android.permission.INTERNET" />您的 AppManifest.xml 文件中是否有。
  2. 如果加载页面中的 javascript 向某个站点发出请求,http://192.168.1.236:8080而该站点不允许跨域 XMLHTTPRequests,则由于 WebView 的安全限制,这些请求将失败。
于 2013-04-15T21:11:05.213 回答
0

尝试这个

WebView web=(WebView) findViewById(R.id.webView1);
web.getSettings().setJavaScriptEnabled(true);
于 2015-02-15T07:29:06.780 回答
0

您可以将 AJAX 处理程序添加到您的 Web 视图中,以使用 AJAX 处理任何网站。

public class Main2Activity extends AppCompatActivity {

    private WebView webView;
    private ProgressBar progressBar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        webView = (WebView) findViewById(R.id.webView);
        progressBar = (ProgressBar) findViewById(R.id.progressBar);
        progressBar.setVisibility(View.GONE);
        webView.getSettings().setJavaScriptEnabled(true);
        initWebView();
        loadURL();
    }

    private void loadURL() {
        webView.loadUrl("www.google.com");
    }

    @SuppressLint("JavascriptInterface")
    private void initWebView() {
        webView.setWebChromeClient(new MyWebChromeClient(Main2Activity.this));
        webView.addJavascriptInterface(new AjaxHandler(Main2Activity.this), "ajaxHandler");
        webView.getSettings().setJavaScriptEnabled(true);

        webView.setWebViewClient(new WebViewClient() {

            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
                progressBar.setVisibility(View.GONE);

            }

            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                super.onPageStarted(view, url, favicon);
                progressBar.setVisibility(View.VISIBLE);
            }

            @Override
            public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
                super.onReceivedError(view, request, error);
                progressBar.setVisibility(View.GONE);
            }
        });
    }

    public class AjaxHandler {

        private static final String TAG = "AjaxHandler";
        private final Context context;

        public AjaxHandler(Context context) {
            this.context = context;
        }

        public void ajaxBegin() {
            Log.e(TAG, "AJAX Begin");
            Toast.makeText(context, "AJAX Begin", Toast.LENGTH_SHORT).show();
        }

        public void ajaxDone() {
            Log.e(TAG, "AJAX Done");
            Toast.makeText(context, "AJAX Done", Toast.LENGTH_SHORT).show();
        }
    }

    private class MyWebChromeClient extends WebChromeClient {
        Context context;

        public MyWebChromeClient(Context context) {
            super();
            this.context = context;
        }
    }

}
于 2017-12-21T10:27:08.467 回答