1. 程式人生 > >用JAVA編寫瀏覽器內核之實現javascript的document對象與內置方法

用JAVA編寫瀏覽器內核之實現javascript的document對象與內置方法

public urn cti cli 原理 null 編寫 代碼塊 頁面

原創文章。轉載請註明。

閱讀本文之前,您須要對瀏覽器怎樣載入javascript有一定了解。

當然,對java與javascript本身也須要了解。

本文首先介紹瀏覽器載入並執行javascript的原理。

其次將介紹怎樣用java與javascript互調用對象。

最後介紹怎樣用java實現javascript的document對象與其他內置方法。

瀏覽器從server得到含有javascript代碼的html文本後,將順序運行javascript代碼塊。

看代碼是最簡單的方式:

package org.taoningyu.js;

import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;

import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;

public class TaoDocument {
	
 Document mydoc = null;
	public TaoDocument(String url) throws MalformedURLException, IOException{
		mydoc = Jsoup.parse(new URL(url),30000);//利用Jsoup實現document樹
	}
	
    public Element getElementById(String id){//實現document的getElementById方法
    	System.out.println("Java println:\t"+mydoc.getElementById(id));
    	return mydoc.getElementById(id);//返回的是Element對象
    }
	public static void main(String[] args) throws MalformedURLException, IOException {
		
		
	    ScriptEngineManager sem = new ScriptEngineManager();
	    ScriptEngine se = sem.getEngineByName("javascript"); //初始化Java內置的javascript引擎
	    try {
	    	
	    	 se.eval("function test() {"
	    		    + "id='areaDefault'; print('js print:'+document.getElementById(id));return document.getElementById(id);}"); 
                 //測試用javascript自己定義函數,功能為輸出id為areaDefault的元素,並返回。
	    	 Invocable invocableEngine = (Invocable) se;//轉換引擎類型為Invocable 
	    	 se.put("document", new TaoDocument("http://www.ifeng.com/")); //關聯對象,這一步非常重要,關聯javascript的document對象為TaoDocument。亦即我自己實現的document對象
	    	 Element callbackvalue=(Element) invocableEngine.invokeFunction("test"); //直接執行函數。返回值為Element
	    	 System.out.println("callback return :"+callbackvalue); //打印輸出返回內容
	    	 se.eval("test()");//第二種調用函數方式,我更偏愛此種方式
		} catch (ScriptException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 

	}

}

通過實現document對象,就能夠動態解析html頁面了。

在另外的文章。我將介紹怎樣結合httpclient,使其成為headless瀏覽器的雛形。



用JAVA編寫瀏覽器內核之實現javascript的document對象與內置方法