다른 js 파일에서 자바 스크립트 함수 호출


141

second.js 파일의 first.js 파일에 정의 된 함수를 호출하고 싶었습니다. 두 파일 모두 다음과 같은 HTML 파일로 정의됩니다.

<script type="text/javascript" src="first.js"></script>
<script type="text/javascript" src="second.js"></script>

나는 전화를 걸 fn1()에 정의 first.js에서 second.js. 내 검색에서 대답이 first.js먼저 정의되어 있으면 가능하지만 테스트에서 그 방법을 찾지 못했습니다.

내 코드는 다음과 같습니다.

second.js

document.getElementById("btn").onclick = function() {
    fn1();
}

first.js

function fn1() {
    alert("external fn clicked");
}

6
글로벌 범위에있는 한 특별한 것은 없습니다.
— epascarello

1
우리는 하루에 수천 번이 일을하고 있습니다. 당신이 할 수 없다면 first.js에 문제가 있어야합니다 : 브라우저에 완전히로드되었는지 확인하고 구문 분석 중에 구문 오류가 있는지 확인하십시오 (둘 다 개발자 툴바에서 볼 수 있음) 브라우저))
— rplantiko

2
작동합니다. Chrome 또는 Firefox / Firebug의 JavaScript 콘솔을 사용하여이 작업을 실행할 때 발생하는 문제를 알려주려면 질문을 편집하십시오. (음, 함수 이름의 철자가 올바른지 확인하십시오.)
— Bob Brown

2
작동하지 않으면 뭔가 잘못한 것 같습니다. 귀하의 질문에 정보가 주어지면 그것을 원한다는 것은 불가능합니다.
— Felix Kling

2
실제 코드 여야합니다.
— epascarello

답변:


164

동일한 파일에 정의되어 있지 않거나 호출하기 전에로드 된 함수가 아니면 함수를 호출 할 수 없습니다.

함수가 호출하려는 범위와 같거나 더 큰 범위에 있지 않으면 함수를 호출 할 수 없습니다.

fn1first.js에서 함수 를 선언 하면 두 번째로fn1();

1.js :

function fn1 () {
    alert();
}

2.js :

fn1();

index.html :

<script type="text/javascript" src="1.js"></script>
<script type="text/javascript" src="2.js"></script>

4
프로덕션 애플리케이션에서이 모든 것을 관리하는 가장 좋은 방법은 무엇입니까?
— Costa

18
이것은 나를 위해 작동하지 않습니다. fn1 ()이 정의되지 않았다는 오류가 발생합니다
— Aayushi

10
이것은 나에게도 효과가 없습니다. jquery getscript를 사용하는 것이 좋지 않은 연습을 제안하는 것 외에는 해결 방법이 있습니까?
— Vandolph Reyes

14
이것이 실제로 작동하지 않는 경우 왜 82 표로 허용되는 답변입니까?
— 다니엘

26
이것이 효과가 없다면 다른 기능을 정의했을 가능성이 있습니다. 예를 들어, $(document).ready(function() {...})블록 내에서 기능을 수행 했지만 작동하지 않았습니다. 나는 그것을 옮겼고 그것은 매력처럼 작동했습니다.
— Michael Ziluck

23

함수를 전역 변수로 first.js 만들고 클로저를 살펴보고 document.ready외부 에 넣지 마십시오.

아약스도 사용할 수 있습니다

    $.ajax({
      url: "url to script",
      dataType: "script",
      success: success
    });

jquery getScript를 사용할 수있는 것과 같은 방법

$.getScript( "ajax/test.js" )
  .done(function( script, textStatus ) {
    console.log( textStatus );
  })
  .fail(function( jqxhr, settings, exception ) {
    $( "div.log" ).text( "Triggered ajaxError handler." );
});

7
초보자는 절대 이런 식으로 시도하지 마십시오. 이것은 피해야 할 나쁜 관행입니다. 웹 페이지에서 둘 다 참조하는 한 가능합니다. 동일한 JS 파일에있는 것처럼 함수를 호출하기 만하면됩니다.
— Ananda

유일한 문제는 어떤 이유로 든 헤더를 포함하지 않는다는 것입니다.
— Si8

21

첫 번째 JS :

function fn(){
   alert("Hello! Uncle Namaste...Chalo Kaaam ki Baat p Aate h...");
}

두 번째 JS :

$.getscript("url or name of 1st Js File",function(){
fn();
});

이것이 도움이 되길 바란다 ... 행복한 코딩.


2
제 생각에는jQuery.getScript()
— Pmpr

16

es6 가져 오기 내보내기 구문 사용을 고려할 수 있습니다. 파일 1에서;

export function f1() {...}

그리고 파일 2에서;

import { f1 } from "./file1.js";
f1();

사용중인 경우에만 작동합니다. <script src="./file2.js" type="module">

이렇게하면 두 개의 스크립트 태그가 필요하지 않습니다. 당신은 단순히 메인 스크립트가 필요하며, 다른 모든 것을 가져올 수 있습니다.


Safari를 사용하면 다음과 같은 결과가 나타납니다.cross-origin script load denied by cross-origin resource sharing policy
— kakyo

구형 브라우저에서는 es6 가져 오기 구문을 사용하지 못할 수 있습니다. Babel을 사용하면 더 쉽게 사용할 수 있습니다.
— tm2josep

5

다음과 같이 작동합니다.

1.js

function fn1() {
  document.getElementById("result").innerHTML += "fn1 gets called";
}

2.js

function clickedTheButton() {
  fn1();
} 

index.html

<html>
  <head>
  </head>
  <body>
    <button onclick="clickedTheButton()">Click me</button>
    <script type="text/javascript" src="1.js"></script>
    <script type="text/javascript" src="2.js"></script>
  </body>
 </html>

산출

산출.  버튼 + 결과

이 CodePen 코드 조각을 사용해보십시오 : link .


4

이 경우에만 작동합니다

<script>

태그는 본문에 있고 머리에는 없습니다.

그래서

<head>
...
<script type="text/javascript" src="first.js"></script>
<script type="text/javascript" src="second.js"></script>
</head>

=> 알 수없는 함수 fn1 ()

실패와

<body>
...
<script type="text/javascript" src="first.js"></script>
<script type="text/javascript" src="second.js"></script>
</body>

공장.


3

서버에서 속도를 향상시킬 수있는 경우 캐시를 사용하십시오.

var extern =(url)=> {           // load extern javascript
    let scr = $.extend({}, {
        dataType: 'script',
        cache: true,
        url: url
    });
    return $.ajax(scr);
}
function ext(file, func) {
    extern(file).done(func);    // calls a function from an extern javascript file
}

그런 다음 다음과 같이 사용하십시오.

ext('somefile.js',()=>              
    myFunc(args)
);  

선택적으로 프로토 타입을 만들어 더 유연하게 만듭니다. 따라서 함수를 호출하거나 여러 파일에서 코드를 가져 오려고 할 때마다 파일을 정의 할 필요가 없습니다.


3

first.js

function first() { alert("first"); }

Second.js

var imported = document.createElement("script");
imported.src = "other js/first.js";  //saved in "other js" folder
document.getElementsByTagName("head")[0].appendChild(imported);


function second() { alert("Second");}

index.html

 <HTML>
    <HEAD>
       <SCRIPT SRC="second.js"></SCRIPT>
    </HEAD>
    <BODY>
       <a href="javascript:second()">method in second js</a><br/>
       <a href="javascript:first()">method in firstjs ("included" by the first)</a>
    </BODY>
</HTML>

2
window.onload = function(){
    document.getElementById("btn").onclick = function(){
        fn1();
    }
   // this should work, It calls when all js files loaded, No matter what position you have written
});

코드 스 니펫이 문제를 해결할 수 있지만 코드의 목적이 무엇인지 (문제를 해결하는 방법) 설명해야합니다. 또한 stackoverflow.com/help/how-to-answer
— Ahmad F

2

창을 사용하여 전역 범위에서 함수를 선언하십시오.

first.js

window.fn1 = function fn1() {
    alert("external fn clicked");
}

second.js

document.getElementById("btn").onclick = function() {
   fn1();
}

이처럼 포함

<script type="text/javascript" src="first.js"></script>
<script type="text/javascript" src="second.js"></script>

1

이것은 실제로 매우 늦었지만 공유해야한다고 생각했습니다.

index.html에서

<script type="text/javascript" src="1.js"></script>
<script type="text/javascript" src="2.js"></script>

1.js에서

fn1 = function() {
    alert("external fn clicked");
}

2.js에서

fn1()

질문에서 OP의 의견을 참조하십시오 : "... 같은 이름의 잘못된 위치에있는 파일을 실험하고있었습니다 ..."
— traktor53

1

함수를 작성하는 동안 "var"을 사용하면 다른 파일에서 액세스 할 수 있습니다. 두 파일이 프로젝트에 제대로 연결되어 있고 서로 액세스 할 수 있는지 확인하십시오.

file_1.js

var firstLetterUppercase = function(str) {
   str = str.toLowerCase().replace(/\b[a-z]/g, function(letter) {
      return letter.toUpperCase();
   });
   return str;
}

이 함수 / 변수 양식 file_2.js 파일에 액세스

firstLetterUppercase("gobinda");

출력 => 고빈다

이것이 누군가에게 도움이되기를 바랍니다.



-2

나는 같은 문제가 있었다. jquery 문서 준비 기능 안에 함수를 정의했습니다 .

$(document).ready(function() {
   function xyz()
   {
       //some code
   }
});

그리고이 함수 xyz () 는 다른 파일에서 호출했습니다. 이것은 작동하지 않습니다 :) document ready 위에 함수를 정의해야합니다 .

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