使用 WebView.loadUrl 执行 javascript 在第一次运行应用程序时不起作用

executing javascript with WebView.loadUrl doesn't work when FIRST TIME running the app

本文关键字:运行 应用程序 不起作用 第一次 WebView loadUrl 执行 javascript 使用      更新时间:2023-09-26

在我的项目中,首先,我从数据库中获取了几个字符串,然后将每个字符串标记为<li>,并通过调用javascript函数将它们附加到空<ul>中。每当我修改代码并运行它时,第一次,js 函数似乎没有执行,但是当我再次运行它时,js 工作了,所有字符串都已作为<li>添加到<ul>中。只要我从未修改过代码,应用程序就可以正常工作,这意味着如果我在移动设备中重新安装它,js 直到第二次打开此应用程序才能正常工作。数据库的东西没有错。我认为问题是在执行 js 之前绘制了 web 视图,然后当重新绘制 web 视图时,一切都很好。

这是我的活动.java

public class WebView_testActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    WebView web = (WebView)findViewById(R.id.web_content);
    webView_handler(web);
    data_handler(web);
    Log.d(MyLog.LOG, "end of file");
}
private void webView_handler(WebView web){
    web.loadUrl("file:///android_asset/FormPanel.html");
    web.getSettings().setJavaScriptEnabled(true);
}
private void data_handler(WebView web){
    boolean hasSD = Environment.getExternalStorageState().equals( android.os.Environment.MEDIA_MOUNTED); 
    //String SDPATH = Environment.getExternalStorageDirectory().getPath();

    if(hasSD){
        DbHelper data_helper = new DbHelper(this, "/mnt/sdcard/CTIL/QuestionDB/Q1.db");
        SQLiteDatabase database = data_helper.getReadableDatabase();
        String sql = "SELECT pe.Description FROM tblFormEngine_PoolElement pe " + 
                "NATURAL JOIN tblFormEngine_FormElement fe WHERE fe.PanelID = 1";
        Cursor c = database.rawQuery(sql,null);
        if(c.getCount() == 0)
            Log.d(MyLog.LOG, "empty");      
        c.moveToFirst();
        if(!c.isAfterLast()){
            do{
                String description = c.getString(0);
                String html = "<li><p>" + description + "</p></li>";
                Log.d(MyLog.LOG, html);
                //web.loadUrl("javascript:Element_AppendHTML('content','""+html+"'")"); 
                MyThread mt = new MyThread(web, html);
                mt.start();
            }while(c.moveToNext());
        }
        c.close();
        database.close();
    }
}
private class MyThread extends Thread{
    private WebView web;
    private String html;

    MyThread(WebView web, String html){     
        this.web = web;
        this.html = html;
    }
    public  void run(){
        try {
                   web.loadUrl("javascript:Element_AppendHTML('content','""+html+"'")");
            sleep(500);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
}

这是js函数(实际上是一个JQuery函数):

function Element_AppendHTML(ElementID,HTML)
{
    $("#"+ElementID).append(HTML);  
}

以下是原始HTML文件,如果您需要查看:

<html>
<head>
<title>Form Panel</title>
<meta charset="utf-8">
<link rel="stylesheet" href="theme/FormPanel_Basic.css">
<script type="text/javascript" src="js/jquery-1.5.1.js"></script>   
<script type="text/javascript" src="js/jquery.scrollTo-1.4.2-min.js"></script>     
<script type="text/javascript" src="js/jquery.scrollToMe.js"></script>   
<script type="text/javascript" src="js/FormPanel.js"></script>
</head>
<body>    
<ul id="content" selected="true">

</ul>
</body>
</html>

有什么建议吗?

更改自

web.loadUrl("file:///android_asset/FormPanel.html");
web.getSettings().setJavaScriptEnabled(true);

web.getSettings().setJavaScriptEnabled(true);
web.loadUrl("file:///android_asset/FormPanel.html");

完成设置后不调用加载网址吗?