Это трудно сделать при просмотре MAC, поскольку он не имеет доступа к функциям Windows, которые могут помочь очистить экран. Мое лучшее исправление заключается в цикле и добавлении строк до тех пор, пока терминал не станет ясным, а затем запустите программу. Однако это не так эффективно или полезно для памяти, если вы используете это прежде всего и часто.
void clearScreen () {int clear = 5; do {cout & lt; епсИ; clear - = 1; } while (clear! = 0); }
Техника, которую мы используем на работе, - это запросить файл javascript, используя запрос AJAX, а затем eval () return. Если вы используете библиотеку прототипов, они поддерживают эту функцию в своем вызове Ajax.Request.
Существуют сценарии, специально разработанные для этой цели.
yepnope.js встроен в Modernizr, а lab.js - это больше оптимизированная (но менее удобная для пользователя версия.
Я бы не рекомендовал делать это через большую библиотеку, такую как jquery или прототип, потому что одним из основных преимуществ загрузчика сценариев является возможность загрузки скриптов раньше - вы не нужно ждать, пока jquery & amp; все ваши элементы dom загрузятся до запуска проверки, чтобы увидеть, хотите ли вы динамически загружать скрипт.
Вот пример кода, который я нашел ... у кого-то есть лучший способ?
function include(url)
{
var s = document.createElement("script");
s.setAttribute("type", "text/javascript");
s.setAttribute("src", url);
var nodes = document.getElementsByTagName("*");
var node = nodes[nodes.length -1].parentNode;
node.appendChild(s);
}
http://web.archive.org/web/20140905044059/http://www.howtocreate.co.uk/operaStuff/userjs/aagmfunctions.js
) i>
– user2284570
14 September 2014 в 03:32
Я потерялся во всех этих образцах, но сегодня мне нужно было загрузить внешний .js из моего основного .js, и я сделал это:
document.write("<script src='https://www.google.com/recaptcha/api.js'></script>");
Существует новый предложенный стандарт ECMA под названием dynamic import , недавно включенный в Chrome и Safari.
const moduleSpecifier = './dir/someModule.js';
import(moduleSpecifier)
.then(someModule => someModule.foo()); // executes foo method in someModule
Я знаю, что мой ответ немного запоздал для этого вопроса, но вот замечательная статья на www.html5rocks.com - Глубокое погружение в мутные воды загрузки скрипта .
В этой статье делается вывод о том, что в отношении поддержки браузера лучший способ динамически загружать файл JavaScript без блокировки рендеринга содержимого выглядит следующим образом:
Учитывая, что у вас есть четыре сценария с именем script1.js, script2.js, script3.js, script4.js
, тогда вы можете сделать это с помощью async = false:
[
'script1.js',
'script2.js',
'script3.js',
'script4.js'
].forEach(function(src) {
var script = document.createElement('script');
script.src = src;
script.async = false;
document.head.appendChild(script);
});
Теперь Spec говорит: загрузите вместе, выполните в порядке, как только все будет загружено.
Firefox & lt; 3.6, Opera говорит: я понятия не имею, что это за «асинхронная» вещь, но так бывает, я выполняю скрипты, добавленные через JS, в том порядке, в котором они добавлены.
Safari 5.0 говорит: «Я понимаю», async ", но не понимают, что он устанавливает значение" false "с помощью JS. Я буду выполнять ваши скрипты, как только они приземлятся, в любом порядке.
IE & lt; 10 говорит: «Не знаю, как« асинхронно », но есть обходной путь с использованием« onreadystatechange ».
Все остальное говорит:« Я твой друг, мы сделаем это по книге ».
Теперь полный код с IE & lt; 10:
var scripts = [
'script1.js',
'script2.js',
'script3.js',
'script4.js'
];
var src;
var script;
var pendingScripts = [];
var firstScript = document.scripts[0];
// Watch scripts load in IE
function stateChange() {
// Execute as many scripts in order as we can
var pendingScript;
while (pendingScripts[0] && pendingScripts[0].readyState == 'loaded') {
pendingScript = pendingScripts.shift();
// avoid future loading events from this script (eg, if src changes)
pendingScript.onreadystatechange = null;
// can't just appendChild, old IE bug if element isn't closed
firstScript.parentNode.insertBefore(pendingScript, firstScript);
}
}
// loop through our script urls
while (src = scripts.shift()) {
if ('async' in firstScript) { // modern browsers
script = document.createElement('script');
script.async = false;
script.src = src;
document.head.appendChild(script);
}
else if (firstScript.readyState) { // IE<10
// create a script and add it to our todo pile
script = document.createElement('script');
pendingScripts.push(script);
// listen for state changes
script.onreadystatechange = stateChange;
// must set src AFTER adding onreadystatechange listener
// else we’ll miss the loaded event for cached scripts
script.src = src;
}
else { // fall back to defer
document.write('<script src="' + src + '" defer></'+'script>');
}
}
Несколько трюков и миниатюр позже, это 362 байта
!function(e,t,r){function n(){for(;d[0]&&"loaded"==d[0][f];)c=d.shift(),c[o]=!i.parentNode.insertBefore(c,i)}for(var s,a,c,d=[],i=e.scripts[0],o="onreadystatechange",f="readyState";s=r.shift();)a=e.createElement(t),"async"in i?(a.async=!1,e.head.appendChild(a)):i[f]?(d.push(a),a[o]=n):e.write("<"+t+' src="'+s+'" defer></'+t+">"),a.src=s}(document,"script",[
"//other-domain.com/1.js",
"2.js"
])
Недавно я использовал гораздо менее сложную версию с jQuery :
<script src="scripts/jquery.js"></script>
<script>
var js = ["scripts/jquery.dimensions.js", "scripts/shadedborder.js", "scripts/jqmodal.js", "scripts/main.js"];
var $head = $("head");
for (var i = 0; i < js.length; i++) {
$head.append("<script src=\"" + js[i] + "\"></scr" + "ipt>");
}
</script>
Он отлично работал в каждом браузере, в котором я тестировал его: IE6 / 7, Firefox, Safari, Opera.
Обновление: версия jQuery-less:
<script>
var js = ["scripts/jquery.dimensions.js", "scripts/shadedborder.js", "scripts/jqmodal.js", "scripts/main.js"];
for (var i = 0, l = js.length; i < l; i++) {
document.getElementsByTagName("head")[0].innerHTML += ("<script src=\"" + js[i] + "\"></scr" + "ipt>");
}
</script>
$.getScript
. См. Мой ответ.
– Muhd
13 February 2012 в 22:39
еще один удивительный ответ
$.getScript("my_lovely_script.js", function(){
alert("Script loaded and executed.");
// here you can use anything you defined in the loaded script
});
http://web.archive.org/web/20140905044059/http://www.howtocreate.co.uk/operaStuff/userjs/aagmfunctions.js
) i>
– user2284570
14 September 2014 в 03:32
все основные библиотеки javascript, такие как jscript, prototype, YUI, поддерживают загрузку файлов сценариев. Например, в YUI после загрузки ядра вы можете сделать следующее, чтобы загрузить элемент управления календарем
var loader = new YAHOO.util.YUILoader({
require: ['calendar'], // what components?
base: '../../build/',//where do they live?
//filter: "DEBUG", //use debug versions (or apply some
//some other filter?
//loadOptional: true, //load all optional dependencies?
//onSuccess is the function that YUI Loader
//should call when all components are successfully loaded.
onSuccess: function() {
//Once the YUI Calendar Control and dependencies are on
//the page, we'll verify that our target container is
//available in the DOM and then instantiate a default
//calendar into it:
YAHOO.util.Event.onAvailable("calendar_container", function() {
var myCal = new YAHOO.widget.Calendar("mycal_id", "calendar_container");
myCal.render();
})
},
// should a failure occur, the onFailure function will be executed
onFailure: function(o) {
alert("error: " + YAHOO.lang.dump(o));
}
});
// Calculate the dependency and insert the required scripts and css resources
// into the document
loader.insert();
Здесь является простой с обратным вызовом и поддержкой IE:
function loadScript(url, callback) {
var script = document.createElement("script")
script.type = "text/javascript";
if (script.readyState) { //IE
script.onreadystatechange = function () {
if (script.readyState == "loaded" || script.readyState == "complete") {
script.onreadystatechange = null;
callback();
}
};
} else { //Others
script.onload = function () {
callback();
};
}
script.src = url;
document.getElementsByTagName("head")[0].appendChild(script);
}
loadScript("https://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js", function () {
//jQuery loaded
console.log('jquery loaded');
});
Что-то вроде этого ...
<script>
$(document).ready(function() {
$('body').append('<script src="https://maps.googleapis.com/maps/api/js?key=KEY&libraries=places&callback=getCurrentPickupLocation" async defer><\/script>');
});
</script>
jquery разрешил это для меня с помощью функции .append () - использовал это, чтобы загрузить полный пакет jquery ui
/*
* FILENAME : project.library.js
* USAGE : loads any javascript library
*/
var dirPath = "../js/";
var library = ["functions.js","swfobject.js","jquery.jeditable.mini.js","jquery-ui-1.8.8.custom.min.js","ui/jquery.ui.core.min.js","ui/jquery.ui.widget.min.js","ui/jquery.ui.position.min.js","ui/jquery.ui.button.min.js","ui/jquery.ui.mouse.min.js","ui/jquery.ui.dialog.min.js","ui/jquery.effects.core.min.js","ui/jquery.effects.blind.min.js","ui/jquery.effects.fade.min.js","ui/jquery.effects.slide.min.js","ui/jquery.effects.transfer.min.js"];
for(var script in library){
$('head').append('<script type="text/javascript" src="' + dirPath + library[script] + '"></script>');
}
To Use - в начале вашего html / php / etc после вас import jquery.js, вы просто включили бы этот один файл, чтобы он загрузился во всей библиотеке, добавив его в голову ...
<script type="text/javascript" src="project.library.js"></script>
Вот простой пример для загрузки JS-файлов. Соответствующие точки:
$.ajax
или $.getScript
, вы можете использовать nonces, решая таким образом, проблемы с CSP unsafe-inline
. Просто используйте свойство script.nonce
var getScriptOnce = function() {
var scriptArray = []; //array of urls (closure)
//function to defer loading of script
return function (url, callback){
//the array doesn't have such url
if (scriptArray.indexOf(url) === -1){
var script=document.createElement('script');
script.src=url;
var head=document.getElementsByTagName('head')[0],
done=false;
script.onload=script.onreadystatechange = function(){
if ( !done && (!this.readyState || this.readyState == 'loaded' || this.readyState == 'complete') ) {
done=true;
if (typeof callback === 'function') {
callback();
}
script.onload = script.onreadystatechange = null;
head.removeChild(script);
scriptArray.push(url);
}
};
head.appendChild(script);
}
};
}();
Теперь вы используете его просто через
getScriptOnce("url_of_your_JS_file.js");
У кого-нибудь есть лучший способ?
blockquote>Я думаю, что просто добавить сценарий в тело было бы проще, а затем добавить его к последнему узлу на странице. Как насчет этого:
function include(url) { var s = document.createElement("script"); s.setAttribute("type", "text/javascript"); s.setAttribute("src", url); document.body.appendChild(s); }
http://web.archive.org/web/20140905044059/http://www.howtocreate.co.uk/operaStuff/userjs/aagmfunctions.js
) i>
– user2284570
14 September 2014 в 03:34
Просто узнал о замечательной функции в YUI 3 (на момент написания, доступной в предварительном выпуске). Вы можете легко вставлять зависимости в библиотеки YUI и «внешние» модули (что вы ищете) без особого кода: YUI Loader .
Он также отвечает на ваш второй вопрос относительно функция, вызываемая, как только загружается внешний модуль.
Пример:
YUI({
modules: {
'simple': {
fullpath: "http://example.com/public/js/simple.js"
},
'complicated': {
fullpath: "http://example.com/public/js/complicated.js"
requires: ['simple'] // <-- dependency to 'simple' module
}
},
timeout: 10000
}).use('complicated', function(Y, result) {
// called as soon as 'complicated' is loaded
if (!result.success) {
// loading failed, or timeout
handleError(result.msg);
} else {
// call a function that needs 'complicated'
doSomethingComplicated(...);
}
});
Отлично работает для меня и имеет преимущество управления зависимостями. Обратитесь к документации YUI для примера с календарем YUI 2 .
В javascript нет импорта / include / require, но есть два основных способа достижения того, что вы хотите:
1 - Вы можете загрузить его с помощью вызова AJAX, а затем использовать eval.
Это самый простой способ, но он ограничен вашим доменом из-за настроек безопасности Javascript, и использование eval открывает дверь для ошибок и хаков.
2 - Добавьте тег сценария с URL сценария в HTML.
Определенно лучший способ. Вы можете загрузить сценарий даже с внешнего сервера, и он чист, поскольку вы используете анализатор браузера для оценки кода. Вы можете поместить тег в начало веб-страницы или в нижней части тела.
Оба этих решения обсуждаются и проиллюстрированы здесь.
Теперь есть большой вопрос, о котором вы должны знать. Это означает, что вы дистанционно загружаете код.
Это означает, что если вы используете эти трюки напрямую, вы не сможете использовать недавно загруженный файл, и он будет выполнять ваш текущий скрипт, потому что он загружает все асинхронно. введите следующую строку после того, как вы попросите ее загрузить, потому что она будет по-прежнему загружаться.
EG: my_lovely_script.js содержит MySuperObject
var js = document.createElement("script");
js.type = "text/javascript";
js.src = jsFilePath;
document.body.appendChild(js);
var s = new MySuperObject();
Error : MySuperObject is undefined
Затем вы перезагружаете страницу нажатием F5 , И это работает! Смущает ...
Итак, что с этим делать?
Ну, вы можете использовать взломанный автор, предлагаемый в ссылке, которую я вам дал. Итак, для людей, которые спешат, он использует en event для запуска функции обратного вызова при загрузке сценария. Таким образом, вы можете поместить весь код с помощью удаленной библиотеки в функцию обратного вызова. EG:
function loadScript(url, callback)
{
// adding the script tag to the head as suggested before
var head = document.getElementsByTagName('head')[0];
var script = document.createElement('script');
script.type = 'text/javascript';
script.src = url;
// then bind the event to the callback function
// there are several events for cross browser compatibility
script.onreadystatechange = callback;
script.onload = callback;
// fire the loading
head.appendChild(script);
}
Затем вы пишете код, который хотите использовать ПОСЛЕ того, как скрипт загружается в лямбда-функцию:
var myPrettyCode = function() {
// here, do what ever you want
};
Затем вы запускаете все это:
loadScript("my_lovely_script.js", myPrettyCode);
Хорошо, я понял. Но это боль, чтобы написать все это.
Ну, в этом случае вы можете использовать как всегда фантастическую бесплатную фреймворк jQuery, которая позволяет делать то же самое в одной строке:
$.getScript("my_lovely_script.js", function() {
alert("Script loaded and executed.");
// here you can use anything you defined in the loaded script
});
http://web.archive.org/web/20140905044059/http://www.howtocreate.co.uk/operaStuff/userjs/aagmfunctions.js
) i>
– user2284570
14 September 2014 в 03:28
Если у вас уже загружен jQuery, вы должны использовать $. getScript .
Это имеет преимущество перед другими ответами здесь, поскольку у вас есть встроенная функция обратного вызова (чтобы гарантировать загрузку скрипта до запуска зависимого кода), и вы можете контролировать кеширование.
Я использовал еще одно решение, которое я нашел в сети ... этот находится под creativecommons, и он проверяет, был ли источник включен до вызова функции ...
вы можете найти файл здесь: include.js
/** include - including .js files from JS - bfults@gmail.com - 2005-02-09
** Code licensed under Creative Commons Attribution-ShareAlike License
** http://creativecommons.org/licenses/by-sa/2.0/
**/
var hIncludes = null;
function include(sURI)
{
if (document.getElementsByTagName)
{
if (!hIncludes)
{
hIncludes = {};
var cScripts = document.getElementsByTagName("script");
for (var i=0,len=cScripts.length; i < len; i++)
if (cScripts[i].src) hIncludes[cScripts[i].src] = true;
}
if (!hIncludes[sURI])
{
var oNew = document.createElement("script");
oNew.type = "text/javascript";
oNew.src = sURI;
hIncludes[sURI]=true;
document.getElementsByTagName("head")[0].appendChild(oNew);
}
}
}
http://web.archive.org/web/20140905044059/http://www.howtocreate.co.uk/operaStuff/userjs/aagmfunctions.js
) i>
– user2284570
14 September 2014 в 03:33
Я делал в основном то же самое, что и Адам, но с небольшими изменениями, чтобы убедиться, что я добавляю к главному тегу, чтобы выполнить работу. Я просто создал функцию include (код ниже) для обработки как файлов сценариев, так и css.
Эта функция также проверяет, чтобы файл сценария или CSS еще не был загружен динамически. Он не проверяет значения, закодированные вручную, и, возможно, был лучший способ сделать это, но он служил цели.
function include( url, type ){
// First make sure it hasn't been loaded by something else.
if( Array.contains( includedFile, url ) )
return;
// Determine the MIME-type
var jsExpr = new RegExp( "js$", "i" );
var cssExpr = new RegExp( "css$", "i" );
if( type == null )
if( jsExpr.test( url ) )
type = 'text/javascript';
else if( cssExpr.test( url ) )
type = 'text/css';
// Create the appropriate element.
var tag = null;
switch( type ){
case 'text/javascript' :
tag = document.createElement( 'script' );
tag.type = type;
tag.src = url;
break;
case 'text/css' :
tag = document.createElement( 'link' );
tag.rel = 'stylesheet';
tag.type = type;
tag.href = url;
break;
}
// Insert it to the <head> and the array to ensure it is not
// loaded again.
document.getElementsByTagName("head")[0].appendChild( tag );
Array.add( includedFile, url );
}
Если вы хотите загрузить скрипт SYNC, вам нужно добавить текст скрипта непосредственно в HTML HEAD-тег. Добавление этого параметра приведет к загрузке ASYNC. Чтобы синхронно загружать текст сценария из внешнего файла, используйте XHR. Ниже быстрого примера (в этом и других сообщениях используются части других ответов):
/*sample requires an additional method for array prototype:*/
if (Array.prototype.contains === undefined) {
Array.prototype.contains = function (obj) {
var i = this.length;
while (i--) { if (this[i] === obj) return true; }
return false;
};
};
/*define object that will wrap our logic*/
var ScriptLoader = {
LoadedFiles: [],
LoadFile: function (url) {
var self = this;
if (this.LoadedFiles.contains(url)) return;
var xhr = new XMLHttpRequest();
xhr.onload = function () {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
self.LoadedFiles.push(url);
self.AddScript(xhr.responseText);
} else {
if (console) console.error(xhr.statusText);
}
}
};
xhr.open("GET", url, false);/*last parameter defines if call is async or not*/
xhr.send(null);
},
AddScript: function (code) {
var oNew = document.createElement("script");
oNew.type = "text/javascript";
oNew.textContent = code;
document.getElementsByTagName("head")[0].appendChild(oNew);
}
};
/*Load script file. ScriptLoader will check if you try to load a file that has already been loaded (this check might be better, but I'm lazy).*/
ScriptLoader.LoadFile("Scripts/jquery-2.0.1.min.js");
ScriptLoader.LoadFile("Scripts/jquery-2.0.1.min.js");
/*this will be executed right after upper lines. It requires jquery to execute. It requires a HTML input with id "tb1"*/
$(function () { alert($('#tb1').val()); });
Держите это красивым, коротким, простым и удобным! :]
// 3rd party plugins / script (don't forget the full path is necessary)
var FULL_PATH = '', s =
[
FULL_PATH + 'plugins/script.js' // Script example
FULL_PATH + 'plugins/jquery.1.2.js', // jQuery Library
FULL_PATH + 'plugins/crypto-js/hmac-sha1.js', // CryptoJS
FULL_PATH + 'plugins/crypto-js/enc-base64-min.js' // CryptoJS
];
function load(url)
{
var ajax = new XMLHttpRequest();
ajax.open('GET', url, false);
ajax.onreadystatechange = function ()
{
var script = ajax.response || ajax.responseText;
if (ajax.readyState === 4)
{
switch(ajax.status)
{
case 200:
eval.apply( window, [script] );
console.log("library loaded: ", url);
break;
default:
console.log("ERROR: library not loaded: ", url);
}
}
};
ajax.send(null);
}
// initialize a single load
load('plugins/script.js');
// initialize a full load of scripts
if (s.length > 0)
{
for (i = 0; i < s.length; i++)
{
load(s[i]);
}
}
Этот код является просто небольшим функциональным примером, который мог бы потребовать дополнительных функциональных возможностей для полной поддержки на любой (или заданной) платформе.