일단 jqeury로 동적으로 javascript 파일을 가져오는 방법은 아래와 같이 2가지 정도 있다
// $.getScript를 이용한 방법
$.getScript('/tmp_script.js')
.done(function(script, textStatus){
// 성공시
})
.fail(function( jqxhr, settings, exception ){
// 실패시
})
// ajax를 이용한 방법
$.ajax({
url: '/tmp_script.js',
dataType: 'script',
cache: true,
success: function(jsfile_content){
// 성공시
},
error: function(xhr, status, msg){
// 실패시
}
});
하지만 여기서 알아둬야 하는 점은, 성공후에 바로 불러온 javascript파일에 포함된 함수를 쓰려고 해도 실행이 안된다는 점이다.
예를 들어 아래와 같은, tmp_script.js 파일이 있다고 하자
function test_fun(){
console.log('test_fun!!')
}
그럼 아래와 같이 코드를 구성 했을 경우, 실행이 안되는 모습을 볼 수있다.
$.getScript('/tmp_script.js')
.done(function(script, textStatus){
test_fun() // 실행안됨
})
.fail(function( jqxhr, settings, exception ){
// 실패시
})
이럴때는 아래처럼 ready 함수에 해당 함수를 넣어 두면 $.getScript로 불러온 후, 파일이 완전히 가져온 뒤에 해당 함수를 바로 실행해 주는걸 볼 수 있다.
function test_fun(){
console.log('test_fun!!')
}
$(function(){
test_fun()
})
자 그러면 여기서 마지막으로, 한번 불러온 javascript파일을 다시 불러오지 않게 하는 방식과, 새로 불러온 파일에 속한 함수들을 eval()을 쓰지 않고도 문자열을 매개로 쓰는 방식을 소개 보려고 한다.
tmp_script.js
function tmp_script_ready(){
console.log('start tmp_script~~~~~~')
}
$(function(){
// 불러온 파일을 key값으로 가지는 object전역변수에 해당 함수 객체를 넣는 부분
// 차후 불러왔는지 여부를 체크 하는데 쓰임
loaded_urls['tmp_script'] = tmp_script_ready
// 최초 불러 올때 해당 함수를 실행하는 부분
tmp_script_ready()
})
$.getScript로 불러오는 부분 소스
var loaded_urls = {}
// 이미 불러온 이력이 있는지를 확인하는 부분
function get_jsfile(js_name){
if(tmp2.indexOf(js_name) != -1){
// 이미 불러왔다면, 해당 함수만 다시 실행시킨다
loaded_urls[js_name]()
}
else{
$.getScript('/'+js_name+'.js', function(){
console.log(loaded_urls)
})
}
}
// 해당 버튼을 누를시에 파일을 새로 불러온다
$(document).on('click', '.go_action', function(){
get_jsfile('tmp_script')
})
위 소스에 대해서 간단히 설명을 해주자면, 버튼을 최초 누를때는 tmp_script.js파일에 있는 ready함수가 실행되면서, ready함수 안에 있는 tmp_script_ready()함수가 실행된다.
그리고 차후에 버튼을 다시 누를때는, loaded_urls변수에 미리 넣어놓은 함수 객체를 실행시켜서 javascript파일을 다시 불러오지 않고 해당 함수들을 object에 저장된 문자열로 구분해서 사용이 가능해진다.
//-------------- 2022.10.11 추가
css를 추가하고 싶다면, 아래와 같이 하면된다.
$("<link/>", {
rel: "stylesheet",
type: "text/css",
href: '/css_file_name.css'
}).appendTo("head");
href에 css파일 경로 및 주소를 적으면 된다.