Браузер доказывает что не видит функцию
Знаю что название темы бредовое, но я понятия не имею как можно обозвать мою проблему. В общем я посылаю аякс запрос на определенную страницу и полученый код размещаю в блоке, но вот проблема в том, что скрипты, с той страницы как я понял не выполняются :wacko: чесно говоря не могу понять причину, почему они не выполняются.
я пытался с этим боротся по разному. пробывал вытаскивать из ответа сервера коды скриптов и прописывать их через евал(типо что бы функция сново обьявилась), знаю что ето тупо и помойму вообще не правильно, но я думал мб поможет. потом еше пробывал создавать елементы скриптов через createElement, что мне тоже не помогло. единственное что помогло ето просто размещение функций с запрашиваемой страницы на той странице с которой происходит запрос, но мне как бы не хочется так делать. знаю что все запутано, но хотелось бы разобратся, почему не работают скрипты которые передались вместе с остальным кодом после аякс запроса. если просто дописать срипт в тело документа после загрузки страницы, то такой скрипт то работает (document.body.innerHTML = '<script type="text/javascript">alert(\'test\');</script>';) с ответом выходит аналогично, я просто добавляю его в код страницы, но почемуто скрипты оттуда не работают( вот. собственно расчитываю на чьюто помощь. если чтото не понятно написал, скжаите, попытаюсь обьяснить подробнее. зарание спасибо |
Цитата:
очень странно. вообще-то скрипты через InnerHTML не выполняются вы в подгружаемых скриптах ставили в начале alert? он выполняется? если да, то проблема именно в подгружаемом скрипте а вариант с eval вообще-то безотказен вариант с динамическим тегом script имеет свои особености в частности, если внутрь него добавлять код с помощью innerHTML, то не получится надо с помощью создания внутри текстовой ноды |
прошу прощения. таки не работает алерт. ето я уже запутался. просто с утра не могу решить проблему.
с евалом функция выглядела так:
//str - ответ сервера
function renewScripts(str) {
var scriptStr = '';
var re = new RegExp('<script type=.?text/javascript.?');
while (re.test(str)) {
scriptStr = str.slice(str.search(re), str.indexOf('</script>') + 9);
str = str.replace(scriptStr, '');
var re2 = new RegExp('<script type=.?text/javascript.?>');
if (re2.test(scriptStr)) {
scriptStr = scriptStr.replace(re2, '').replace('</script>', '');
eval(scriptStr);
}else{
re2 = new RegExp('[\'"]>');
scriptStr = scriptStr.slice(scriptStr.indexOf('src=') + 5, scriptStr.indexOf('>'));
var scr = document.createElement('script');
scr.type = 'text/javascript';
scr.src = scriptStr;
document.body.appendChild(scr);
}
}
тут я создавал елемент скрипт только для тех скриптов, что подключались файлом. а остальное через евал. у меня появились сомнения, что евал в данном случае не будет работать, потому что тогда функции будут обьявлятся внутри функции renewScripts, верно? Цитата:
можно немного поподробнее про текстовые ноды? |
http://javascript.ru/tutorial/dom
http://www.google.ru/search?q=javasc...restrict&cad=8 проверьте что у вас вообще находитсся в переменной scriptStr скрипт ли без лишнего? по поводу же областей видимости, почитайте статьи, поэксперементируйте я честно говоря не помню, как eval их обрабатывает в разных браузерах, но тема эта очень не простая могу сказать гарантировано, что если вы в евале напишите:
window.func=function(){alert('');}
, то эта конструкция гарантировано попадет в глобальную облась видимости для остальных случаев затрудняюь ответить, но помню, что браузеры в разнобой некоторые ситуации обрабатывают |
Цитата:
Цитата:
func - ето название функции верно? спасибо за ответы. щас поексперементирую. о результатах сообщу) |
Цитата:
|
таки одна ошибочка была(я просто не занимался проверкой работы кода, который отвечал за внешние скрипты)
scriptStr = scriptStr.slice(scriptStr.indexOf('src=') + 5, scriptStr.indexOf('>') - 1);
теперь все работает. вот функция:
function strToFunc(str) {
while(str.indexOf('function') != -1) {
str = str.slice(str.indexOf('function') + 8);
var fName = str.replace(' ', '');
while(fName.indexOf(' ') != -1) {
fName = fName.replace(' ', '')
}
fName = fName.slice(0, fName.indexOf('('));
var fVar = str.slice(str.indexOf('(') + 1, str.indexOf(')'));
while(fVar.indexOf(' ') != -1) {
fVar = fVar.replace(' ', '');
}
/*fVar = fVar.split(',');
fVar = fVar.join('", "');*/
while(fVar.indexOf(',') != -1) {
fVar = fVar.replace(',', '\\f');
}
while(fVar.indexOf('\\f') != -1) {
fVar = fVar.replace('\\f', '", "');
}
fVar = '"' + fVar + '"';
var fStr = str.slice(str.indexOf('{') + 1);
if (str.indexOf('function') != -1) {
fStr = fStr.slice(0, fStr.indexOf('function'));
}
fStr = fStr.slice(0, fStr.lastIndexOf('}'));
while(fStr.indexOf('"') != -1 || fStr.indexOf('\n') != -1) {
fStr = fStr.replace('"', '\\f').replace('\n', '');
}
while(fStr.indexOf('\\f') != -1) {
fStr = fStr.replace('\\f', '\\"');
}
fStr = '"' + fStr + '"';
window[fName] = new Function(eval(fVar), eval(fStr));
}
}
единственное, что мне не нравится, так это этот кусок кода. while(fStr.indexOf('"') != -1 || fStr.indexOf('\n') != -1) { fStr = fStr.replace('"', '\\f').replace('\n', ''); } while(fStr.indexOf('\\f') != -1) { fStr = fStr.replace('\\f', '\\"'); } что бы нормально заменить все кавычки приходится делать два цыкла. но другого вариант мне на ум не приходит( |
вот возник еще вопрос.
а если это:
while(fStr.indexOf('"') != -1 || fStr.indexOf('\n') != -1) {
fStr = fStr.replace('"', '\\f').replace('\n', '');
}
while(fStr.indexOf('\\f') != -1) {
fStr = fStr.replace('\\f', '\\"');
}
заменить на это:
fVar = fVar.split('"');
fVar = fVar.join('\\"');
fVar = fVar.split('\n');
fVar = fVar.join('');
какой из вариантов будет лучше? я вообще склонен больше ко второму. как по мне это более компактно. ресурсов оно поидее будет одинаково мало кушать.. |
| Часовой пояс GMT +3, время: 21:23. |