Цитата:
|
LamerNo1 в любом случае надо выяснить причину, т.е. постепенно сокращать скрипт, пока он не станет запускаться. Например, в конце скрипта можно вставить тот же alert. При это появление диалогового окна будет означать, что скрипт запустился
|
Так получилось сделать?
|
test.js
var AnyElem={ param1: 'val1', param2: 2, setParam: function(p,v){ if(this[p]&&v){ this[p]=(typeof this[p]==='string')?v.length>0?v:'':parseInt(v); } } }; index.html <html> <head> <script language="javascript"> function loadSrc(p){ if(p&&p.length>0){ var s=document.createElement('script'); with(s){ setAttribute('type', 'text/javascript'); setAttribute('language', 'javascript'); src=p; } // document.getElementsByTagName('head')[0].appendChild(s); document.body.appendChild(s); } } var init=function(){ loadSrc('test.js'); console.log(AnyElem); } </script> </head> <body onload="init()"> </body> </html> Лог консоли FF3 Цитата:
|
jquery, например, так не делает, она создает элемент, в который вставляет скрипт, а потом этот элемент вставляет в документ. Примерно так:
var script = document.createElement("script"), id = "script" + (new Date).getTime(); script.type = "text/javascript"; try { script.appendChild( document.createTextNode( "window." + id + "=1;" ) ); } catch(e){} root.insertBefore( script, root.firstChild ); // Make sure that the execution of code works by injecting a script // tag with appendChild/createTextNode // (IE doesn't support this, fails, and uses .text instead) if ( window[ id ] ) { jQuery.support.scriptEval = true; delete window[ id ]; } root.removeChild( script ); // Evalulates a script in a global context globalEval: function( data ) { if ( data && /\S/.test(data) ) { // Inspired by code by Andrea Giammarchi // [url]http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html[/url] var head = document.getElementsByTagName("head")[0] || document.documentElement, script = document.createElement("script"); script.type = "text/javascript"; if ( jQuery.support.scriptEval ) script.appendChild( document.createTextNode( data ) ); else script.text = data; // Use insertBefore instead of appendChild to circumvent an IE6 bug. // This arises when a base node is used (#2709). head.insertBefore( script, head.firstChild ); head.removeChild( script ); } }, p.s. по-моему ничего важного не пропустил |
. .
|
Общий принцип понятен, но по моему через чур заморочисто... Можно использовать по принципу "если нельзя, но очень хочется, то можно"... в самых крайних условиях.
ИМХО, легче до начала инициализации подгрузить все скрипты и спокойно работать... |
да уж, сообщение: "Подгружаются все скрипты, приходите завтра!" :)
p.s. я и не говорил, что нужно этим повсеместно пользоваться |
Я делал немного проще...
var head=document.documentElement.firstChild; // Есть и другие варианты получить head. Кому как удобнее. // Подключаем скрип var js=document.createElement('script'); js.type='text/javascript'; js.src='script.js'; head.appendChild(js); //Подключаем стили (так... до кучи...) var css=document.createElement('link'); css.href='style.css'; css.media='screen'; //all, print ect. css.rel='stylesheet'; css.type='text/css'; head.appendChild(css); Работает везде, где нада (не придерацца к мелочам!!). Проверить загрузился ли скрипт нужно вариантом с callback имхо. Более точно проверять можно при использовании аякс. Получили в xml, распарсили, вставили(как вариант). |
B~Vladi,
для общего развития. Попробуйте запустить ваш код в ИЕ6 в контексте такой вот страницы. <html> <head> <base href="/" /> <script type="text/javascript"> var head=document.documentElement.firstChild; // Есть и другие варианты получить head. Кому как удобнее. var js=document.createElement('script'); js.type='text/javascript'; js.src='script.js'; head.appendChild(js); </script> </head> <body> </body> </html> |
Часовой пояс GMT +3, время: 21:46. |