2013-08-15 4 views
0

Я работаю над проектом, который содержит несколько функций, поэтому я пытаюсь организовать каждую функцию в отдельном файле JavaScript таким образом, чтобы код мог быть загружен по требованию. Я хочу стандартизировать процесс загрузки и выполнения, поэтому я пытаюсь разработать функцию, которая может загружать и выполнять файл JavaScript, если он отсутствует в памяти, или просто выполнить его, если он уже загружен. Один из подходов заключался бы в том, чтобы заставить функцию требовать два параметра, имя файла и имя функции точки входа, а затем проверить, загружен ли сценарий, если он просто выполняет функцию точки входа, или если это не так, тогда загрузить сценарий и при событии onload выполнить функцию точки входа, этот подход работает отлично, но для этого главный модуль должен знать все имена функций точки входа, которые в будущем могут стать болью в шее, поскольку небрежный программист может непреднамеренно дублирует имя функции. Более чистый и безопасный подход будет состоять в том, чтобы называть «основные» все функции точки входа, а при первом запуске ассоциировать «главный» с его объектом DOM объекта ... более или менее следующим образом:Как получить имя исполняемого файла JavaScript?

Загруженный модуль:

function(){ 
    function main(){ 
     . 
     . some code here 
     . 
    } 
    Install(getThisFileName(),main); 
}(); 

Основной модуль:

function Load(fn){ 
var el,ff,i 
    el = document.getElementsByTagName("script"); 
    ff = "http://"+window.location.host+fn; 
    for(i=el.length-1;i>=0;i--){ 
     if(el[i] && el[i].src==ff){ 
     el[i].Main(); 
     return; 
     } 
    } 
    el = document.createElement("script"); 
    el.type = "text/javascript"; 
    el.src = ff; 
} 

function Install(ff,ep){ 
var el,i; 
    el = document.getElementsByTagName("script"); 
    for(i=el.length-1;i>=0;i--){ 
     if(el[i] && el[i].src==ff){ 
     el[i].Main = ep; 
     ep(); 
     return; 
     } 
    } 
} 

Но для того, чтобы сделать это мне нужно знать имя файла JavaScript выполняется, который я не знаю, если это вообще возможно. Есть идеи?

+1

Рассмотрите возможность использования requirejs, head.js или других загрузчиков сценариев. – SLaks

+0

Я второй @ предложение SLaks. Как кто-то, кто реализовал много одноразовых загрузчиков JavaScript, могу сказать вам, что гораздо менее болезненно использовать чужую работу. –

ответ

1

Самый простой способ может быть, чтобы включили первый:

var currentFile; 
function getThisFileName() { 
    return currentFile; 
} 

И в начале каждого файла в верхней части просто сделать:

currentFile = 'thisFileName.js'; 

Это будет работать только, однако, если ваш код выполняется последовательно, как только все файлы загружаются currentFile всегда будет именем последнего файла.

И альтернативным методом было бы установить currentFile в начале каждой функции в каждом файле. Поэтому, пока эта конкретная функция доступна, вы можете позвонить по номеру getThisFileName(), и она сообщит вам о последнем запуске файла или текущем запущенном файле.

К сожалению, у вас есть немного накладных расходов на ваш код.

+0

Спасибо за идею ... возможно, вместо переменной я могу использовать литерал и избавиться от вызова функции. –

+0

Я принял вас за два шага дальше, вместо переменной я использовал литерал, поэтому нет необходимости вызывать функцию, а литерал генерируется сервером во время отправки, поэтому не будет проблем, если в будущем некоторые мудрый парень решает переименовать файлы. Это решение работает синхронно и асинхронно. Еще раз спасибо за эту идею. –

0

Ниже приведены все сценарии в виде массива.

var allScripts = document.getElementsByTagName("script"); 

Текущий файл всегда будет последним .. так allScripts[allScripts.length-1] даст вам текущий файл JavaScript. Вы можете получить доступ к атрибуту src.

EDIT: Это не будет работать для асинхронной реализации.

+0

Это не будет работать при асинхронной загрузке. – SLaks

+0

@SLaks - да, вы правы..издание – Krishna

+0

Использование глобального не будет работать; вы не знаете, какой скрипт запущен. – SLaks

0

Вы можете глобально объявить объект как:

var scripts = { 
    addScript : function(filename) { 
     scripts[filename] = { 
      loaded : true, 
      executed : false 
     } 
    } 
} 

Тогда в самом низу каждого файла вызова:

scripts.addScript('myFilename.js'); 

Затем в конце вызова выполнения скрипта:

scripts['myFilename.js'].executed = true; 

Затем в любое время вы можете проверить scripts, чтобы узнать, загружен или выполнен конкретный файл.

Смежные вопросы