Quando muitas pessoas usam AJAX para chamar conteúdo em sites de outras pessoas, JS solicitará um erro sem permissão. Esta é uma limitação do componente XMLHTTP - por motivos de segurança.
É proibido acessar sites que não sejam do mesmo domínio. Aqui está um exemplo de acesso a http://www.google.cn,
<tipo de script=texto/javascript>
função criarobj() {
if (janela.ActiveXObject) {
retornar novo ActiveXObject (Microsoft.XMLHTTP);
}
senão if (window.XMLHttpRequest) {
retornar novo XMLHttpRequest();
}
}
function getWebPage(url) {
var oBao=createobj();
var meu_url=url
oBao.open('get',my_url,false);
oBao.onreadystatechange=função(){
if(oBao.readyState==4){
if(oBao.status==200){
var returnStr=oBao.responseText;
documento.write(returnStr);
}outro{
document.write(O endereço que você digitou não foi encontrado ou erro do servidor 505!);
}
}
}
oBao.send(nulo);
}
getWebPage('http://www.google.cn');
</script>
Salve este código em test.html e abra-o localmente com o IE sem nenhum problema, mas após enviar este código para o servidor ocorre um problema - JS não solicita nenhum erro de permissão!!!
Vamos pensar sobre isso: como você não pode acessar endereços de domínio diferentes, você só pode acessar endereços no mesmo domínio. Como os arquivos dinâmicos no mesmo domínio podem obter o conteúdo de páginas da web em domínios diferentes? Ainda pensamos em AJAX, mas esse AJAX é executado no lado do servidor.
A idéia geral é esta: primeiro envie a URL para um arquivo em seu próprio site usando AJAX, como getPage.asp --- em getPage.asp, acesse novamente a URL enviada através do servidor XMLHTTP --- retorne o conteúdo obtido para o Página de URL enviada ---- exibir conteúdo
Vamos começar a organizar o código, começando pelo arquivo test.html
<tipo de script=texto/javascript>
função criarobj() {
if (janela.ActiveXObject) {
retornar novo ActiveXObject (Microsoft.XMLHTTP);
}
senão if (window.XMLHttpRequest) {
retornar novo XMLHttpRequest();
}
}
function getWebPage(url) {
var oBao=createobj();
var meu_url=getpage.asp?url=+escape(url);
oBao.open('get',my_url,false);
oBao.onreadystatechange=função(){
if(oBao.readyState==4){
if(oBao.status==200){
var returnStr=oBao.responseText;
documento.write(returnStr);
}outro{
document.write(O endereço que você digitou não foi encontrado ou erro do servidor 505!);
}
}
}
oBao.send(nulo);
}
getWebPage('http://www.google.cn');
</script>
Depois, há o arquivo getpage.asp (nota: este arquivo deve ser salvo no formato UTF-8 para evitar caracteres ilegíveis), como segue:
<%
resposta.charset=UTF-8
reg=/<meta.+ charset= {0,}([^/ />//]*).+//{0,1}/>
'Nome da função: GetResStr
'Função: Obtenha o código HTML da URL especificada
'Parâmetros: URL-a URL a ser obtida
função GetResStr(URL)
err.claro
dim ResBody,ResStr,PageCode,ReturnStr
Definir Http=createobject(MiCROSOFT.XMLHTTP)
Http.open GET,URL,Falso
Http.Enviar()
Se Http.Readystate =4 então
Se Http.status=200 Então
ResStr=http.responseText
ResBody=http.responseBody
PageCode=GetCode(ResStr,reg)
ReturnStr=BytesToBstr(http.responseBody,PageCode)
GetResStr=ReturnStr
Terminar se
Terminar se
Função final
'Nome da função:BytesToBstr
'Função: Converte dados binários em caracteres
'Parâmetros: dados binários do corpo, método de codificação de texto Cset
Função BytesToBstr(Body,Cset)
Escurecer Objstream
Definir Objstream = CreateObject(adodb.stream)
objstream.Type = 1
objstream.Modo =3
objstream.Open
objstream.Escrever corpo
objstream.Posição = 0
objstream.Type = 2
objstream.Charset =Cset
BytesToBstr = objstream.ReadText
objstream.Fechar
definir objstream = nada
Função final
'Nome da função: GetCode
'Função: Converte binário em caractere
'Parâmetros: str-string a ser consultada, regstr-expressão regular
Função GetCode(str,regstr)
Dim Reg,serStr
definir Reg = novo RegExp
Reg.IgnoreCase = Verdadeiro
Reg.MultiLine = Verdadeiro
Reg.Pattern =regstr
if Reg.test(str) then 'Se um item correspondente for encontrado
Definir colunas = Reg.Execute(str)
serStr=Cols(0).SubMatches(0) 'Use a primeira correspondência encontrada
else 'Caso contrário, forneça o valor padrão gb2312, que é um pouco preguiçoso. Se a página não fornecer o formato de codificação, é realmente um pouco problemático saber.
serStr=gb2312
terminar se
GetCode=serStr
função final
dim url:url=request.querystring(url)
resposta.write GetResStr(URL)
%>
O código foi organizado. Depois de experimentar, o conteúdo de http://www.google.cn foi extraído com sucesso!!!!!
Na verdade, um getpage.asp simples pode ser obtido, mas não pode processar dinamicamente o DOM como js.
Há outro problema. Se você usar o primeiro método para acessar http://www.baidu.com, caracteres ilegíveis aparecerão porque a codificação do baidu é GB2312.
XMLHTTP retorna o formato de codificação UTF-8. Usando o segundo método, tal problema não ocorrerá, desde que o site que define o formato de codificação possa retornar informações normalmente (isso não inclui alguns sites que usam codificação especial).