스크립트가로드 된 후 자바 스크립트 함수 호출


82

나는 아래와 같은 자바 스크립트를 통해 동적으로 html을 추가하는 html 페이지가 있습니다.

<script type="text/javascript" src="/myapp/htmlCode"></script>

js 함수를 호출하고 싶습니다. eg loadedContent (); 위의 스크립트가 동적 HTML을 추가하면.

누군가 내가 어떻게 할 수 있습니까?

답변:


141

head.js javascript를 사용하지 않고도이를 달성 할 수 있습니다.

function loadScript( url, callback ) {
  var script = document.createElement( "script" )
  script.type = "text/javascript";
  if(script.readyState) {  // only required for IE <9
    script.onreadystatechange = function() {
      if ( script.readyState === "loaded" || script.readyState === "complete" ) {
        script.onreadystatechange = null;
        callback();
      }
    };
  } else {  //Others
    script.onload = function() {
      callback();
    };
  }

  script.src = url;
  document.getElementsByTagName( "head" )[0].appendChild( script );
}


// call the function...
loadScript(pathtoscript, function() {
  alert('script ready!'); 
});

6
참고 : onloadIE 버전 9에 대한 확인과 이상 - 그래서 그냥 설정은 onload지금 아마 대부분의 사람들 괜찮
Simon_Weaver

3
참고 onload는 스크립트가 실제로 실행을 마쳤을 때가 아니라 "LOADS"분에 콜백을 시작합니다. 이는 실망 스럽습니다
Ma Dude

@MaDude 그것에 관한 문서를 참조 할 수 있습니까?
kontrollanten

2
onload스크립트가없는 완성 된 실행이있는 경우 자바 스크립트가 단일 스레드이기 때문에 핸들러는 아마도이라고 할 수 없습니다. 즉, onload핸들러는 스크립트가 시작되기 전 또는 실행이 완료된 후에 만 ​​호출 될 수 있습니다. 나는 개인적으로 이전 사건이 발생하는 것을 본 적이 없습니다. onload스크립트가 실행되기 전에 핸들러를 호출 할 수 있는 재현 가능한 사례를 아는 사람이 있으면 알려주십시오.
GetFree

스크립트 배열을로드하는 간단한 확장 : function loadScripts (urls, callback) {var counter = 0 for (var i=0; i<urls.length; i++) { loadScript(urls[i], function () { if (++counter === urls.length) { callback() } }) } }
sree

28

나는 같은 문제가 있었다 ... 내 솔루션 (jQuery없이) :

<script onload="loadedContent();" src ="/myapp/myCode.js"  ></script>

2
참고 : 이것은 엄격한 CSP와 호환되지 않습니다.
Bradley

14

2020 년에이 게시물을 읽고 있다면 아마도 약속에 더 익숙 할 것입니다. 모든 대상 브라우저가 ES6를 지원하거나 폴리 필을 사용하는 경우보다 현대적인 접근 방식이 바람직합니다.

이 솔루션은 @JaykeshPatel 답변 처럼 작동 하지만 다음을 기반으로 Promise합니다.

// definition
function loadScript(scriptUrl) {
  const script = document.createElement('script');
  script.src = scriptUrl;
  document.body.appendChild(script);
  
  return new Promise((res, rej) => {
    script.onload = function() {
      res();
    }
    script.onerror = function () {
      rej();
    }
  });
}

// use
loadScript('http://your-cdn/jquery.js')
  .then(() => {
    console.log('Script loaded!');
  })
  .catch(() => {
    console.error('Script loading failed! Handle this error');
  });

다음의 인수에 일부 상황 변수를 전달할 수 있습니다. res콜백의 . 또는 라이브러리가 전역 심볼을 가져온 경우 여기에서 참조 할 수 있습니다.

예를 들어 jQuery는 $전역 심볼을 도입하기 때문에 res($)로컬 범위를 호출 하고 생성 할 수 있습니다 (TypeScript를 사용하고 각 파일에서 모듈 변수를 선언하지 않으려는 경우이 방식으로 작성할 수 있습니다 const $ = await loadScript(..)).

인수를 전달하지 않으려는 경우 다음과 같이 코드를 줄일 수 있습니다.

script.onload = res;
script.onerror = rej;

1
script.onLoad = res;// 단순화
Kunukn

1
@Kunukn 또한 더 짧은 것이 있습니다 return new Promise(res => script.onload = res). 그러나 함수를 지정하는 것은하기 onload쉽게 읽을 수 있고 당신이 결의에 인수 전달할 수 있습니다
크리스티안 Traìna

12

이렇게 해봐

var script = document.createElement('script');

if(script.readyState) {  //IE
script.onreadystatechange = function() {
  if ( script.readyState === "loaded" || script.readyState === "complete" ) {
    script.onreadystatechange = null;
    alert(jQuery);
  }
};
 } else{//others
script.onload = function() {
  alert(jQuery); 
}
}
script.src = "http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.js"
document.documentElement.appendChild(script);


4

내 대답은 Jaykesh Patel 대답 의 확장입니다 . 여러 자바 스크립트 를로드하기 위해이 코드를 구현했습니다 . 이것이 누군가에게 도움이되기를 바랍니다.

// RECURSIVE LOAD SCRIPTS
function load_scripts( urls, final_callback, index=0 )
{
    if( typeof urls[index+1] === "undefined" )
    {
        load_script( urls[index], final_callback );
    }
    else
    {
        load_script( urls[index], function() {
            load_scripts( urls, final_callback, index+1 );
        } );
    }
}

// LOAD SCRIPT
function load_script( url, callback )
{
    var script = document.createElement( "script" );
    script.type = "text/javascript";
    if(script.readyState) // IE
    {
        script.onreadystatechange = function()
        {
            if ( script.readyState === "loaded" || script.readyState === "complete" )
            {
                script.onreadystatechange = null;
                callback();
            }
        };
    }
    else // Others
    {  
        script.onload = function() { callback(); };
    }
    script.src = url;
    document.getElementsByTagName( "head" )[0].appendChild( script );
    debug("javascript included: "+url);
}

// EXAMPLE  
var main = function()
{
    console.log("main function executed");
}
var js = [ "path/to/script-1", "path/to/script-2", "path/to/script-3" ];
load_scripts( js, main );


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.