Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 17.06.2009, 16:16
Интересующийся
Отправить личное сообщение для SleepWalker Посмотреть профиль Найти все сообщения от SleepWalker
 
Регистрация: 09.11.2008
Сообщений: 15

Браузер доказывает что не видит функцию
Знаю что название темы бредовое, но я понятия не имею как можно обозвать мою проблему. В общем я посылаю аякс запрос на определенную страницу и полученый код размещаю в блоке, но вот проблема в том, что скрипты, с той страницы как я понял не выполняются :wacko: чесно говоря не могу понять причину, почему они не выполняются.

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

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

знаю что все запутано, но хотелось бы разобратся, почему не работают скрипты которые передались вместе с остальным кодом после аякс запроса. если просто дописать срипт в тело документа после загрузки страницы, то такой скрипт то работает (document.body.innerHTML = '<script type="text/javascript">alert(\'test\');</script>' с ответом выходит аналогично, я просто добавляю его в код страницы, но почемуто скрипты оттуда не работают(

вот. собственно расчитываю на чьюто помощь. если чтото не понятно написал, скжаите, попытаюсь обьяснить подробнее.
зарание спасибо
Ответить с цитированием
  #2 (permalink)  
Старый 17.06.2009, 16:33
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 03.04.2008
Сообщений: 6,234

Сообщение от SleepWalker
document.body.innerHTML = '<script type="text/javascript">alert(\'test\');</script>'
у вас такое работает?
очень странно.
вообще-то скрипты через InnerHTML не выполняются
вы в подгружаемых скриптах ставили в начале alert?
он выполняется?
если да, то проблема именно в подгружаемом скрипте
а вариант с eval вообще-то безотказен
вариант с динамическим тегом script имеет свои особености
в частности, если внутрь него добавлять код с помощью innerHTML, то не получится
надо с помощью создания внутри текстовой ноды
Ответить с цитированием
  #3 (permalink)  
Старый 17.06.2009, 16:49
Интересующийся
Отправить личное сообщение для SleepWalker Посмотреть профиль Найти все сообщения от SleepWalker
 
Регистрация: 09.11.2008
Сообщений: 15

прошу прощения. таки не работает алерт. ето я уже запутался. просто с утра не могу решить проблему.
с евалом функция выглядела так:
//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, верно?

Сообщение от Gvozd Посмотреть сообщение
надо с помощью создания внутри текстовой ноды
не очень дружу с DOM(
можно немного поподробнее про текстовые ноды?
Ответить с цитированием
  #4 (permalink)  
Старый 17.06.2009, 17:04
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 03.04.2008
Сообщений: 6,234

http://javascript.ru/tutorial/dom
http://www.google.ru/search?q=javasc...restrict&cad=8

проверьте что у вас вообще находитсся в переменной scriptStr
скрипт ли без лишнего?
по поводу же областей видимости, почитайте статьи, поэксперементируйте
я честно говоря не помню, как eval их обрабатывает в разных браузерах, но тема эта очень не простая
могу сказать гарантировано, что если вы в евале напишите:
window.func=function(){alert('');}

, то эта конструкция гарантировано попадет в глобальную облась видимости
для остальных случаев затрудняюь ответить, но помню, что браузеры в разнобой некоторые ситуации обрабатывают
Ответить с цитированием
  #5 (permalink)  
Старый 17.06.2009, 17:11
Интересующийся
Отправить личное сообщение для SleepWalker Посмотреть профиль Найти все сообщения от SleepWalker
 
Регистрация: 09.11.2008
Сообщений: 15

Сообщение от Gvozd Посмотреть сообщение
проверьте что у вас вообще находитсся в переменной scriptStr
скрипт ли без лишнего?
ето я проверял, даже несколько раз. 100% скрипт.

Сообщение от Gvozd Посмотреть сообщение
я честно говоря не помню, как eval их обрабатывает в разных браузерах, но тема эта очень не простая
могу сказать гарантировано, что если вы в евале напишите:
window.func=function(){alert('');}

, то эта конструкция гарантировано попадет в глобальную облась видимости
вот это может помочь.
func - ето название функции верно?

спасибо за ответы. щас поексперементирую. о результатах сообщу)
Ответить с цитированием
  #6 (permalink)  
Старый 17.06.2009, 17:21
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 03.04.2008
Сообщений: 6,234

Сообщение от SleepWalker
func - ето название функции верно?
да
Ответить с цитированием
  #7 (permalink)  
Старый 17.06.2009, 20:15
Интересующийся
Отправить личное сообщение для SleepWalker Посмотреть профиль Найти все сообщения от SleepWalker
 
Регистрация: 09.11.2008
Сообщений: 15

таки одна ошибочка была(я просто не занимался проверкой работы кода, который отвечал за внешние скрипты)
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', '\\"');
}
что бы нормально заменить все кавычки приходится делать два цыкла. но другого вариант мне на ум не приходит(

Последний раз редактировалось SleepWalker, 17.06.2009 в 22:13.
Ответить с цитированием
  #8 (permalink)  
Старый 17.06.2009, 22:14
Интересующийся
Отправить личное сообщение для SleepWalker Посмотреть профиль Найти все сообщения от SleepWalker
 
Регистрация: 09.11.2008
Сообщений: 15

вот возник еще вопрос.
а если это:
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('');


какой из вариантов будет лучше? я вообще склонен больше ко второму. как по мне это более компактно. ресурсов оно поидее будет одинаково мало кушать..
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск