2015-05-13 3 views
1

Я пытаюсь вставить скрипт на клик или после установки некоторого времени (как показано ниже), и он не добавляется. Однако, если я удалю функцию setTimeout, она добавит. То же самое происходит с кликом или любым другим событием. Может кто-нибудь сказать мне, почему, и как я могу это сделать?Добавление сценария динамически не удается

setTimeout(function(){ 
    var parent = $('#panel');     
    var element = $('<div></div>'); 
    var script = document.createElement('script'); 
    script.setAttribute('type','math/tex'); 
    script.textContent = 'e^{\\pi i} + 1 = 0'; 
    element.append(script); 

    parent.append(element); 
}, 1500); 
+0

Я бы 'console.log' переменные с и без задержки, а затем сравнить их. Что-то о документе меняется ('# parent' исчезает?). –

+0

@Chad Hedgcock Я сделал console.log, но единственное, что я мог видеть, это то, что он не добавляет элемент, все еще не знает причины! – Gacci

+1

Можете ли вы показать свой HTML, по крайней мере, '# panel', в трех разных версиях? 1. Исходный источник ('right click -> view source'). 2. «Правой кнопкой мыши -> проверить элемент» с таймаутом. 3. «Правой кнопкой мыши -> проверить элемент» без таймаута. Я предполагаю, что другой скрипт меняет документ, но этот сценарий зависит от того, что вы делаете в этом скрипте, который вы вставили. Добавление таймаута переключает порядок выполнения, который препятствует тому, чтобы этот другой таинственный скрипт работал на '# panel', как и ожидалось. –

ответ

2

редактировать: если вы используете MathJax, вы должны сказать MathJax пересканировать страницу для новых тегов латексных после вставки этого один за 1,5 секунды, см http://docs.mathjax.org/en/latest/typeset.html обычно вы можете уйти с просто работает MathJax.Hub.Queue(["Typeset",MathJax.Hub]); который для вас будет означать:

setTimeout(function(){ 
    var parent = $('#panel');     
    var element = $('<div></div>'); 
    var script = document.createElement('script'); 
    script.setAttribute('type','math/tex'); 
    script.textContent = 'e^{\\pi i} + 1 = 0'; 
    element.append(script); 
    parent.append(element); 
    MathJax.Hub.Queue(["Typeset",MathJax.Hub]); 
}, 1500); 

оригинальный ответ: он работает здесь, в моем jsfiddle:

https://jsfiddle.net/aLe0jL3y/

Я подозреваю, что вы считаете, что после добавления этого тега сценария ваша библиотека латекса автоматически обнаружит, что она была вставлена, и проанализируйте ее или что-то в этом роде.

Я не знаю, какие библиотеки вы используете для латекса, но я предполагаю, что ваш код работает за пределы SetTimeout, потому что тогда это время вставленной перед тем библиотеки латексной сканирует страницу для математики/текс сценария теги, тогда как при использовании задержки на 1,5 секунды библиотека уже запустится, и ваш тег будет вставлен в, но вы его не увидите, потому что библиотека латекса уже работает по этому моменту времени, так что это не происходит разобрать его.

Я предлагаю вам следить за использованием библиотеки латекса после 1,5 секунды.

+0

Большое спасибо, что решила мою проблему. Я использую MathJax. – Gacci

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