由于安全方面的考虑,Javascript被限制了跨域访问的能力,但是有时候我们希望能够做一些合理的跨域访问的事情,那么怎么办呢?
这里分两类情况:
一、基于同一父域的子域之间页面的访问;参见如下3个domain域:taobao.com、jipiao.taobao.com、promotion.taobao.com;它们有相同的父域taobao.com。
二、基于不同父域页面之间的访问;参见如下3个domain域:taobao.com、baidu.com、sina.com.cn;它们具有不同的父域。
解决它们之间跨域的方案有:
方案1:服务器Proxy
域 A的页面JS需要访问域B下的链接获取数据,该方案在域A的服务器端建立一个Proxy程序(可能是ASP、servlet等任何服务端程序),域A的页面JS直接调用本域下的Proxy程序,proxy程序负责将请求发送给域B下的链接并获取到数据,最后再通过Proxy将数据返回给页面JS使用。
经过的访问流程就是: 域A下JS --> 域A 下Proxy -- > 域B下的链接
例子:
第一步:
域A: http://Jipiao.taobao.com/test.htm
页面上javascript脚本:
view plaincopy to clipboardprint?
<mce:script type="text/javascript"><!--
Var sUrl="http://Jipiao.taobao.com/proxy.do"; //本域下代理地址
var callba ......
<input type=text onkeypress="return event.keyCode>=48&&event.keyCode<=57||(this.value.indexOf('.')<0?event.keyCode==46:false)" onpaste="return !clipboardData.getData('text').match(/\D/)" ondragenter="return false">
<asp:TextBox ID="TextBox1" runat="server" onkeyup='this.value=this.value.replace(/[^0-9.]/gi,"")' ></asp:TextBox> ......
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default2.aspx.cs" Inherits="Default2" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>文本框刷新的时候保存文本值</title>
<META NAME="save" CONTENT="history">
<STYLE>
.txtsave {behavior:url(#default#savehistory);}
</STYLE>
</head>
<body>
<form id="form1" runat="server">
<div>
文本保存:<asp:TextBox ID="TextBox1" runat="server" CssClass="txtsave"></asp:TextBox>
<br />
对照文本:<asp:TextBox ID="TextBox2" runat="server"></asp:TextBox></div>
</form>
</body>
</html>
实现效果:
点击IE中的刷新按钮:
刷新后的效果:
......
在实际应用中,可能会碰到这样的情况,需要在Java代码中执行JavaScript。
例如:
import java.io.IOException;
import java.io.PrintWriter;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class JsService {
/**
* function : 在java类中,执行javascript代码
* @param request
* @param response
*/
public static void postJavascriptOnHTML(HttpServletRequest request, HttpServletResponse response,String javascript){
StringBuffer buffer = new StringBuffer();
buffer.append("<mce:script type="text/javascript"><!--
\n").append(javascript).append("\n
// --></mce:script>\n");
outputResponse(request,response,buffer);
}
public static void alertMessageOnHTML(HttpServletRequest request, HttpServletResponse response,String message){
StringBuffer buffer = new StringBuffer();
buffer.append("<mce:script type="text/javascript"> ......
在实际应用中,可能会碰到这样的情况,需要在Java代码中执行JavaScript。
例如:
import java.io.IOException;
import java.io.PrintWriter;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class JsService {
/**
* function : 在java类中,执行javascript代码
* @param request
* @param response
*/
public static void postJavascriptOnHTML(HttpServletRequest request, HttpServletResponse response,String javascript){
StringBuffer buffer = new StringBuffer();
buffer.append("<mce:script type="text/javascript"><!--
\n").append(javascript).append("\n
// --></mce:script>\n");
outputResponse(request,response,buffer);
}
public static void alertMessageOnHTML(HttpServletRequest request, HttpServletResponse response,String message){
StringBuffer buffer = new StringBuffer();
buffer.append("<mce:script type="text/javascript"> ......
1.对于数组,我们可以自己写一个indexOf()方法:
[].indexOf || (Array.prototype.indexOf = function(v){
for(var i = this.length;i-- && this[i] !== v;);
return i; });
使用: var array = new Array();
array = ...;
if(array.indexOf("...")==-1){
...
}
2.当然上面的方法有些麻烦,我们一般不需要自己来定义数组的indexOf(),而是直接使用JavaScript自带的String的indexOf()方法即可。
于是,对于上面的例子,可以改写成:
使用: var array = new Array();
array = ...;
array = array.toString();
if(array.indexOf("...")==-1){
...
} ......
<html>
<head>
<mce:script language="javascript"><!--
function old_page()
{
window.location = "http://www.jb51.net"
}
function replace()
{
window.location.replace("http://www.jb51.net")
}
function new_page()
{
window.open("http://www.jb51.net")
}
// --></mce:script>
</head>
<body>
<input type="button" onclick="new_page()" value="new_page"/>
<input type="button" onclick="old_page()" value="old_page"/>
<input type="button" onclick="replace()" value="replace"/>
</body> ......