2013-04-22 3 views
4

У меня естькак структурировать файлы javascript?

  • base.html
  • pageA.html
  • pageB.html
  • pageA.js
  • pageB.js

    1. pageA.js имеет код pageA.html, pageB.js имеет код pageB.html.
    2. как pageA.js, так и pageB.js использует jQuery.

в настоящее время я в том числе все скрипты в base.html, например, так:

<html> 
    <body> 
    <div id="contents"> 
     <!-- pageA.html/pageB.html comes here --> 
    </div> 
    <script src="js/jquery.js"></script> 
    <script src="js/pageA.js"></script> 
    <script src="js/pageB.js"></script> 
    </body> 
</html> 

Я хотел бы загрузить pageA.js только для pageA.html и pageB.js для pageB.html, как код в каждом файле не требуется на другой странице.

Я просмотрел библиотеку requires.js, но я не уверен, если это подходящее решение для моей проблемы. Каковы наилучшие методы структурирования файлов javascript в подобной ситуации?

ответ

2

Я думаю, что лучшее, что вы можете сделать, это добавить <script src="js/pageX.js"></script> в конце pageX.htmlIF загружаются динамически эта страница. Если страница не загружена динамически, она может загружаться до jquery.js и разорвать вас на javascript.

Или вы можете прочитать текущий URL и загрузить правильный сценарий на основе этой информации, как это:

var scriptPath; 
var currentPage = window.location.pathname; 

if (currentPage == "pageA.html") 
{ 
    scriptPath = "pageA.js"; 
} 
else if (currentPage == "pageB.html") 
{ 
    scriptPath = "pageB.js"; 
} 

var scriptElement = document.createElement("script"); 
scriptElement.setAttribute("type", "text/javascript"); 
scriptElement.setAttribute("src", scriptPath); 

document.getElementsByTagName("head")[0].appendChild(scriptElement); 
+1

Единственная проблема с этим подходом заключается в том, что вы должны помнить, чтобы очистить элементы сценария после каждого изменения. Если вы находитесь в ситуации, когда кто-то загружает страницу A, затем страницу B, затем снова страница A, это может вызвать конфликты. Но очень хорошая идея, если все сделано правильно! – SimonDever

+0

@Ambrosia +1, хорошая точка. Но обратите внимание, что мой первый подход такой же, как ваш (добавление тега 'script' в конце каждого html), а второй учитывает, что страница перезагрузится, но если URL-адрес изменится (без полной перезагрузки) да, может быть большой проблемой ... – NemoStein

+0

Ах да, вы собираетесь сделать всю перезагрузку, чтобы запустить это. Полагаю, что это позволит избежать конфликта. Также следует отметить, что вам нужно подождать, пока DOM полностью завершит загрузку, прежде чем вы сможете вносить изменения в содержимое в тег '', чтобы вы могли поместить его в '$ (document) .ready (function () {}); 'block. Если вы удалите скрипт, изменив src (после загрузки DOM), он удалит функции из памяти браузера или может быть конфликт? Я могу попробовать написать еще один динамический сменщик сценариев, чтобы проверить это. – SimonDever

1

У вас есть JavaScript для загрузки содержимого каждого html-файла? Если это так, и у вас есть код JavaScript для запуска один раз загружен файл можно вызвать необходимые функции установки внутри функции нагрузки, как это:

base.html

<html> 
    <head> 
     <script type="text/javascript" src="js/jquery.js"></script> 
     <script type="text/javascript" src="js/pageA.js"></script> 
     <script type="text/javascript" src="js/pageB.js"></script> 
     <script type="text/javascript"> 
      $(document).ready(function() 
      { 
       $('#loadPageA').on('click', function() 
       { 
        $('#contents').load('pageA.html', function() 
        { 
         setupPageA(); // defined in pageA.js 
        }); 
       }); 

       $('#loadPageB').on('click', function() 
       { 
        $('#contents').load('pageB.html', function() 
        { 
         setupPageB(); // defined in pageB.js 
        }); 
       }); 
      }); 
     </script> 
    </head> 
    <body> 
     <div id="contents"></div> 
     <a id="loadPageA">Load Page A</a> 
     <a id="loadPageB">Load Page B</a> 
    </body> 
<html> 

Или если вы просто хотите для запуска pageA.js когда pageA.html загружается в вас просто может включать в себя элемент сценария pageA.js в странице pageA.html сама, как это:

pageA.html:

<div id="pageAContent">Page A</div> 
<script type="text/javascript src="js/pageA.js"></script> 

pageB.html:

<div id="pageBContent">Page B</div> 
<script type="text/javascript src="js/pageB.js"></script> 

base.html:

<html> 
    <head> 
     <script type="text/javascript" src="js/jquery.js"></script> 
     <script type="text/javascript"> 
      $(document).ready(function() 
      { 
       $('#loadPageA').on('click', function() 
       { 
        $('#contents').load('pageA.html'); 
       }); 

       $('#loadPageB').on('click', function() 
       { 
        $('#contents').load('pageB.html'); 
       }); 
      }); 
     </script> 
    </head> 
    <body> 
     <div id="contents"></div> 
     <a id="loadPageA">Load Page A</a> 
     <a id="loadPageB">Load Page B</a> 
    </body> 
<html> 

Динамический сценарий SRC решение:

base.html:

<html> 
    <head> 
     <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> 
     <script type="text/javascript"> 
      function loadScript(script) 
      { 
       // Modify the existing script tag 
       if($('#dynamicScriptTag').length != 0) 
       { 
        $('#dynamicScriptTag').attr('src', script); 
       } 
       else // Create script tag 
       { 
        $('<script>').attr('type', 'text/javascript') 
           .attr('src', script) 
           .attr('id', 'dynamicScriptTag') 
           .appendTo('head'); 
       } 
      } 

      $(document).ready(function() 
      { 
       $('#loadPageA').on('click', function(event) 
       { 
        event.preventDefault(); 
        $('#contents').load('pageA.html', function() 
        { 
         loadScript('js/scriptA.js'); 
         testScriptB(); // test if we can still call a function in scriptB.js 
        }); 
       }); 

       $('#loadPageB').on('click', function(event) 
       { 
        event.preventDefault(); 
        $('#contents').load('pageB.html', function() 
        { 
         loadScript('js/scriptB.js') 
         testScriptA(); // test if we can still call a function in scriptA.js 
        }); 
       }); 
      }); 
     </script> 
    </head> 
    <body> 
     <div id="contents"></div> 
     <a id="loadPageA" href="#">Load Page A</a> 
     <a id="loadPageB" href="#">Load Page B</a> 
    </body> 
</html> 

pageA.html:

<div id="pageAContents">Page A</div> 

pageB.html:

<div id="pageBContents">Page B</div> 

JS/Scripta.ЯШИ:

console.log($('#pageAContents').text()); 
function testScriptA(){ console.log('Can still call testScriptA!'); } 

JS/scriptB.js:

console.log($('#pageBContents').text()); 
function testScriptB(){ console.log('Can still call testScriptB!'); } 
+0

Проблема с вашим первым подходом заключается в том, что весь контент 'pageA.js' и' pageB.js' будет загружен, даже если он не используется. – NemoStein

+1

Это правда, если они не большие скрипты, это не проблема. Однако эта проблема полностью устраняется во втором решении. – SimonDever

+0

Да, похоже, что как только скрипт загрузится в браузер, он останется там (предположительно, пока вы не закроете вкладку/окно). Я обновляю свой ответ с демонстрацией этого и быстрым способом изменить скрипт src, если он все еще более полезен, чем другие подходы. – SimonDever

0

Я закончил с использованием Jinja (шаблон двигателя), чтобы поместить JavaScript файлы, такие как следующие:

base.html

<html> 
    <body> 
    <div id="contents"> 
     {% block contents %} 
     {% endblock %} 
    </div> 
    <script src="js/jquery.js"></script> 
     {% block scripts %}  
     {% endblock %}  
    </body> 
</html> 

pageA.html

{% block contents %} 
    ..page A contents.. 
{% endblock %} 
{% block scripts %} 
<script src="js/pageA.js"></script> 
{% endblock %} 

Если вы используете движок шаблонов, это может быть жизнеспособным решением.

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