>웹 프론트엔드 >JS 튜토리얼 >Ajax, UTF-8 또는 GB2312 eval 또는 execScript_javascript 기술

Ajax, UTF-8 또는 GB2312 eval 또는 execScript_javascript 기술

WBOY
WBOY원래의
2016-05-16 18:58:43946검색

두 가지 질문:
첫 번째 질문:
xmlhttp의 responseText는 기본적으로 항상 utf-8로 인코딩됩니다. 얼마 전까지만 해도 이 문제를 최소한의 비용으로 해결하기 위해 전체 프로젝트가 단순히 utf-8로 인코딩되었습니다. 8. 온라인에는 솔루션이 많지 않고 모두 매우 지저분해서 마음에 들지 않습니다. 앞으로는 모든 것에 utf-8을 사용할 수 없습니다.
두 번째 질문:
xmlhttp 로딩 페이지의 자바스크립트 스크립트를 실행할 수 없습니다. 이벤트 드라이버는 여전히 사용 가능합니다. 얼마 전에는 이 문제를 피하기 위해 전체 스크립트를 함께 작성했습니다. 정말 역겹습니다. 저는 수백 K의 js 파일을 로드해야 할 때마다 역겹습니다.

그래서 이제 시간이 나면 가장 정통적인 방법으로 해결해보겠습니다.
xmlhttp는 원래 xml을 조작하는 데 사용되는 것인데 responseText에서 반환되는 내용은 바이너리 하드 코딩을 사용하여 UTF-8로 변경됩니다. GB2312로 인코딩하는 방법은 당연히 신뢰할 수 없으며, 다른 인코딩을 처리하면 할 수 있는 일이 없습니다. responseXML에서 반환된 IXMLHTTPRequest 개체는 xml의 인코딩 선언에 의존하므로 당연히 왜곡될 수 없습니다. 사용하지 않을 이유가 없습니다.


여기에 필요한 HTML 텍스트가 있습니다.
]]>

스크립트는
returnValue = xmldom.documentElement.text;
returnValue는 내가 필요한 HTML 텍스트입니다. 인코딩을 변경하기 위해 상대적으로 엄격합니다.
첫 번째 질문은 기본적으로 utf-8, gb2315.gbk, 8859-1 중 어떤 인코딩을 사용하든 문서 설명만 변경하면 해결됩니다.
첫 번째 문제는 xml을 사용하기 때문에 두 번째 문제도 쉽게 해결할 수 있습니다. 일반적으로 로드된 페이지에 있는 페이지의 스크립트를 실행하기만 하면 로드하기 전에 선언할 수 있습니다. HTML 및 로딩이 완료되면 호출됩니다. 페이지에서의 사용은 DHTML 이벤트에 의해 구동된 다음 XML 구조를 변경할 수 있습니다.




// 여기 스크립트는 머리에 쓰는 것과 동일합니다. 🎜> ]]>



HtmlCode ]]>



// 여기서 스크립트는 본문 뒤에 작성하는 것과 동일합니다. ]]>


스크립트를 처리하려면 다음 줄을 작성해 보세요.
BeginScript = xmldom.documentElement.selectSingleNode("onStart").text;
htmlCode = xmldom.documentElement.selectSingleNode("body").text ;
endScript = xmldom.documentElement.selectSingleNode("onEnd").text;
IE에서는 문제가 없는 것 같은데, firefox에서는 오류가 발생합니다. selectSingleNode 방법은 작동하지 않습니다. 브라우저 식별 방법은 어디에나 복사하면 됩니다. 이제 내 컴퓨터에 있는 유일한 두 가지인 IE와 Firefox에만 관심이 있고 코드를 변경합니다.
아래 처음 세 줄은 NetEase 블로그에서 복사한 것입니다. 궁금한 점이 있으면 NetEase에 문의하세요. 직접 작성하기에는 너무 게으른데, 온라인에서 검색해 달라고 요청하는 것은 말할 것도 없습니다.
var isIE=(document.all&&document.getElementById&&!window.opera)?true:false;
var isMozilla=(!document.all&&document.getElementById&&!window.opera)?true:false; =(window.opera)?true:false;

if(isIE){
BeginScript = xmldom.documentElement.getElementsByTagName("onStart").item(0).text
htmlCode = xmldom.documentElement.getElementsByTagName("body").item(0).text;
endScript = xmldom.documentElement.getElementsByTagName("onEnd").item(0).text;
}else{
BeginScript = xmldom.documentElement.getElementsByTagName("onStart").item(0).textContent;
htmlCode = xmldom.documentElement.getElementsByTagName("body").item(0).textContent
endScript = xmldom. documentElement.getElementsByTagName("onEnd").item(0).textContent
}
완료. 나머지는 실행 방법입니다.
스크립트를 동적으로 실행해야 하는 경우 세 가지 방법이 있습니다.
a) JavaScript의 Global 객체의 eval() 메서드;
b) DHTML 창의 execScript() 메서드
c) JavaScript의 new Function();
첫 번째 방법은 호출 컨텍스트를 스크립트의 컨텍스트로 사용합니다. 실행 후 범위가 호출된 함수 또는 메서드 내부에만 있다는 명백한 문제가 있습니다. 역겨운 문제
두 번째 메서드는 DHTML의 최상위 개체 창에서 실행되므로 범위 문제는 없지만 execScript() 메서드에는 브라우저 호환성 문제가 있습니다. IE의 독점적인 방법입니다. Firefox에서는 사용할 수 없습니다.
세 번째 방법은 사용하기 불편할 뿐만 아니라 메서드를 선언해야 하는 경우에도 매우 귀찮은 문제입니다.
브라우저 호환성 문제가 없다면 두 번째 옵션을 사용하는 것이 최선의 선택입니다.
세 번째 옵션은 고려되지 않습니다.
범위 문제를 해결할 수 있다면 첫 번째 방법이 가장 좋습니다.
제가 생각한 방법은
웹페이지에서 변수를 선언하는
즉, varauthor = "Xi De San Ren"
;
즉,
function getBlogUrl(){
작성자 "블로그 주소: http://shizhong8841.blog.163.com"을 반환합니다.
}
현재 우리는
window.author = "Xi De Sanren"과 동일;
window.getMyBlogUrl = function(){
return this.author "블로그 주소: http://shizhong8841.blog.163.com" ;
}
그래서 창 개체를 조금 확장하면 됩니다.
window.runScript = function(str){
eval(str);
}
마법 this 다음에는 this.a=0 또는 this.funName = function(arg0) {}을 사용하세요. ; 이런 방식으로 스크립트를 작성하고 runScript(str) 메서드를 호출하는 것은 페이지에서 전역 속성과 메서드를 정의하는 것과 동일하며, 이는 범위 문제를 제거하고 목적을 달성할 수 있습니다.
이제 모든 문제는 해결되었으며 모든 테스트는 InternetElpxerer 6.0 및 Firefax 2.0에서 통과되었습니다. 제가 작성한 코드가 너무 지저분해서 당황하지 않도록 게시하지 않겠습니다만, 그래도 아이디어는 정확할 것입니다.
더 많은 질문은 나중에 논의하겠습니다.
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.