Любой способ сделать условно в том числе и в JavaScript? - PullRequest
1 голос
/ 01 августа 2011

Мы разрабатываем портал с большим количеством портлетов (независимое приложение на странице / портале). Каждый портлет должен быть независимым: он должен иметь возможность запускаться на отдельной странице внутри портала.

Нас просили не добавлять тонны файлов javascript на базовую страницу портала (ту, которая вызывает все). Он также поставляется с dojo (но никто не использует его).

Есть ли способ загрузить файлы javascript (включая jQuery, иначе это не может быть решением) , если они еще не загружены? В ответе можно использовать dojo

Прямо сейчас мы думаем о

if (!window.jQuery) {            
        document.write('<script src="/Scripts/jquery-1.5.1.min.js" type="text/javascript"><' + '/script>');
}
if (!window.jQuery.ui) {
        document.write('<script src="/Scripts/jquery-ui-1.8.11.min.js" type="text/javascript"></scr' + 'ipt>');
}
[...] other includes 

Проблема в том, что jquery не загружается при завершении теста jQuery.ui, поэтому выдается ошибка, и 2-й файл не загружается.

Редактировать

Переписывание проблемы: Проблема в том, что у нас может быть 4 портлета, каждый из которых требует jQuery + jQuery-ui + разные другие плагины / файлы. Поэтому им необходимо все включить код для загрузки всех этих файлов независимо. Но мы не хотим загружать jQuery и jQuery-ui 4 раза либо .

Ответы [ 5 ]

2 голосов
/ 26 августа 2011

Решением этой проблемы является использование отдельных блоков скриптов. Очевидно, document.write не будет влиять на загрузку скриптов, пока блок скриптов не закроется. То есть попробуйте это:

<script>
    if (!window.jQuery) {
        document.write('<script src="/Scripts/jquery-1.5.1.min.js" type="text/javascript"><' + '/script>');
    }
</script>
<script>
    if (!window.jQuery.ui) {
        document.write('<script src="/Scripts/jquery-ui-1.8.11.min.js" type="text/javascript"></scr' + 'ipt>');
    } 
</script>

У меня работает. Протестировано в IE и Firefox.

0 голосов
/ 16 августа 2011

Pyramid - это библиотека зависимостей, которая хорошо справляется с этой ситуацией. По сути, вы можете определить свои зависимости (в данном случае библиотеки javascript) в файле dependencyLoader.js, а затем использовать Pyramid для загрузки соответствующих зависимостей. Обратите внимание, что он загружает зависимости только один раз (поэтому вам не нужно беспокоиться о дубликатах). Вы можете сохранить свои зависимости в одном файле, а затем загружать их динамически по мере необходимости. Вот пример кода.

Файл: dependencyLoader.js

//Set up file dependencies
Pyramid.newDependency({
    name: 'standard',
    files: [
    'standardResources/jquery.1.6.1.min.js'
     //other standard libraries
    ]
});

Pyramid.newDependency({
name:'core',
files: [
    'styles.css',
    'customStyles.css',
    'applyStyles.js',
    'core.js'
    ],
   dependencies: ['standard']
});


Pyramid.newDependency({
name:'portal1',
files: [
    'portal1.js',
    'portal1.css'
    ],
    dependencies: ['core']
});

Pyramid.newDependency ({ Название: 'portal2', файлы: [ 'Portal2.js', 'Portal2.css' ], зависимости: ['core'] }); HTML-файлы

<head>
    <script src="standardResources/pyramid-1.0.1.js"></script>
    <script src="dependencyLoader.js"></script>
</head>

...
    <script type="text/javascript">
        Pyramid.load('portal1');
    </script>
...
    <script type="text/javascript">
        Pyramid.load('portal2');
    </script>

Таким образом, общие файлы загружаются только один раз. И вы можете выбрать, как вы загружаете свои зависимости. Вы также можете просто определить дополнительную группу зависимостей, такую ​​как

Pyramid.newDependency({
name:'loadAll',
    dependencies: ['portal1','portal2']
});

А в html просто загрузите все зависимости сразу.

<head>
    <script src="standardResources/pyramid-1.0.1.js"></script>
    <script src="dependencyLoader.js"></script>
    <script type="text/javascript">
        Pyramid.load('loadAll');
    </script>
</head>

Некоторые другие функции, которые также могут помочь, это то, что он может обрабатывать файлы других типов (например, css), а также может объединять ваши отдельные файлы разработки в один файл, когда он готов к выпуску. Проверьте детали здесь - Pyramid Docs

примечание: я предвзят, так как работал над Пирамидой .

0 голосов
/ 01 августа 2011

Немного неправильно прочитал вопрос (может и не может выглядеть очень похоже).

Если вы хотите использовать другую библиотеку для обработки, здесь есть несколько хороших ответов.

асинхронная загрузка файлов js и других зависимых файлов js

0 голосов
/ 02 августа 2011

Просто напишите свои собственные модули (в формате Dojo, который с версии 1.6 теперь перешел на стандартный формат асинхронной загрузки AMD) и dojo.require (или require) их при загрузке портлета.

Хорошая вещь в этом заключается в том, что модуль всегда будет загружаться только один раз (даже если тип портлета загружается несколько раз), и только в первом случае это необходимо - dojo.require (или require) всегда сначалапроверяет, загружен ли модуль и ничего не будет делать, если он есть.Кроме того, Dojo гарантирует, что все зависимости также автоматически загружаются и выполняются перед модулем.У вас может быть очень сложное дерево зависимостей, и Dojo сделает все за вас, не отрывая пальца.

Это очень стандартная инфраструктура Dojo.Затем весь инструментарий Dojo создается поверх него, и вы также можете использовать его для создания своих собственных модулей.Фактически, Dojo рекомендует вам разбить ваше приложение на управляемые куски (мое мнение, чем меньше, тем лучше) и динамически загружать их при необходимости.Кроме того, используйте поддержку класса hierachies и mixins.Существует множество внутриструктур Dojo, позволяющих вам сделать именно это.

Вы также должны организовать свои классы / модули по пространствам имен для максимальной управляемости.На мой взгляд, этот тип огромных веб-приложений корпоративного уровня - это то, где Dojo действительно сияет по сравнению с другими библиотеками, такими как jQuery.Обычно вам не нужна такая инфраструктура для нескольких быстрых и грязных веб-страниц с некоторыми анимациями, но вы действительно цените это при создании сложных и огромных приложений.

Например, стиль до 1.6:

portletA.js:

dojo.provide("myNameSpace.portletA.class1");
dojo.declare("myNameSpace.portletA.class1", myNameSpace.portletBase.baseClass, function() { ...
});

main.js:

dojo.require("myNameSpace.portletA.class1");
var myClass1 = new myNameSpace.portletA.class1(/* Arguments */);

Стиль Post-1.6:

portletA.js:

define("myNameSpace/portletA/class1", "myNameSpace/portletBase/baseClass", function(baseClass) { ...
    return dojo.declare(baseClass, function() {
    });
});

main.js:

var class1 = require("myNameSpace/portletA/class1");
var myClass1 = new class1(/* Arguments */);
0 голосов
/ 01 августа 2011

Я всегда вводил js-файлы с помощью js DOM-манипуляции

if (typeof jQuery == 'undefined') {
    var DOMHead = document.getElementsByTagName("head")[0];
    var DOMScript = document.createElement("script");
    DOMScript.type = "text/javascript";
    DOMScript.src = "http://code.jquery.com/jquery.min.js";
    DOMHead.appendChild(DOMScript);
}

, но это немного требовательно и может работать не во всех ситуациях

...