Браузер доказывает что не видит функцию
Знаю что название темы бредовое, но я понятия не имею как можно обозвать мою проблему. В общем я посылаю аякс запрос на определенную страницу и полученый код размещаю в блоке, но вот проблема в том, что скрипты, с той страницы как я понял не выполняются :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, время: 16:30. |