Как jQuery может быть введен в кадр с помощью jQuery? [Дубликат]

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

<div>
    Element 1
</div><!--
--><div>
    Element 2
</div>
267
задан mekwall 26 June 2013 в 09:21
поделиться

18 ответов

Я видел проблемы, когда некоторые браузеры не учитывают некоторые изменения, когда вы делаете их напрямую (под этим я подразумеваю создание HTML из текста, как вы пытаетесь использовать тег скрипта), но когда вы делаете их со встроенными В командах все идет лучше. Попробуйте следующее:

var script = document.createElement( 'script' );
script.type = 'text/javascript';
script.src = url;
$("#someElement").append( script );

От: JSON для jQuery

251
ответ дан Sujania 28 August 2018 в 13:17
поделиться

Я пробовал этот один и отлично работает. Просто замените символ < на \x3C.

// With Variable
var code = "\x3Cscript>SomeCode\x3C/script>";
$("#someElement").append(code);

или

//Without Variable
$("#someElement").append("\x3Cscript>SomeCode\x3C/script>");

Здесь вы можете проверить код здесь .

0
ответ дан Andrew The Great 28 August 2018 в 13:17
поделиться

Добавить скрипт в тело:

$(document).ready(function() {
    $("<script>", {  src : "bootstrap.min.js",  type : "text/javascript" }).appendTo("body");
});
0
ответ дан Cristian Olaru 28 August 2018 в 13:17
поделиться

Можно динамически загружать файл JavaScript с помощью функции jQuery getScript

$.getScript('http://www.whatever.com/shareprice/shareprice.js', function() {
  Display.sharePrice();
});

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

23
ответ дан Daniel Böhmer 28 August 2018 в 13:17
поделиться

Это работает:

$('body').append($("<script>alert('Hi!');<\/script>")[0]);

Кажется, что jQuery делает что-то умное со сценариями, поэтому вам нужно добавить элемент html, а не объект jQuery.

17
ответ дан Darwin 28 August 2018 в 13:17
поделиться

Это то, что я считаю лучшим решением. Google Analytics вводится таким образом.

var (function(){
    var p="https:" == document.location.protocol ? "https://" : "http://";
        d=document,
        g=d.createElement('script'),
        s=d.getElementsByTagName('script')[0];
        g.type='text/javascript';
        g.src=p+'url-to-your-script.js';
        s.parentNode.insertBefore(g,s); })();
1
ответ дан dzona 28 August 2018 в 13:17
поделиться

Хорошая новость:

Он работает на 100%.

Просто добавьте что-то внутри тега скрипта, например alert('voila!');. Правильный вопрос, который вы, возможно, захотите спросить, возможно, «Почему я не увидел его в DOM?» .

Карл Сведберг сделал приятное объяснение комментарию посетителя в сайт API jQuery . Я не хочу повторять все его слова, вы можете прочитать здесь прямо здесь (мне было трудно перемещаться по комментариям там) .

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

Я считаю, что одна из причин jQuery заключается в том, чтобы избежать ошибок «Разрешения на отказ», которые может возникать в Internet Explorer при вставке скриптов при определенных обстоятельствах. Он также избегает многократной вставки / оценки того же скрипта (который может потенциально вызвать проблемы), если он находится внутри содержащего элемента, который вы вставляете, а затем перемещаете DOM.

Следующее, я расскажу, что это плохие новости, используя функцию .append(), чтобы добавить скрипт.


И The Bad News is ..

Вы не можете отлаживать свой код.

Я не шучу, даже если вы добавили ключевое слово debugger; между строкой, которую вы хотите установить в качестве точки останова , вы получите только стек вызовов объекта, не увидев точку останова на исходном коде, (не говоря уже о том, что это ключевое слово работает только в браузере webkit, все остальные основные браузеры, похоже, пропустили это ключевое слово) .

Если вы полностью понимаете, что делает ваш код, это будет незначительным недостатком. Но если вы этого не сделаете, вы добавите ключевое слово debugger; по всему месту, чтобы узнать, что не так с вашим (или моим) кодом. Во всяком случае, есть альтернатива, не забывайте, что javascript может изначально манипулировать HTML DOM.


Обходной путь.

Используйте javascript (не jQuery) для управления HTML DOM

Если вы не хотите потерять возможности отладки, вы можете использовать javascript для собственных HTML DOM-манипуляций. Рассмотрим этот пример:

var script   = document.createElement("script");
script.type  = "text/javascript";
script.src   = "path/to/your/javascript.js";    // use this for linked script
script.text  = "alert('voila!');"               // use this for inline script
document.body.appendChild(script);

Там, как и в старые времена, это не так. И не забудьте очистить вещи, будь то в DOM или в памяти для всего объекта, на который ссылается и больше не требуется, чтобы предотвратить утечку памяти. Вы можете рассмотреть этот код для очистки вещей:

document.body.removechild(document.body.lastChild);
delete UnusedReferencedObjects; // replace UnusedReferencedObject with any object you created in the script you load.

Недостатком этого обходного пути является то, что вы можете случайно добавить дублирующий скрипт, и это плохо. Отсюда вы можете слегка подражать функции .append(), добавив проверку объекта перед добавлением и удалив скрипт из DOM сразу после его добавления. Рассмотрим этот пример:

function AddScript(url, object){
    if (object != null){
        // add script
        var script   = document.createElement("script");
        script.type  = "text/javascript";
        script.src   = "path/to/your/javascript.js";
        document.body.appendChild(script);

        // remove from the dom
        document.body.removeChild(document.body.lastChild);
        return true;
    } else {
        return false;
    };
};

function DeleteObject(UnusedReferencedObjects) {
    delete UnusedReferencedObjects;
}

Таким образом, вы можете добавить скрипт с возможностью отладки, избегая при этом двукратности сценария. Это всего лишь прототип, вы можете расширить его, как хотите. Я использовал этот подход и вполне доволен этим. Конечно, я никогда не буду использовать jquery .append(), чтобы добавить скрипт.

Happy Coding, Hendra Uzia.

344
ответ дан Hendra Uzia 28 August 2018 в 13:17
поделиться

Попробуйте это может быть полезно:

var fileref=document.createElement('script');
fileref.setAttribute("type","text/javascript");
fileref.setAttribute("src","scriptAnalytics.js");
document.getElementsByTagName("head")[0].appendChild(fileref);
13
ответ дан Jainul Khan 28 August 2018 в 13:17
поделиться

Что значит «не работает»?

jQuery обнаруживает, что вы пытаетесь создать элемент SCRIPT и будете автоматически запускать содержимое элемента в глобальном контексте. Вы говорите мне, что это не работает для вас? -

$('#someElement').append('<script>alert("WORKING");</script>');

Редактирование: если вы не видите элемент SCRIPT в DOM (например, в Firebug) после запуска команды, так как jQuery, как я уже сказал, будет запускать код, а затем удалит элемент SCRIPT - я считаю, что элементы SCRIPT всегда присоединяются к телу ... но в любом случае - размещение не имеет никакого отношения к выполнению кода в этой ситуации.

20
ответ дан James 28 August 2018 в 13:17
поделиться

Вам не нужен jQuery, чтобы создать [DOM Element] DOM Element . Это можно сделать с помощью ванильного ES6 следующим образом:

const script = "console.log('Did it work?')"
new Promise((resolve, reject) => {
  (function(i,s,o,g,r,a,m){a=s.createElement(o),m=s.getElementsByTagName(o)[0];a.innerText=g;a.onload=r;m.parentNode.insertBefore(a,m)})(window,document,'script',script, resolve())
}).then(() => console.log('Sure did!'))

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

1
ответ дан Josh Habdas 28 August 2018 в 13:17
поделиться

Я хочу сделать то же самое, но добавить тег скрипта в другой фрейм!

var url = 'library.js'; 
var script = window.parent.frames[1].document.createElement('script' ); 
script.type = 'text/javascript'; 
script.src = url;
$('head',window.parent.frames[1].document).append(script);
3
ответ дан Julio 28 August 2018 в 13:17
поделиться

Выполняется ваш скрипт, вы просто не можете использовать document.write из него. Используйте предупреждение, чтобы проверить его и не использовать document.write. Заявления вашего js-файла с document.write не будут выполнены, а остальная часть функции будет выполнена.

1
ответ дан Kunal Kinalekar 28 August 2018 в 13:17
поделиться

Я написал пакет npm, который позволяет вам взять строку HTML, включая теги скриптов, и добавить ее в контейнер при выполнении скриптов

Пример:

import appendHtml from 'appendhtml';

const html = '<p>Hello</p><script src="some_js_file.js"></script>'; 
const container = document.getElementById('some-div');

await appendHtml(html, container);

// appendHtml returns a Promise, some_js_file.js is now loaded and executed (note the await)

Найдите его здесь: https://www.npmjs.com/package/appendhtml

0
ответ дан Lukas 28 August 2018 в 13:17
поделиться

Другой способ сделать это, если вы хотите добавить код, - это использовать метод document.createElement, но затем использовать .innerHTML вместо .src.

var script = document.createElement( 'script' );
script.type = 'text/javascript';
script.innerHTML = 'alert("Hey there... you just appended this script to the body");';
$("body").append( script );
0
ответ дан Marc 28 August 2018 в 13:17
поделиться

Добавление sourceURL в файл сценария помогло, как упоминалось на этой странице: https://blog.getfirebug.com/2009/08/11/give-your-eval-a-name-with-sourceurl/

  1. В файле сценария добавьте оператор с sourceURL как «// @ sourceURL = foo.js»
  2. Загрузите скрипт с помощью jQuery $ .getScript (), и скрипт будет доступен на вкладке «sources» в инструментах chrome dev
2
ответ дан Naga Kiran 28 August 2018 в 13:17
поделиться
<script>
    ...
    ...jQuery("<script></script>")...
    ...
</script>

</script> внутри строкового литерала завершает весь скрипт, чтобы избежать использования "</scr" + "ipt>".

3
ответ дан Roman Odaisky 28 August 2018 в 13:17
поделиться

Просто создайте элемент, проанализируя его с помощью jQuery.

<div id="someElement"></div>
<script>
    var code = "<script>alert(123);<\/script>";
    $("#someElement").append($(code));
</script>

Рабочий пример: https://plnkr.co/edit/V2FE28Q2eBrJoJ6PUEBz

-1
ответ дан sanbor 28 August 2018 в 13:17
поделиться

Можно попробовать это

var code = "<script></" + "script>";
$("#someElement").append(code);

Единственная причина, по которой вы не можете сделать "<script></script>", - это то, что строка не разрешена внутри javascript, потому что слой DOM не может разобрать, что такое js, и что HTML.

0
ответ дан vipin 28 August 2018 в 13:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: