이라고하지 않을 경우 통화에로드되는 다음getScript - 어떻게 만, 이미 클릭에
$.getScript('/javascripts/contacts.js');
getScript 위에서 이미로드 된 경우 내가
라는 한 문장을 쓸 수있는 방법 X을 ,로드하지 않으면 Y ...?
감사
이라고하지 않을 경우 통화에로드되는 다음getScript - 어떻게 만, 이미 클릭에
$.getScript('/javascripts/contacts.js');
getScript 위에서 이미로드 된 경우 내가
라는 한 문장을 쓸 수있는 방법 X을 ,로드하지 않으면 Y ...?
감사
var gotContacts = 0;
function getContacts(){
if (!gotContacts){
$.getScript('/javascripts/contacts.js', function() {
gotContacts = 1;
doSomethingWithContacts();
});
}else{
doSomethingWithContacts();
}
}
스크립트를 가져 오는 데 걸리는 시간에 여러 요청이 발생할 위험이있는 경우 getScript 앞에 보류중인 플래그 ('gettingContacts')를 추가하여 첫 번째 요청 만 시작되도록 할 수 있습니다. 이렇게하지 않으면 DOM에 여러 번로드되는 스크립트로 끝날 수 있습니다. – notreadbyhumans
이 작업을 수행하지 마십시오 <script>
태그를 소스 코드를로드하는 컴파일러로 취급하지 마십시오. 대신 javascript minifier을 사용하여 모든 소스 코드를 연결하고 서버를 한 번만 누르십시오.
하나의 4k 파일을로드하는 것이 네 개의 1k 파일을로드하는 것보다 좋으며, minifier가 아마 그보다 나은 작업을 수행 할 수 있습니다. 어쨌든 브라우저는이 모듈을 캐싱하고 서버 설정을 엉망으로 만들지 않는 한 옳은 일을 할 것입니다.
계속 진행하려면 Ensure 또는 Ajile 또는 Dojo 또는 JSAN과 같이로드가 많은 자바 스크립트 라이브러리를 먼저보십시오. 적어도 그러면, 당신은 바퀴를 다시 발명하지 않을 것입니다.
아직도 직접하고 싶습니까? contacts.js
이 무엇인지 확인하거나 변수를 사용하여 테스트를 완료했는지 여부를 테스트 할 수 있습니다. contacts.js
는이 같은 뭔가가있는 경우 :, 또는
if(typeof ContactsLoaded=='undefined')$.getScript('contacts.js');
를 당신은 스스로를 설정하고 로더 기능을 할 수 있습니다 :
function ContactsLoaded(){...}
당신은 할 수
function getScriptOnce(f){
var a=getScriptOnce;
if(typeof a[f]=='undefined')$.getScript(f);
a[f]=true;
}
왜 연결 요청 대신 주문형로드를 사용합니까? 말해봐, 당신은 뚱뚱한 30K (분) js 플러그인을 강화하고있다. 브라우저가 1 대 20 인 경우 해당 사용자가이 플러그인을 발견 할 수 있습니다. 미리로드해야한다고 생각하니? 주문형로드가 더 합리적이라고 생각하지 않습니까? – Jeffz
귀하의 요점은 좋은 것이지만,이 질문은 별도의 모듈을 요구하는 것입니다 (질문 하단의 주석 참조). 이는 대부분의 사용자가 대부분의 모듈을 보게된다는 것을 의미합니다. 당신이 제안하는 것은 뚱뚱한 백엔드의 폴 라이트로드로 해결할 수 있으며, 스크립트 태그를 포함시키고 평상시처럼 브라우저 캐시에 넣기 만하면됩니다. – geocar
나는 모든 도구 (concat 포함)가 직업을 염두에두고 선택되어야한다는 (모든 사람에게) 포인터를 만드는 것만으로 비판하지 않았습니다. – Jeffz
사용 require.js
을내 상황이 달랐습니다. jquery를 사용하여 div에 내용을로드하는 메뉴를 사용했습니다. 헤더 섹션에 너무 많은 스크립트가 존재하지 않도록하기 위해 링크를 호출 한 경우에만 .getscript를 사용하여 파일을로드했습니다. 중복을 막기 위해 내놓은 해결책은 다음과 같습니다.
먼저 스크립트로드를 담당하는 함수를 만듭니다. 이 내 사이트에 global.js 파일과 global.js 파일의 일부가 하드 헤더에 코드입니다 :
는var loadedScripts=new Array();
function loadScriptFiles(scriptArray){
if($.isArray(scriptArray)){
$.each(scriptArray, function(intIndex, objValue){
if($.inArray(objValue, loadedScripts) < 0){
$.getScript(objValue, function(){
loadedScripts.push(objValue);
});
}
});
}
else{
if($.inArray(script, loadedScripts) < 0){
$.getScript(script, function(){
loadedScripts.push(objValue);
});
}
}
}
이 부하의 두 가지 유형, 배열, 또는 하나의 스크립트 값 중 하나를합니다. 배열 인 경우 각 요소를 반복하고로드합니다. 배열이 아닌 경우 하나의 파일 만로드합니다. 1 분 안에 그 부분을 보게 될 것입니다.
중요 부분 : loadScripts라는 전역 범위 (함수 외부)에 배열을 만들었습니다. 이 파일은 global.js 파일의 일부이므로 다시로드되지 않고 어디서나 호출 할 수 있습니다. JQuery와 inarray 함수가 반환하기 때문에 값이 발견되지 않는 경우 경우
-1, 난 단지if($.inArray(objValue, loadedScripts) < 0){
계속 :하지만 우리의 목적을 위해, 나는 단순히로드되는 스크립트 이름을 사용하여 배열에 이미 있는지 확인 값이 0보다 작습니다.다른 값은 배열에 값이 있음을 의미합니다.
다음은 사용할 함수를 호출하는 방법입니다. 이 코드를 재생할 동적 페이지의 어느 위치 에나 배치하십시오 (맨 위에 놓습니다).
<script type="text/javascript">
var scriptArray=new Array();
scriptArray[0]="[REPLACE THIS WITH THE PATH TO THE JS FILE]";
scriptArray[1]="[REPLACE THIS WITH THE PATH TO THE JS FILE]";
loadScriptFiles(scriptArray);
</script>
제대로 완료되면 한 번만로드됩니다.
$.getScriptOnce()
과 거의 일치하는 plugin을 만들었습니다.
동일한 스크립트를 두 번 이상로드하려고 시도하면 스크립트가로드되지 않고 false가 반환됩니다.
그러나 기본적으로, 그것은 $.getScript()
(function($) {
$.getScriptOnce = function(url, successhandler) {
if ($.getScriptOnce.loaded.indexOf(url) === -1) {
$.getScriptOnce.loaded.push(url);
if (successhandler === undefined) {
return $.getScript(url);
} else {
return $.getScript(url, function(script, textStatus, jqXHR) {
successhandler(script, textStatus, jqXHR);
});
}
} else {
return false;
}
};
$.getScriptOnce.loaded = [];
}(jQuery));
의 다른 기능을 정의하고 단순히 나는 또한 같은 기능을 쓴 $.getScriptOnce('yourFile.js')
호출합니다. Firebug 또는 Chrome 개발 도구의 네트워크 탭으로 테스트 할 수 있습니다. 이것은 같은 파일을 한 번로드합니다.
콜백이 호출 된 후, 즉 파일이 성공적으로로드 된 후 함수가 파일이로드 된 것으로 가정하기 때문에 이전 두 번째 시간을 다운로드하지 않도록주의하십시오.
var getScriptOnce = (function(url, callback) {
var scriptArray = []; //array of urls
return function (url, callback) {
//the global array doesn't have such url
if (scriptArray.indexOf(url) === -1){
if (typeof callback === 'function') {
return $.getScript(url, function(script, textStatus, jqXHR) {
scriptArray.push(url);
callback(script, textStatus, jqXHR);
});
} else {
return $.getScript(url, function(){
scriptArray.push(url);
});
}
}
//the file is already there, it does nothing
//to support as of jQuery 1.5 methods .done().fail()
else{
return {
done: function() {
return {
fail: function() {}
};
}
};
}
}
}());
/*#####################################################################*/
/*#####################################################################*/
//TEST - tries to load the same jQuery file twice
var jQueryURL = "https://code.jquery.com/jquery-3.2.1.js";
console.log("Tries to load #1");
getScriptOnce(jQueryURL, function(){
console.log("Loaded successfully #1")
});
//waits 2 seconds and tries to load again
window.setTimeout(function(){
console.log("Tries to load #2");
getScriptOnce(jQueryURL, function(){
console.log("Loaded successfully #2");
});
}, 2000);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
왜 이렇게할까요? 캐싱에 대해 이야기하고 있습니까? 또는 조건부 평가에 대해 이야기하고 있습니까? 묻는 것에 대해 – geocar
감사합니다. 내 애플 리케이션이 말하는 것처럼 몇 가지 모듈이 있습니다 .. 연락처, 작업 등 ... 나는 필요한 모든 JS에로드하고 싶지 않아요. 따라서 사용자가 연락처를 클릭하면 contacts.js 파일을로드하려고하지만 클릭 한 다음 다시 연락처를 클릭하면됩니다. 나는 그것을 다시보고 싶지 않아. ? – AnApprentice
캐싱으로 인해 브라우저가 이미이 작업을 수행합니다. – geocar