Firefox新版本默认情况下是不允许脚本随便关闭浏览器窗口,window.close只能关闭window.open出来的窗口。对于直接从浏览器打开的窗口无法关闭,
可以设置firefox的参数来关闭窗口:about:config
dom.allow_scripts_to_close_windows
把false修改為true
但是在实际的应用中,不可能去让用户更改浏览器的设置。
另外一种变通的方法解决此问题的思路:firefox并不能限制windows底层去关闭浏览器。因此用vc++写一个关闭浏览器的dll。
在java中调用它即可;
java调用dll:
1).Eclipse 中新建一个class,声明c++的接口:
- package closewin;
- public class CloseWin
- {
- public native static void closeWinJava();
- }
2)CMD下用javah命令生成用于VC++调用的头文件;
java Closewin.java
javah closewin.CloseWin
3) 打开VC++,新建一个dll,新建一个class,取名CloseWin;导入刚才生成的.h文件,新建一个cpp文件;
CloseWin.h
- /* DO NOT EDIT THIS FILE - it is machine generated */
- #include <jni.h>
- /* Header for class closewin_CloseWin */
- #ifndef _Included_closewin_CloseWin
- #define _Included_closewin_CloseWin
- #ifdef __cplusplus
- extern "C" {
- #endif
- /*
- * Class: closewin_CloseWin
- * Method: closeWinJava
- * Signature: ()V
- */
- JNIEXPORT void JNICALL Java_closewin_CloseWin_closeWinJava
- (JNIEnv *, jclass);
- #ifdef __cplusplus
- }
- #endif
- #endif
CloseWin.cpp
- // CloseWin.cpp: implementation of the CloseWin class.
- //
- //
- #include <windows.h>
- #include <winuser.h>
- #include "CloseWin.h"
- //
- // Construction/Destruction
- //
- JNIEXPORT void JNICALL Java_closewin_CloseWin_closeWinJava(JNIEnv *env, jclass cls)
- {
- /*keybd_event(VK_MENU, MapVirtualKey(VK_MENU, 0), 0, 0);
- keybd_event(VK_F4, MapVirtualKey(VK_F4, 0), 0, 0);
- keybd_event(VK_F4,MapVirtualKey(VK_F4, 0), KEYEVENTF_KEYUP ,0);
- keybd_event(VK_MENU,MapVirtualKey(VK_MENU, 0), KEYEVENTF_KEYUP ,0);
- */
- HWND hwnd = ::GetForegroundWindow();
- ::SendMessage(hwnd,WM_CLOSE,0,0);
- // ::MessageBox(NULL,"Tom test","Tom",MB_OK);
- }
注意构建途径加上jdk的路径; Tools->options->Directories->include files:%JAVA_HOME%/include;%JAVA_HOME%/include/win32;
4)Eclipse中修改class
- package closewin;
- public class CloseWin
- {
- static
- {
- // System.loadLibrary("CloseWinc");
- System.load("c://CloseWinc");
- }
- public native static void closeWinJava();
- public static void main(String[] args)
- {
- // CloseWin instance = new CloseWin();
- //instance.closeWinJava();
- }
- }
5)新建一个Servelet,用于jsp页面调用:
- package closewin;
- import java.io.IOException;
- import java.io.PrintWriter;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- public class invokeCloseWin extends HttpServlet {
- public void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response)
- {
- closewin.CloseWin closewin1=new closewin.CloseWin();
- try
- {
- closewin1.closeWinJava();
- }catch(Exception e)
- {System.out.println(e);}
- }
- protected void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- doPost(request,response);
- }
- }
6)JSP页面采用ajax调用serverlet;
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
- <title>dsdd</title>
- </head>
- <script language="javascript">
- var xmlHttp
- function showCustomer(str)
- {
- xmlHttp=GetXmlHttpObject();
- if (xmlHttp==null)
- {
- alert ("Do no support AJAX");
- return;
- }
- var url=str;
- //xmlHttp.onreadystatechange=stateChanged;
- xmlHttp.open("GET",url,true);
- xmlHttp.send(null);
- }
- function GetXmlHttpObject()
- {
- var xmlHttp=null;
- try{
- // Firefox, Opera 8.0+, Safari
- xmlHttp=new XMLHttpRequest();
- }catch (e) {
- // Internet Explorer
- try
- {
- xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
- } catch (e){
- xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
- }
- }
- return xmlHttp;
- }
- </script>
- <body>
- <a name="dssd" onClick="" href="javascript:showCustomer('servlets/invokeCloseWin');">close window</a>
- </body>
- </html>
大功告成!!!