Як динамічно вставити тег <script> через jQuery після завантаження сторінки?


101

У мене виникають проблеми з налагодженням цієї роботи. Спершу я спробував встановити свої теги сценарію як рядки, а потім за допомогою jquery substituWith () додати їх до документа після завантаження сторінки:

var a = '<script type="text/javascript">some script here</script>';
$('#someelement').replaceWith(a);

Але я отримав рядкові буквальні помилки на цьому варі. Потім я спробував кодувати рядок на зразок:

var a = '&left;script type="text/javascript"&gt;some script here&lt;\/script&gt;';

але надіславши це replaceWith()виводить саме цей рядок до браузера.

Чи може хтось, будь ласка, дозволити мені знати, як би ви рухалися про динамічне додавання <script>тегу до браузера після завантаження сторінки, в ідеалі через jQuery?


Чи можете ви пояснити, чого ви намагаєтеся досягти, додавши <script>тег до документа?
Pointy

@ Ракетна відповідь найкраща, але якщо ви напевно хочете додати вбудований скрипт із рядка, то ви просто передасте його eval()функції. Але використання eval()майже завжди говорить про те, що є кращий спосіб робити те, що ви намагаєтеся зробити.
Нік

ми намагаємось відкласти завантаження сторонніх оголошень до кінця сторінки. ці оголошення дзвонять через 2 теги сценарію, тому я хотів запустити функцію після завантаження сторінки, яка динамічно їх запускає.
Даг

2
Не всі сторонні сценарії призначені для відкладу. Якщо використання скриптів , document.writeі ви називаєте його після завантаження сторінки він знищить сторінку.
bobince

1
Чому б не імпортувати ці теги в <iframe>елементах? Ви можете відкласти налаштування <iframe>URL-адреси, поки не будете готові.
Pointy

Відповіді:


103

Ви можете помістити скрипт в окремий файл, а потім використовувати $.getScriptдля завантаження та запуску.

Приклад:

$.getScript("test.js", function(){
    alert("Running test.js");
});

2
спасибі, але чи це вкладе його у DOM? Я розумію, що я залишив важливу інформацію про те, що мені потрібен тег сценарію, який потрібно вставити в DOM, оцінити, і в цей момент він повертає сторонній код оголошення для відображення на нашому сайті в конкретному <div>.
Даг

1
$.getScriptпросто завантажить .js файл через AJAX і виконає його. Сценарій не повинен бути в домені, щоб мати доступ до діва на вашій сторінці.
Ракета Хазмат

6
Але зі $.getScript()сценарієм потрібно буде знаходитися на одному домені або або віддалений домен, і браузер повинен буде підтримувати CORS.
hippietrail

14
@hippietrail Це насправді не так. Він просто вставляє простий тег сценарію ol, який не вимагає CORS або того ж домену. Я використовую це, наприклад, для скорочення коду для завантаження Google Analytics, і він завантажується просто. За лаштунками власне код jquery, який працює, насправді схожий на фрагмент GA.
Кріс Москіні

39
Оскільки відповідь від @hippietrail приверне найбільше уваги своїми 4 оновленнями, слід чітко зрозуміти, що він неправильний. Як підкреслюють у своїх $.ajaxпримітках документи jQuery : "На запити сценарію та JSONP не застосовуються однакові обмеження щодо політики походження". джерело . Іншими словами, ви $.getScriptможете перетягувати .js файли з інших доменів, а не лише з вашого власного .
EleventyOne

64

Спробуйте наступне:

<script type="text/javascript">
// Use any event to append the code
$(document).ready(function() 
{
    var s = document.createElement("script");
    s.type = "text/javascript";
    s.src = "http://scriptlocation/das.js";
    // Use any selector
    $("head").append(s);
});

http://api.jquery.com/append


4
+1 для використання appendдля додавання сценарію. Додайте причини навіть вбудований сценарій, щоб негайно оцінити (саме те, що мені потрібно). Дякую
Пройшов кодування

1
Зрештою, в IE8 / 9 при такому підході виникає багато проблем. А саме помилки переповнення стека. Я вдався до методу $ .getScript () нижче, щоб провести цю роботу на всій основі.
zmonteca

1
Так @jcoffland це було написано в жовтні 2010 року :)
Бассем

Якщо сторінка, що містить цей код, завантажується за допомогою AJAX, браузер викине попередження "Синхронний XMLHttpRequest на основний потік застарілий через його згубний вплив на досвід кінцевого користувача".
Райджекар Редді

@Reddy Чудовий коментар. Це було розміщено в жовтні 2010 року, я впевнений, що на даний момент цей метод вже не є дійсним / рекомендованим підходом, користувачі повинні діяти на власний розсуд.
Бассем

34

Ось правильний спосіб зробити це з сучасним (2014) JQuery:

$(function () {
  $('<script>')
    .attr('type', 'text/javascript')
    .text('some script here')
    .appendTo('head');
})

або якщо ви дійсно хочете замінити div, ви можете зробити:

$(function () {
  $('<script>')
    .attr('type', 'text/javascript')
    .text('some script here')
    .replaceAll('#someelement');
});

3
Або замість .text ("якийсь сценарій тут") ви можете написати .attr ('src', 'path_to_your_js_file')
Сергій Максимчук

11

Більш простий спосіб:

$('head').append('<script type="text/javascript" src="your.js"></script>');

Ви також можете використовувати цю форму для завантаження css.


6
Ви можете захотіти , щоб уникнути введення рядка </script>в джерелі , хоча , так як це може викликати проблеми при розборі: stackoverflow.com/questions/236073 / ...
ix3

2
тікаючи останній, /зробив для мене трюк:$('head').append('<script src="your.js"><\/script>');
jerik

5

Ця технічна відповідь є технічно подібною або рівною тому, що відповів jcoffland. Я щойно додав запит, щоб визначити, сценарій вже присутній чи ні. Мені це потрібно, тому що я працюю на веб-сайті інтрамережі з парою модулів, з яких деякі діляться сценаріями або приносять свої, але ці сценарії не потрібно завантажувати знову. Я використовую цей фрагмент вже більше року у виробничих умовах, він працює як принадність. Коментуючи собі: Так, я знаю, було б правильніше запитати, чи існує функція ... :-)

if (!$('head > script[src="js/jquery.searchable.min.js"]').length) {
    $('head').append($('<script />').attr('src','js/jquery.searchable.min.js'));
}

btw. Я роблю те саме з таблицями стилів: if (! $ ('Head> link [href = "widgets / css / widgets.css"] "). Length) {$ (' head '). Append ($ (' <link / > '). attr (' rel ',' stylesheet '). attr (' href ',' widgets / css / widgets.css '))}}
ddlab

2

Є одне вирішення, яке звучить більше як хак, і я погоджуюся, що це не найелегантніший спосіб зробити це, але працює на 100%:

Скажіть, ваша відповідь AJAX щось подібне

<b>some html</b>
<script>alert("and some javscript")

Зауважте, що я спеціально пропустив тег закриття. Потім у сценарії, що завантажує вище, виконайте наступне:

$.ajax({
    url: "path/to/return/the-above-js+html.php",
    success: function(newhtml){
        newhtml += "<";
        newhtml += "/script>";
        $("head").append(newhtml);
    }
});

Тільки не запитуйте мене, чому :-) Це одна з тих речей, до яких я потрапив у результаті відчайдушних майже випадкових випробувань та невдач.

У мене немає повних пропозицій щодо того, як це працює, але що цікаво, він НЕ буде працювати, якщо ви додасте завершальний тег в один рядок.

У такі часи я відчуваю, що успішно ділиться на нуль.


3
Він не працюватиме, якщо тег скрипту, що закривається, є цілим фрагментом, оскільки браузер розглядає його як тег, що закриває ваш сценарій, а не літеральний рядок.
Пройшов кодування

1
<\/script>буде дійсним, хоча
SP

Я думаю, що пункт @ TrueBlueAussie був у відповідь на ваш коментар "Просто не запитуйте мене, чому ... але що цікаво, воно НЕ буде працювати, якщо ви додасте завершальний тег в один рядок". Він пояснив, чому так, що будь-які читачі, які хотіли б кращої відповіді, ніж «я не знаю», могли легше знайти її. Дивіться також: javascript.crockford.com/script.html
iX3

1
@Sathvik правильний, за цим посиланням. Коментар Еша, здається, був відповіддю на видаленого.
Арлен Бейлер

2

Приклад:

var a = '<script type="text/javascript">some script here</script>';
$('#someelement').replaceWith(a);

Це має працювати. Я спробував це; такий же результат. Але коли я використав це:

var length = 1;
var html = "";
for (var i = 0; i < length; i++) {
    html += '<div id="codeSnippet"></div>';
    html += '<script type="text/javascript">';
    html += 'your script here';
    html += '</script>';
}
$('#someElement').replaceWith(a);

Це працювало для мене.

Редагувати: я забув #someelement(btw, який я, можливо, хочу використовувати #someElementчерез умовні умови)

Найголовніше тут + = тому html додається і не замінюється.

Залиште коментар, якщо це не спрацювало. Я хотів би допомогти вам!


2

Ось набагато зрозуміліший спосіб - немає необхідності в jQuery - який додає сценарій як остання дочірка <body>:

document.body.innerHTML +='<script src="mycdn.js"><\/script>'

Але якщо ви хочете додати та завантажити сценарії, використовуйте метод Rocket Hazmat .


-4

Якщо ви намагаєтеся запустити якийсь динамічно генерований JavaScript, вам було б трохи краще, використовуючи eval. Однак JavaScript - це настільки динамічна мова, що у вас справді не повинно бути потреби в цьому.

Якщо сценарій є статичним, то getScriptподальша пропозиція Rocket - це шлях.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.