현재 실행중인 자바 스크립트를로드 한 스크립트 요소를 어떻게 참조 할 수 있습니까?
상황은 다음과 같습니다. HEAD 태그 아래에 페이지에 “마스터”스크립트가 많이로드되어 있습니다.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<script type="text/javascript" src="scripts.js"></script>
“scripts.js”에는 다른 스크립트를 요청시로드 할 수있는 스크립트가 있습니다. HEAD 요소가 렌더링을 완료하지 않았기 때문에 HEAD 태그를 참조하지 않고 새 스크립트를 추가해야하기 때문에 일반적인 방법은 제대로 작동하지 않습니다.
document.getElementsByTagName('head')[0].appendChild(v);
내가하고 싶은 것은 현재 스크립트를로드 한 스크립트 요소를 참조하여 동적으로로드 된 새로운 스크립트 태그를 DOM에 추가 할 수 있습니다.
<script type="text/javascript" src="scripts.js"></script>
loaded by scripts.js--><script type="text/javascript" src="new_script1.js"></script>
loaded by scripts.js --><script type="text/javascript" src="new_script2.js"></script>
답변
현재 스크립트 요소를 얻는 방법 :
1. 사용 document.currentScript
document.currentScript
<script>
스크립트가 현재 처리되고 있는 요소를 반환합니다 .
<script>
var me = document.currentScript;
</script>
혜택
- 간단하고 명시 적입니다. 신뢰할 수 있습니다.
- 스크립트 태그를 수정할 필요가 없습니다
- 비동기 스크립트 (
defer
&async
) 와 함께 작동 - 스크립트가 동적으로 삽입 된 상태에서 작동
문제
- 구형 브라우저 및 IE에서는 작동하지 않습니다.
- 모듈과 작동하지 않습니다
<script type="module">
2. 아이디로 스크립트를 선택
스크립트에 id 속성을 부여하면를 사용하여 id별로 쉽게 스크립트를 선택할 수 있습니다 document.getElementById()
.
<script id="myscript">
var me = document.getElementById('myscript');
</script>
혜택
- 간단하고 명시 적입니다. 신뢰할 수 있습니다.
- 거의 보편적으로 지원
- 비동기 스크립트 (
defer
&async
) 와 함께 작동 - 스크립트가 동적으로 삽입 된 상태에서 작동
문제
- 스크립트 태그에 맞춤 속성을 추가해야합니다.
id
일부 브라우저의 경우 일부 브라우저에서 속성이 이상한 동작을 일으킬 수 있음
3. data-*
속성을 사용하여 스크립트를 선택하십시오
스크립트에 data-*
속성을 부여하면 내부에서 쉽게 선택할 수 있습니다.
<script data-name="myscript">
var me = document.querySelector('script[data-name="myscript"]');
</script>
이전 옵션보다 이점이 거의 없습니다.
혜택
- 간단하고 명시 적입니다.
- 비동기 스크립트 (
defer
&async
) 와 함께 작동 - 스크립트가 동적으로 삽입 된 상태에서 작동
문제
- 스크립트 태그에 맞춤 속성을 추가해야합니다.
querySelector()
모든 브라우저에서 호환되지 않는 HTML5id
속성을 사용하는 것보다 덜 널리 지원- 주위에 얻을 것이다
<script>
으로id
가장자리의 경우. - 다른 요소가 페이지에서 동일한 데이터 속성 및 값을 갖는 경우 혼동 될 수 있습니다.
4. src로 스크립트를 선택하십시오
데이터 속성을 사용하는 대신 선택기를 사용하여 소스별로 스크립트를 선택할 수 있습니다.
<script src="//example.com/embed.js"></script>
embed.js에서 :
var me = document.querySelector('script[src="//example.com/embed.js"]');
혜택
- 신뢰성
- 비동기 스크립트 (
defer
&async
) 와 함께 작동 - 스크립트가 동적으로 삽입 된 상태에서 작동
- 맞춤 속성이나 ID가 필요하지 않습니다
문제
- 않습니다 하지 로컬 스크립트에 대한 작업
- 개발 및 생산과 같은 다른 환경에서 문제를 일으킬 것
- 정적이고 깨지기 쉬운. 스크립트 파일의 위치를 변경하려면 스크립트를 수정해야합니다
id
속성을 사용하는 것보다 덜 널리 지원- 동일한 스크립트를 두 번로드하면 문제가 발생합니다
5. 모든 스크립트를 반복하여 원하는 스크립트를 찾으십시오.
또한 모든 스크립트 요소를 반복하고 각각 개별적으로 검사하여 원하는 것을 선택할 수 있습니다.
<script>
var me = null;
var scripts = document.getElementsByTagName("script")
for (var i = 0; i < scripts.length; ++i) {
if( isMe(scripts[i])){
me = scripts[i];
}
}
</script>
이를 통해 querySelector()
속성을 잘 지원하지 않는 이전 브라우저에서 이전 기술을 모두 사용할 수 있습니다 . 예를 들면 다음과 같습니다.
function isMe(scriptElem){
return scriptElem.getAttribute('src') === "//example.com/embed.js";
}
이것은 어떤 접근 방식의 이점과 문제를 물려 받지만 의존하지는 않지만 querySelector()
이전 브라우저에서 작동합니다.
6. 마지막으로 실행 된 스크립트를 가져옵니다
스크립트는 순차적으로 실행되므로 마지막 스크립트 요소는 현재 현재 실행중인 스크립트 인 경우가 많습니다.
<script>
var scripts = document.getElementsByTagName( 'script' );
var me = scripts[ scripts.length - 1 ];
</script>
혜택
- 단순한.
- 거의 보편적으로 지원
- 맞춤 속성이나 ID가 필요하지 않습니다
문제
- 않습니다 하지 비동기 스크립트 작업 (
defer
&async
) - 않습니다 하지 동적으로 삽입 된 스크립트 작업
답변
스크립트는 순차적으로 실행되므로 현재 실행중인 스크립트 태그는 그 때까지 페이지에서 항상 마지막 스크립트 태그입니다. 따라서 스크립트 태그를 얻으려면 다음을 수행하십시오.
var scripts = document.getElementsByTagName( 'script' );
var thisScriptTag = scripts[ scripts.length - 1 ];
답변
아마도 가장 쉬운 방법은 스크립 태그에 id
속성 을 부여하는 것입니다.
답변
스크립트는 “지연”또는 “비동기”속성이없는 경우에만 순차적으로 실행됩니다. 스크립트 태그의 가능한 ID / SRC / TITLE 속성 중 하나를 아는 경우에도 작동 할 수 있습니다. 따라서 Greg와 Justin의 제안은 모두 맞습니다.
document.currentScript
WHATWG 목록에 대한 제안이 이미 있습니다 .
편집 : Firefox> 4는 이미이 매우 유용한 속성을 구현하지만 IE11에서는 사용할 수 없으며 마지막으로 확인했으며 Chrome 29 및 Safari 8에서만 사용할 수 있습니다.
편집 : 아무도 “document.scripts”컬렉션을 언급하지 않았지만 다음은 현재 실행중인 스크립트를 얻는 데 좋은 크로스 브라우저 대안 일 수 있다고 생각합니다.
var me = document.scripts[document.scripts.length -1];
답변
다음은 폴리 필이있는 document.CurrentScript
경우 활용 하고 ID로 스크립트를 찾는 것입니다.
<script id="uniqueScriptId">
(function () {
var thisScript = document.CurrentScript || document.getElementByID('uniqueScriptId');
// your code referencing thisScript here
());
</script>
모든 스크립트 태그의 맨 위에 이것을 포함하면 어떤 스크립트 태그가 실행되고 있는지 지속적으로 알 수 있으며 비동기 콜백의 맥락에서 스크립트 태그를 참조 할 수 있다고 생각합니다.
테스트를 거치지 않았으므로 다른 사람에게 피드백을 남겨주세요.
답변
페이지로드 및 스크립트 태그가 자바 스크립트 (예 : 아약스)로 추가 될 때 작동해야합니다.
<script id="currentScript">
var $this = document.getElementById("currentScript");
$this.setAttribute("id","");
//...
</script>
답변
현재 실행중인 스크립트 블록에 대한 참조를 얻으려면 다음 간단한 단계를 수행하십시오.
- 스크립트 블록 내에 임의의 고유 한 문자열을 넣습니다 (각 스크립트 블록마다 고유해야 함)
- document.getElementsByTagName ( ‘script’)의 결과를 반복하여 각 컨텐츠 (innerText / textContent 특성에서 확보)에서 고유 한 문자열을 찾습니다.
예 (ABCDE345678은 고유 ID) :
<script type="text/javascript">
var A=document.getElementsByTagName('script'),i=count(A),thi$;
for(;i;thi$=A[--i])
if((thi$.innerText||thi$.textContent).indexOf('ABCDE345678'))break;
// Now thi$ is refer to current script block
</script>
btw의 경우, 다른 스크립트를 포함하기 위해 구식 document.write () 메서드를 사용하면됩니다. DOM이 아직 렌더링되지 않았다고 언급했듯이 브라우저는 항상 선형 순서로 스크립트를 실행한다는 사실을 활용할 수 있습니다 (나중에 렌더링 될 지연 스크립트는 제외). 나머지 문서는 여전히 “존재하지 않습니다”. document.write ()를 통해 작성한 것은 호출자 스크립트 바로 뒤에 배치됩니다.
원본 HTML 페이지의 예 :
<!doctype html>
<html><head>
<script src="script.js"></script>
<script src="otherscript.js"></script>
<body>anything</body></html>
script.js의 내용 :
document.write('<script src="inserted.js"></script>');
렌더링 된 후 DOM 구조는 다음과 같습니다.
HEAD
SCRIPT script.js
SCRIPT inserted.js
SCRIPT otherscript.js
BODY