2008-10-13 11 views
106

나는 내 웹 응용 프로그램 http://localhost/foo.txt의 루트에 텍스트 파일을하고 난 자바 스크립트의 변수에로드하고 싶습니다 그루비에서 나는이 작업을 수행 할 것입니다 : 내가 얻을 수있는 방법텍스트 파일의 내용을 javascript 변수로로드하는 방법은 무엇입니까? ..

def fileContents = 'http://localhost/foo.txt'.toURL().text; 
println fileContents; 

을 자바 스크립트에서 비슷한 결과?

답변

105

XML없이 XMLHttpRequest, 즉 AJAX.

이렇게 정확한 방법은 당신이 사용중인 자바 스크립트 프레임 워크에 의존하지만, 우리는 상호 운용성 문제를 무시하는 경우, 코드가 같은 모양 : 일반적으로 말하기

var client = new XMLHttpRequest(); 
client.open('GET', '/foo.txt'); 
client.onreadystatechange = function() { 
    alert(client.responseText); 
} 
client.send();

하지만, XMLHttpRequest를 하는게 아닙니다 '를 모든 플랫폼에서 사용할 수 있으므로 일부 fudgery가 수행됩니다. 다시 한번, jQuery와 같은 AJAX 프레임 워크를 사용하는 것이 가장 좋습니다.

추가 고려 사항 하나 : foo.txt가 동일한 도메인에있는 경우에만 작동합니다. 다른 도메인에있는 경우 동일한 출처 보안 정책으로 인해 결과를 읽을 수 없습니다. 귀하의 의견은 XML로 구성 된 경우

+1

동일한 출처 정책에 대한 해결 방법은 jQuery에서도 지원되는 [JSONP] (http://en.wikipedia.org/wiki/JSONP)를 사용하는 것입니다 (클라이언트 측 부분의 경우) – OneWorld

+3

onreadystatechange에 XMLHttpRequest 객체의 readystate 속성 (예 : client.readystate)에 액세스하여 onreadystatechange 이벤트가로드,로드 됨으로 인해 상태가 무엇인지 알 수 있다는 점을 추가하는 것이 유용 할 수 있습니다. ... 그래서 당신은 client.readystate == 4 ins을 기다려야합니다. ide onreadystatechange를 사용하여 client.responseText를 사용할 수 있습니다. – GameAlchemist

+2

@GameAlchemist : 좋은 대답을 발견했습니다. 대부분의 브라우저에서 readyState는 낙타 케이스이므로 코드는 다음과 같이되어야합니다.''if (client.readyState === 4) {}''' – snorpey

-2

, 당신은 importXML 기능을 사용할 수 있습니다. (추가 정보 here at quirksmode).

는 XML하지 않고, 당신이 거기에서 내용을 읽을 다음 숨겨진 iframe에 그것을 열고 수있는 일반 텍스트를 가져 오기위한 동등한 기능이없는 경우. 나는 JQuery와에 그것을 어떻게 여기

+1

링크가 작동하지 않습니다. – ArtOfWarfare

80

은 다음과 같습니다 명심해야 할

jQuery.get('http://localhost/foo.txt', function(data) { 
    alert(data); 
}); 
+0

일반 테이블 형식의 텍스트 데이터로는 작동하지 않는 것 같습니다 (http://docs.jquery.com/Specifying_the_Data_Type_for_AJAX_Requests) – pufferfish

+4

'file : //'을 사용하여 로컬에서 테스트하는 경우에는 작동하지 않습니다.': file : /// example.com/foo.html'. Firefox는 Cross-Origin 요청으로 간주하기 때문에 구문 오류 및 Chrome 블록에 대해 불만을 표시합니다. – Akronix

+0

@pufferfish'dataType' 매개 변수를 지정하면 일반 데이터로 작동합니다. [api.jquery.com/jQuery.get/](http://api.jquery.com/jQuery.get/) – yvesonline

6

한 가지 자바 스크립트가 서버에서 클라이언트에서 실행되지 것입니다. Javascript로 서버에서 실제로 "파일을로드"할 수 없습니다. Javascript가 서버에 요청을 보내면 서버는 요청 된 파일의 내용을 되돌려 보냅니다. Javascript는 어떻게 콘텐츠를 수신합니까? 이것이 바로 콜백 함수입니다. 에드워드의 경우, 그

client.onreadystatechange = function() { 

및 danb의 경우

, 그것은이 기능은 데이터가 도착하는 일마다 호출됩니다

function(data) { 

입니다. jQuery 버전은 암묵적으로 Ajax를 사용한다. 단지 코드를 라이브러리에 캡슐화함으로써 코딩을 쉽게 만든다.

1

대신 jQuery.get를 사용 JQuery와 작업, 예를 들어

jQuery.get("foo.txt", undefined, function(data) { 
    alert(data); 
}, "html").done(function() { 
    alert("second success"); 
}).fail(function(jqXHR, textStatus) { 
    alert(textStatus); 
}).always(function() { 
    alert("finished"); 
}); 

당신에게 훨씬 더 압축 된 양식을 제공하는 .load을 사용할 수

$("#myelement").load("foo.txt"); 

.load도 유용하게 사용할 수있는 부분 페이지를로드 할 수있는 옵션을 제공, api.jquery.com/load/를 참조하십시오.당신은 단지 텍스트 파일에서 상수 문자열을 원하는 경우에

16

, 당신은 자바 스크립트로 포함 할 수있다 : 파일에서로드

// This becomes the content of your foo.txt file 
 
let text = ` 
 
My test text goes here! 
 
`;
<script src="foo.txt"></script> 
 
<script> 
 
    console.log(text); 
 
</script>

캐릭터가로드 된 후에 자바 스크립트에 접근하게된다. `(역 따옴표) 문자는 시작하여 template literal으로 끝나며 텍스트 블록에 "and"문자를 모두 허용합니다.

이 방법은 로컬에서 파일을로드하려고 할 때 잘 동작합니다. Chrome은 AJAX를 허용하지 않습니다. file:// 스키마의 URL

+0

이것은 정말 매끄러운 솔루션이 될 것입니다. 그러나 템플릿 리터럴은 IE11에서 지원되지 않으며 함수 블록 내부에서 "let"변수가 범위를 벗어날 수 있으므로이 구현은 위험에 처할 수 있습니다. – Neville

관련 문제