您的位置:首页 > 其它

变通解决firefox3不能使用window.close();关闭浏览器

2008-10-20 16:28 645 查看
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>

大功告成!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: