Chiamare una funzione javascript in un altro file js


142

Volevo chiamare una funzione definita in un file first.js nel file second.js. entrambi i file sono definiti in un file HTML come:

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

Voglio chiamare fn1()definito in first.jsin second.js. Dalle mie ricerche le risposte sono state se first.jsè stato definito prima è possibile, ma dai miei test non ho trovato alcun modo per farlo.

Ecco il mio codice:

second.js

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

first.js

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

6
Quindi chiamalo, non c'è niente di speciale purché sia ​​di portata globale.
— epascarello,

1
Lo stiamo facendo mille volte al giorno. Se non ci riesci, ci deve essere un problema con first.js: controlla se è stato caricato nel tuo browser e, in caso affermativo, se si è verificato un errore di sintassi durante l'analisi (entrambi sono visibili nella barra degli strumenti dello sviluppatore del tuo browser)
— rplantiko,

2
Dovrebbe funzionare. Modifica la tua domanda per dirci cosa succede quando esegui questa operazione utilizzando la console JavaScript in Chrome o Firefox / Firebug. (Uhm, e controlla di aver digitato correttamente il nome della funzione.)
— Bob Brown,

2
Se non funziona, suppongo che tu stia facendo qualcosa di sbagliato. Date le informazioni nella tua domanda, è impossibile volerlo però.
— Felix Kling,

2
Dovrebbe il codice reale.
— epascarello,

Risposte:


164

Una funzione non può essere chiamata a meno che non sia stata definita nello stesso file o caricata prima del tentativo di chiamarla.

Una funzione non può essere chiamata a meno che non sia nello stesso o maggiore ambito di quello che sta cercando di chiamarla.

Dichiarate la funzione fn1in first.js e poi in secondo luogo potete semplicemente averefn1();

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
Qual è il modo migliore per gestire tutto ciò in un'applicazione di produzione?
— Costa

18
questo non funziona per me. Fornisce un errore che fn1 () non è definito
— Aayushi,

10
Questo non funziona anche per me. C'è qualche soluzione in giro se non l'uso di jquery getscript perché suggerisce una cattiva pratica?
— Vandolph Reyes,

14
Perché questa è la risposta accettata con 82 voti se non funziona davvero?
— Daniel,

26
Se questo non funziona per te, è probabile che tu abbia definito la funzione all'interno di qualcos'altro. Ad esempio, avevo la mia funzione all'interno di un $(document).ready(function() {...})blocco e non funzionava. L'ho spostato e ha funzionato come un fascino.
— Michael Ziluck,

23

Puoi rendere la funzione una variabile globale first.js e dare un'occhiata alla chiusura e non document.readyinserirla all'esterno

puoi usare anche ajax

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

allo stesso modo puoi usare 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
I principianti non provano mai a fare nulla del genere. Queste sono cattive pratiche da evitare. Fintanto che entrambi fanno riferimento alla pagina Web, sì. Chiamate semplicemente le funzioni come se fossero nello stesso file JS.
— Ananda,

L'unico problema è che non include l'intestazione per qualche motivo.
— Si8

21

1 ° JS:

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

2 ° JS:

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

Spero che questo aiuti ... Buona codifica.


2
Penso che intendijQuery.getScript()
— Pmpr

16

Si potrebbe prendere in considerazione l'utilizzo della sintassi di esportazione / esportazione es6. Nel file 1;

export function f1() {...}

E poi nel file 2;

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

Nota che funziona solo se lo stai utilizzando <script src="./file2.js" type="module">

Non avrai bisogno di due tag di script se lo fai in questo modo. Hai semplicemente bisogno dello script principale e puoi importare tutte le altre cose lì.


Con Safari, ottengocross-origin script load denied by cross-origin resource sharing policy
— kakyo il

Con i browser meno recenti potresti non essere in grado di utilizzare la sintassi di importazione es6. Puoi usare Babel se ti rende più semplice.
— tm2josep,

5

Dovrebbe funzionare così:

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>

produzione

Produzione.  Pulsante + Risultato

Prova questo frammento di codice: link .


4

Si noti che funziona solo se il

<script>

i tag sono nel corpo e NON nella testa.

Così

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

=> funzione sconosciuta fn1 ()

Fallisce e

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

lavori.


3

Usa la cache se il tuo server gli consente di migliorare la velocità.

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
}

E poi usalo in questo modo:

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

Facoltativamente, creane un prototipo per renderlo più flessibile. In modo che non sia necessario definire il file ogni volta, se si chiama una funzione o se si desidera recuperare il codice da più file.


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
});

Sebbene lo snippet di codice possa risolvere il problema, dovresti descrivere qual è lo scopo del tuo codice (come risolve il problema). Inoltre, potresti voler controllare stackoverflow.com/help/how-to-answer
— Ahmad F

2

dichiarare la funzione nell'ambito globale con la finestra

first.js

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

second.js

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

includere in questo modo

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

1

Questo in realtà arriverà molto tardi, ma ho pensato che avrei dovuto condividere,

in index.html

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

in 1.js

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

in 2.js

fn1()

Si prega di vedere il commento del PO sotto la domanda: "... stavo solo sperimentando [con] un file situato in una posizione sbagliata con lo stesso nome ...".
— traktor53,

1

usa "var" durante la creazione della funzione, quindi puoi accedervi da un altro file. assicurati che entrambi i file siano ben collegati al tuo progetto e possano accedervi.

file_1.js

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

accedere a questa funzione / forma variabile file file_2.js

firstLetterUppercase("gobinda");

output => Gobinda

spero che questo possa aiutare qualcuno, buona programmazione !!!



-2

Ho avuto lo stesso problema. Ho definito funzioni all'interno della funzione pronta per documenti jquery .

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

E questa funzione xyz () l' ho chiamata in un altro file. Questo non funziona :) Devi definire la funzione sopra il documento pronto .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.