HTML / Javascript : src가 설정된 스크립트 태그에로드 된 JSON 데이터에 액세스하는 방법


90

페이지를 볼 수 있으므로 클라이언트에서 액세스 할 수 있도록 만들고 싶은 서버에서 생성 한이 JSON 파일이 있습니다. 기본적으로 달성하고 싶은 것은 다음과 같습니다.

내 html 문서에 다음 태그가 선언되어 있습니다.

<script id="test" type="application/json" src="http://myresources/stuf.json">

소스에서 참조 된 파일에는 JSON 데이터가 있습니다. 내가 본 것처럼 데이터는 스크립트에서 발생하는 것처럼 다운로드되었습니다.

이제 Javascript에서 어떻게 액세스합니까? JSON 데이터를 얻기 위해 다양한 방법을 사용하여 jQuery를 사용하거나 사용하지 않고 스크립트 태그에 액세스하려고 시도했지만 어떻게 든 작동하지 않습니다. 그는하기 innerHTMLJSON 데이터는 스크립트에서 인라인 작성했던 일 것입니다. 내가 달성하려는 것이 아니었고 그렇지 않습니다.

페이지로드 후 원격 JSON 요청도 옵션이 아닙니다.


3
json 파일 대신 개체를 변수에 할당하는 javascript 파일로 만드십시오. 다른 방법은 ajax를 사용하는 것입니다.
Asad Saeeduddin

3
첫 번째 제안은 현재 구현입니다. 나는 구조를 전달하기 위해 행동을 사용하고 있기 때문에 그것을하고 싶지 않습니다. 구조에 구조를 사용하고 싶습니다 (JSON을 원한다면 JSON을 얻습니다). 두 번째 제안은 원하지 않습니다 (초기화 프로세스에이 데이터가 필요합니다).
ChuckE 2012

1
<script>태그 또는 AJAX를 통해 @ChuckE를 사용 하면 추가 HTTP 요청이 완료 될 때까지 기다려야합니다. "src"속성을 사용하여 스크립트 내용을 가져 오면 브라우저에서 스크립트 내용을 읽을 수 없으므로 유일한 대안은 AJAX 요청을 만드는 것입니다.
Pointy

3
<script> 태그를 통한 @Pointy는 다운로드되는 즉시 평가됩니다. 내 json 스크립트를 js 스크립트 앞에두면 json 스크립트 데이터가 js 스크립트 데이터보다 먼저 평가됩니다. 즉, 기다리지 않고 데이터가 이미 있습니다. 그것이 나의 유일한 대안이라는 점에 대해, 나는 당신과 동의하기 전에 공식 문서를보고 싶습니다 (당신이 틀렸다는 말이 아니라 내가 질문을 작성한 이유였습니다).
ChuckE

2
"페이지로드 후 원격 JSON 요청도 제안하려는 경우 옵션이 아닙니다." ... JSON 요청은에서 보낸 요청과 어떻게 다른 <script src=""></script>가요? 둘 다 서버에 대해 GET 호출을 수행 할 것입니다.
Ben Lesh

답변:


115

그런 식으로 JSON을로드 할 수 없습니다. 죄송합니다.

"내가 src여기서 그냥 사용할 수없는 이유는 무엇입니까? 이런 것을 본 적이 있습니다 ..." 라고 생각하시는 것을 알고 있습니다 .

<script id="myJson" type="application/json">
 { 
   name: 'Foo' 
 }
</script>

<script type="text/javascript">
    $(function() {
        var x = JSON.parse($('#myJson').html());
        alert(x.name); //Foo
     });
</script>

... 간단히 말해서, 데이터 홀더로서 "남용"되는 스크립트 태그 일뿐입니다. 모든 종류의 데이터로 그렇게 할 수 있습니다. 예를 들어, 많은 템플릿 엔진은 스크립트 태그를 활용하여 템플릿을 보유 합니다.

원격 파일에서 JSON을로드하는 간단한 옵션 목록이 있습니다.

  1. $.get('your.json')또는 다른 AJAX 방법을 사용하십시오 .
  2. json에 전역 변수를 설정하는 파일을 작성하십시오. (하키 같다).
  3. 보이지 않는 iframe으로 가져온 다음로드 된 후 해당 콘텐츠를 스크랩합니다 (이를 "1997 모드"라고 함).
  4. 부두교 사제에게 문의하십시오.

최종 포인트 :

페이지로드 후 원격 JSON 요청도 옵션이 아닙니다.

... 말이 안 돼. AJAX 요청과 귀하를 처리하는 동안 브라우저에서 보낸 요청의 차이점 <script src="">은 본질적으로 아무것도 아닙니다. 둘 다 리소스에 대해 GET을 수행 할 것입니다. HTTP는 스크립트 태그 또는 AJAX 호출로 인해 수행되었는지 여부와 상관없이 서버도 마찬가지입니다.


5
좋은 대답입니다. "스크립트 태그가 '남용되고 있습니다'"라고 말하면 스크립트 태그를 잘못 사용했음을 의미합니까 (잘못된 것은 아니지만 "창의적인")? 귀하의 n. 2 옵션은 우리가 이미 프로덕션 환경에서 가지고있는 옵션입니다. 순수한 실험에서 엄격하게 json / no-js 솔루션을 찾고있었습니다 (확실한 경우 가능하지 않음에도 괜찮습니다). 마지막 요점과 관련하여 onload 이벤트 전에이 정보가 필요하며 전체 초기화가 완료 시간에 따라 달라질 수있는 비동기 요청에 종속되도록 만들고 싶지 않습니다. 이것이 Ajax 호출과 스크립트 태그의 주요 차이점입니다.
ChuckE

1
아니, 나는 그것이 "틀렸다"고 생각하지 않는다. 단지 ... "창조적"이 아마 좋은 단어 일 것이다. 실제로 <script>태그에 JSON을 쓰는 것이 가능하다면 그 경로로 갈 것입니다.
Ben Lesh

예, 전체 문제는 스크립트 태그 src 속성을 사용하여로드하고 문서에서이 정보를 "난독 화"하는 것이 었습니다.
ChuckE

글쎄, 클라이언트 측 브라우저 앱에서 사용자의 데이터를 실제로 숨길 수는 없습니다. 브라우저의 개발자 도구로 이동하여 JavaScript에 중단 점을 설정하고 원하는대로 개체를 검사 할 수 있습니다.
Ben Lesh

1
@Jaydipsinh, CORS 문제를 해결하고 Ajax를 사용해야합니다. 브라우저가 이러한 종류의 동작을 허용하지 않는 이유가 있습니다. 대부분의 브라우저는 더 이상 iframe을 사용하여 CORS를 해킹 할 수 없습니다.
Ben Lesh 2013 년

14

또 다른 해결책은 서버 측 스크립팅 언어를 사용하고 단순히 json-data 인라인을 포함하는 것입니다. 다음은 PHP를 사용하는 예입니다.

<script id="data" type="application/json"><?php include('stuff.json'); ?></script>
<script>
var jsonData = JSON.parse(document.getElementById('data').textContent)
</script>

위의 예는 유형이있는 추가 스크립트 태그를 사용합니다 application/json. 더 간단한 해결책은 JSON을 JavaScript에 직접 포함하는 것입니다.

<script>var jsonData = <?php include('stuff.json');?>;</script>

추가 태그가있는 솔루션의 장점은 JavaScript 코드와 JSON 데이터가 서로 분리되어 있다는 것입니다.


+ 텍스트 콘텐츠 용. .html 중에서는 스크립트 태그에 나를 위해하지 작업을 수행
세스 McClaine

9

이것이 가능하지 않거나 적어도 지원되지 않는 것처럼 보입니다.

로부터 HTML5 사양 :

데이터 블록 (스크립트와 반대) 을 포함 하는 데 사용되는 경우 데이터는 인라인으로 포함되어야하며 데이터 형식은 type 속성을 사용하여 제공되어야하며 src 속성은 지정되지 않아야 하며 스크립트 요소의 내용은 다음을 준수해야합니다. 사용 된 형식에 대해 정의 된 요구 사항에 따라야합니다.


1
JS 및 CSS보다 더 민감한 데이터를 처리하는 정책 인 것 같습니다.

5

현재 script태그로는 불가능 iframe하지만 동일한 도메인에서 가져온 경우 가능 합니다.

<iframe
id="mySpecialId"
src="/my/link/to/some.json"
onload="(()=>{if(!window.jsonData){window.jsonData={}}try{window.jsonData[this.id]=JSON.parse(this.contentWindow.document.body.textContent.trim())}catch(e){console.warn(e)}this.remove();})();"
onerror="((err)=>console.warn(err))();"
style="display: none;"
></iframe>

위의 내용을 사용하려면 idsrc속성을 필요한 것으로 바꾸십시오 . id(우리는이 상황에서 가정합니다 이는 동일 mySpecialId상점에 사용되는) 데이터 의를 window.jsonData["mySpecialId"].

즉, idonload스크립트를 사용하는 모든 iframe에 대해 해당 데이터 가 지정된 아래의 개체에 동기식으로 로드 됩니다.window.jsonDataid

나는 이것을 재미로하고 그것이 "가능하다"는 것을 보여주기 위해했지만 나는 그것을 사용하는 것을 추천 하지 않는다 .


대신 콜백을 사용하는 대안이 있습니다.

<script>
    function someCallback(data){
        /** do something with data */
        console.log(data);

    }
    function jsonOnLoad(callback){
        const raw = this.contentWindow.document.body.textContent.trim();
        try {
          const data = JSON.parse(raw);
          /** do something with data */
          callback(data);
        }catch(e){
          console.warn(e.message);
        }
        this.remove();
    }
</script>
<!-- I frame with src pointing to json file on server, onload we apply "this" to have the iframe context, display none as we don't want to show the iframe -->
<iframe src="your/link/to/some.json" onload="jsonOnLoad.apply(this, someCallback)" style="display: none;"></iframe>

크롬에서 테스트되었으며 파이어 폭스에서 작동합니다. IE 또는 Safari에 대해 잘 모르겠습니다.


3

나는 벤에 동의합니다. 단순 JSON 파일은로드 / 가져올 수 없습니다.

하지만 절대적으로 그렇게하고 싶고 json 파일을 업데이트 할 수있는 유연성이 있다면

my-json.js

   var myJSON = {
      id: "12ws",
      name: "smith"
    }

index.html

<head>
  <script src="my-json.js"></script>
</head>
<body onload="document.getElementById('json-holder').innerHTML = JSON.stringify(myJSON);">
  <div id="json-holder"></div>
</body>


2

다른 도메인에서 JSON을로드해야하는 경우 : http://en.wikipedia.org/wiki/JSONP
그러나 잠재적 인 XSSI 공격에 유의 하십시오 : https://www.scip.ch/en/?labs.20160414

동일한 도메인이면 Ajax를 사용하십시오.


2
JSONP는 JSON 형식 결과에서 작동하지 않습니다. 또한 스크립트에 인수로 전달 된 JSONP 매개 변수는 서버에서 정의합니다. 액세스 권한이 없을 수도 있습니다.
e-sushi

1

스크립트 파일에 이와 같은 것을 넣으십시오. json-content.js

var mainjson = { your json data}

그런 다음 스크립트 태그에서 호출

<script src="json-content.js"></script>

다음 스크립트에서 사용할 수 있습니다.

<script>
console.log(mainjson)
</script>

0

자바 스크립트 내에서 정확한 json을 사용하는 또 다른 대안입니다. Javascript Object Notation이므로 json 표기법으로 직접 객체를 만들 수 있습니다. 이것을 .js 파일에 저장하면 애플리케이션에서 객체를 사용할 수 있습니다. 이것은 내 앱의 나머지 부분과는 별도로 파일에 캐시하려는 정적 json 데이터가있을 때 유용한 옵션이었습니다.

    //Just hard code json directly within JS
    //here I create an object CLC that represents the json!
    $scope.CLC = {
        "ContentLayouts": [
            {
                "ContentLayoutID": 1,
                "ContentLayoutTitle": "Right",
                "ContentLayoutImageUrl": "/Wasabi/Common/gfx/layout/right.png",
                "ContentLayoutIndex": 0,
                "IsDefault": true
            },
            {
                "ContentLayoutID": 2,
                "ContentLayoutTitle": "Bottom",
                "ContentLayoutImageUrl": "/Wasabi/Common/gfx/layout/bottom.png",
                "ContentLayoutIndex": 1,
                "IsDefault": false
            },
            {
                "ContentLayoutID": 3,
                "ContentLayoutTitle": "Top",
                "ContentLayoutImageUrl": "/Wasabi/Common/gfx/layout/top.png",
                "ContentLayoutIndex": 2,
                "IsDefault": false
            }
        ]
    };
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.