Модераторы: Sardar, Aliance

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ajax + динамическая подгрузка javascript, проблема при подгрузке контента 
:(
    Опции темы
polosatij
  Дата 22.4.2007, 03:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 22.2.2004
Где: Stuttgart<-> ;Karlsruhe, Germany

Репутация: 1
Всего: 8





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


посмотрел этот топик:

http://forum.vingrad.ru/topic-87742.html

1. вариант с "обворачивай в функцию и вызывай её." мне не подходит
2. попробовал грузить в .iframe, но почему-то яваскрипт не подгружается, если динамически менять .iframe
3. вариант: "либо клади во внешний файл и подгружай, как <script src="*"></script>".. а как можно подгрузить такое динамически, а не при первой загрузке страницы?

может быть есть ещё какие варианты?  smile 

eval() - не предлогать, в друх файлах более 1500 строк..  smile 


--------------------
PM   Вверх
skyboy
Дата 22.4.2007, 09:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 10
Всего: 260



Цитата(polosatij @  22.4.2007,  02:46 Найти цитируемый пост)
а как можно подгрузить такое динамически, а не при первой загрузке страницы?

создать элемент <script>?
Код

var scri= document.createElement('script');
scri.type= 'text/javascript';
scri.src= " ";
document.getElementsByTagName('body')[0].appendChild(scri);
scri.src= "http://www.google.com/new_my_super_puper_script.js"; // по идее, именно в момент смены пути и будет происходить принудительное выполнение javascript'a


Добавлено через 2 минуты и 8 секунд
обрати ещё внимание вот ещё на двухдневной давности тему:

Добавлено через 8 минут и 43 секунды
Подгрузка и выполнение JavaScript
PM MAIL   Вверх
polosatij
Дата 22.4.2007, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 22.2.2004
Где: Stuttgart<-> ;Karlsruhe, Germany

Репутация: 1
Всего: 8



skyboy

ещё не попробовал.. но о таком простом варианте, я что-то не подумал  smile 

скажи, 

1. а можно ли не только подгружать, но ещё и выгружать из памяти javascript?  smile 
2. есть ли в яваскрипт такой механизм как reflection?  smile 



--------------------
PM   Вверх
skyboy
Дата 22.4.2007, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 10
Всего: 260



Цитата(polosatij @  22.4.2007,  14:18 Найти цитируемый пост)
reflection

ООП в javascript'e, в отличии от Java и .NET(не знаю, откуда "пришел" вопрос про reflection), основывается не на иерархии классов, а на иерархии прототипов(prototype-based). Потому чтоб говорить о reflection, сначала уточни, ЧТО именно тебя интересует.
Например, получить доступ к методам/свойства по имени можно при помощи функции эвуляции eval() или при обращении к объектам, как к массивам(myobject[myproperty]= 555;).
Точно так же можно получить и перечисление:
Код

var obj= {};
obj.some= 15;
obj.method= function() {alert(15)};
for(a in obj) 
 alert('obj[' + a + ']=' + obj[a]);

Надеюсь, нигде не опечатался  smile 
Цитата(polosatij @  22.4.2007,  14:18 Найти цитируемый пост)
а можно ли не только подгружать, но ещё и выгружать из памяти javascript?

Не знаю. А зачем? Сам блок <script>, конечно, можно удалить из DOM-дерева, но не знаю, что будет с уже "привязанными" к событиям функциями...

Это сообщение отредактировал(а) skyboy - 23.4.2007, 00:21
PM MAIL   Вверх
Alx
Дата 22.4.2007, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ajaxy
****


Профиль
Группа: Комодератор
Сообщений: 2903
Регистрация: 26.11.2003
Где: Cutopia

Репутация: 10
Всего: 78



Цитата(skyboy @  22.4.2007,  17:21 Найти цитируемый пост)
Надеюсь, нигде не опечатался   

var obj = {};

 smile 


--------------------
PM MAIL WWW ICQ   Вверх
skyboy
Дата 22.4.2007, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 10
Всего: 260



Цитата(Alx @  22.4.2007,  17:49 Найти цитируемый пост)
var obj = {};

 smile Точно.
Или 
Код

var obj= new Object();

PM MAIL   Вверх
polosatij
Дата 22.4.2007, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 22.2.2004
Где: Stuttgart<-> ;Karlsruhe, Germany

Репутация: 1
Всего: 8



Цитата(skyboy @  22.4.2007,  17:21 Найти цитируемый пост)
Потому чтоб говорить о reflection, сначала уточни, ЧТО именно тебя интересует.



очень часто при программировании в javascript возникает одна и та же проблема: "этот класс/ объект или что там ещё не содержит такой методы".. хотелось бы как-нибудь посмотреть, какие у класса, объекта методы/ функции в наличии  smile 


--------------------
PM   Вверх
skyboy
Дата 22.4.2007, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 10
Всего: 260



я ж написал smile
хотя, нет необходимости обращаться к объекту как к массиву(точнее - хеш-таблице), если цель - только узнать о наличии метода.
Например, вот такая конструкция
Код

if(!document.SOME_SUPER_FUNCTION)
 alert('Нету такого метода');

будучи выполненной в обозревателе выдаст сообщение об отсуствии метода. Т.е. другими словами, несуществующие методы и свойства в объекте == false.
PM MAIL   Вверх
polosatij
Дата 22.4.2007, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 22.2.2004
Где: Stuttgart<-> ;Karlsruhe, Germany

Репутация: 1
Всего: 8



skyboy

ты меня не понял.. 

мне нужно все методы объекта, а не гадать, если ли метод у метода или нет, как это делаешь ты  smile 


--------------------
PM   Вверх
skyboy
Дата 22.4.2007, 23:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 10
Всего: 260



Цитата(polosatij @  22.4.2007,  22:08 Найти цитируемый пост)
все методы объекта

и свойства тоже можно получить. И это я демонстрировал шестью постами выше при помощи конструкции типа for(... in ...)
А теперь может объяснишь, зачем тебе работа с полным списком методов? Может, ты ещё просто не почувствовал различия между prototype-based и class-based подходами?
PM MAIL   Вверх
polosatij
Дата 22.4.2007, 23:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 22.2.2004
Где: Stuttgart<-> ;Karlsruhe, Germany

Репутация: 1
Всего: 8



Цитата(skyboy @  22.4.2007,  17:21 Найти цитируемый пост)
Не знаю. А зачем? Сам блок <script>, конечно, можно удалить из DOM-дерева, но не знаю, что будет с уже "привязанными" к событиям функциями... 



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

Добавлено через 1 минуту и 59 секунд
Цитата(skyboy @  22.4.2007,  23:27 Найти цитируемый пост)
Может, ты ещё просто не почувствовал различия между prototype-based и class-based подходами?



не знаю.. возможно  smile 
у меня нет большого опыта с яваскриптом.. немного чего писал, но ещё не постиг все основы этого скриптового языка  smile  я больше из мира ява  smile 


--------------------
PM   Вверх
skyboy
Дата 22.4.2007, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 10
Всего: 260



так не швыряй кодом. швыряй данными. а код пусть будет один и тот же. тогда и обработка будет однообразная, и никакой коллизии имен. А чтоб страницу составить из блоков, совсем необязательно бросать лоскутное одеяло из javascript'ов smile
PM MAIL   Вверх
polosatij
Дата 22.4.2007, 23:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 22.2.2004
Где: Stuttgart<-> ;Karlsruhe, Germany

Репутация: 1
Всего: 8



Цитата(skyboy @  22.4.2007,  23:31 Найти цитируемый пост)
так не швыряй кодом. швыряй данными. а код пусть будет один и тот же. 



так не получиться, слишком много кода  smile 


Цитата(skyboy @  22.4.2007,  23:31 Найти цитируемый пост)
совсем необязательно бросать лоскутное одеяло из javascript'ов


хорошо.. а что ещё ты посоветуешь? 

смотри, здесь, скрееншот => http://www.immobaer.com/antrakt/1.jpg при нажатии слева на меню, в середину подружается "нечто"..  как бы ты поступил?  smile 



--------------------
PM   Вверх
skyboy
Дата 22.4.2007, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 10
Всего: 260



недокачал скрин. 1600х1200   smile Мой канал такого не потянет. Может, на пальцах объяснишь? Надо менять не только данные, но и интерфейс? Много "окноподобных" конструкций?
PM MAIL   Вверх
polosatij
Дата 22.4.2007, 23:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 22.2.2004
Где: Stuttgart<-> ;Karlsruhe, Germany

Репутация: 1
Всего: 8



skyboy
    
Код

var obj;
obj.some= 15;
obj.method= function() {alert(15)};
for(a in obj) 
 alert('obj[' + a + ']=' + obj[a]);[/quote]


о.. крута.. за это зачёт  smile

Добавлено через 3 минуты и 8 секунд
Цитата(skyboy @  22.4.2007,  23:40 Найти цитируемый пост)
Надо менять не только данные, но и интерфейс?



надо менять данные, а к данным естественно и функциональность  smile 

как пример, представь, ты нажал на "журнал".. в контент был загружен журнал а вместе с ним и должен быть загружен весь причестный к этому яваскрипт..


Цитата(skyboy @  22.4.2007,  23:40 Найти цитируемый пост)
Много "окноподобных" конструкций? 



угу.. тока не окон.. а перегружающихся div-ов  smile + к ним должна идти яваскрипт функциональность  smile 


--------------------
PM   Вверх
skyboy
Дата 23.4.2007, 00:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 10
Всего: 260



Цитата(polosatij @  22.4.2007,  22:41 Найти цитируемый пост)
угу.. тока не окон.. а перегружающихся div-ов  smile + к ним должна идти яваскрипт функциональность

Хм. smile тогда неясно, почему ты про коллизию имен говорил, если интерфейс и соотвествующие js-функции продумываются заранее. 
Впрочем, ответ уже был дан - да, удалять можно smile
Цитата(polosatij @  22.4.2007,  22:41 Найти цитируемый пост)
о.. крута.. за это зачёт

там же ошибка только. в первой строке надо либо
Код

var obj= {};

либо 
Код

var obj= new Object();

PM MAIL   Вверх
polosatij
Дата 23.4.2007, 00:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 22.2.2004
Где: Stuttgart<-> ;Karlsruhe, Germany

Репутация: 1
Всего: 8



skyboy

я понял  smile 

ещё вот что.. ты не ответил на вопрос.. а как сделать лучше?  smile 

ещё вот что.. код, что посоветовали, не работает:

Код

    // load
    var scri= document.createElement('script');
    scri.type= 'text/javascript';
    scri.src= ' ';
    document.getElementsByTagName('meta')[0].appendChild(scri);
    scri.src= 'test.js';
    // _do(); // <-- do is not defined


а test.js, попробовал вот так:

Код

// _do();

function _do {
         alert('hi');
}


метода _do() не вызывается..  smile

Добавлено через 1 минуту и 29 секунд
Цитата(skyboy @  23.4.2007,  00:18 Найти цитируемый пост)
Впрочем, ответ уже был дан - да, удалять можно


хм.. а как из памяти удалить тогда? просто переправить .src у javascript-а?  smile хм.. неужели автоматом так получиться?  smile

Добавлено через 10 минут и 56 секунд


получилось так:

Код

    // load
    var scri= document.createElement('script');
    scri.type= 'text/javascript';
    scri.src= 'test.js';
        document.getElementsByTagName('meta')[0].appendChild(scri);

        // _do(); // ***
    // eval("_do();"); // ***


Код

_do();

function _do() {
         alert('hi');
}


однако такой код меня не устраивает..  smile  вызов функции _do(); должен происходить не в яваскрипте, а снаружи из контента! (я поставил в этом месте ***)


--------------------
PM   Вверх
skyboy
Дата 23.4.2007, 01:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 10
Всего: 260



Цитата(polosatij @  22.4.2007,  23:35 Найти цитируемый пост)
 вызов функции _do(); должен происходить не в яваскрипте, а снаружи из контента! (я поставил в этом месте ***) 

я так понимаю, проблема в том, что назначаешь события(onclick/onmouseover etc) с использованием js до того, как загрузишь и встроишь соответствующие js-файлы? 
ибо вот такое вот извращение работает и не жужжит:
Код

var button= document.createElement('button');
var scri= document.createElement('script');
scri.appendChild(document.createTextNode('alert("start!"); function foo() {alert("bar!");}'));
scri.type="text/javascript";
document.getElementsByTagName('body')[0].appendChild(scri);
scri.src=" ";
button.onclick= foo; // можно написать "button.onclick= function() {foo();}"  :crazy 
document.getElementsByTagName('body')[0].appendChild(button);

Как видишь, я указываю в обработчики функцию уже после её создания(после инициализации скрипта, включающие её). А у тебя, навернок, порядок создания обратный: сначала - элемент и попытка создания обработчика, потом уже - сам скрипт. Так?
PM MAIL   Вверх
polosatij
Дата 23.4.2007, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 22.2.2004
Где: Stuttgart<-> ;Karlsruhe, Germany

Репутация: 1
Всего: 8





skyboy

да.. ты прав.. поставил загрузку первой и всё вышло  smile терь понятно, почему она не стреляла (с)  smile 

но снова к вопросу о распределении JS и подгрузке AJAX.. как же сделать лучше, чтоб не нужно было постоянно куски тянуть? => ведь здесь ещё что получается.. юзер кликнул сюда, кликнул туда.. подгрузили всё.. терь он кликнул на то, что уже было загружено.. что получается, в JS нужно номер идентификационный прописывать, и спрашивать, были ли ты уже подгружен..  smile 


--------------------
PM   Вверх
skyboy
Дата 23.4.2007, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 10
Всего: 260



изврат: делай все на замыканиях.
то есть, вместо
Код

function foo()
{
 alert('bar');
 return 0;
}
btn.onclick = foo;

делай 
Код

btn.onclick = function() {
 alert('bar');
 return 0;
}

PM MAIL   Вверх
polosatij
Дата 23.4.2007, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 22.2.2004
Где: Stuttgart<-> ;Karlsruhe, Germany

Репутация: 1
Всего: 8



skyboy

хе-хе.. нет.. так не пойдёт..  smile 

мне всё равно надо подружать .js.. a если не подгружать, а писать прям в контент функции, то так не выйдет.. у меня не две строчки, а сотни и тысячи..  smile


--------------------
PM   Вверх
skyboy
Дата 23.4.2007, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 10
Всего: 260



ну, не знаю. значит, пиши функции, чтоб не было конфликта имен...
PM MAIL   Вверх
Alx
Дата 13.5.2007, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ajaxy
****


Профиль
Группа: Комодератор
Сообщений: 2903
Регистрация: 26.11.2003
Где: Cutopia

Репутация: 10
Всего: 78



skyboy
твой код в ИЕ вызывает ошибку - неожиданный вызов метода или обращение к свойству...
похоже к элементу script нельзя добавлять детей... innerHTML тоже не помогает...


--------------------
PM MAIL WWW ICQ   Вверх
linuxer
Дата 15.5.2007, 05:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 6.5.2007

Репутация: нет
Всего: нет



Цитата(polosatij @ 23.4.2007,  12:57)

но снова к вопросу о распределении JS и подгрузке AJAX.. как же сделать лучше, чтоб не нужно было постоянно куски тянуть? => ведь здесь ещё что получается.. юзер кликнул сюда, кликнул туда.. подгрузили всё.. терь он кликнул на то, что уже было загружено.. что получается, в JS нужно номер идентификационный прописывать, и спрашивать, были ли ты уже подгружен..  smile

Код

var loaded={};
function load(src){
  if(loaded[src])return true;
  ...
  loaded[src]=true;
  return true;
}

PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1192 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.