Я думаю, что у меня проблема с замыканиями и контекстами выполнения, хотя я не совсем уверен.
Позвольте мне объяснить, что именно я пытаюсь сделать и почему я кодировал это так, как я:
1) Я создаю интерфейс на основе JavaScript, интерфейс содержит различные приложения (я называю их виджетами).
2) Все виджеты являются перемещаемыми / перетаскиваемыми / закрываемыми / изменяемыми размерами и т. Д. Я пытаюсь достичь чего-то вроде интерфейса рабочего стола, хотя надо сказать, что то, что у меня есть, гораздо меньше, чем веб-операционная система , Но это то, к чему я стремлюсь.
3) Поэтому мне нужен был способ для кода JS загрузить каждый из этих виджетов, не зная, какие виджеты существуют и / или что-либо еще о них. Я решил, что когда интерфейс загружается, он должен вызвать php-скрипт, чтобы узнать имена виджетов.
4) JS-код имеет имя каждого виджета, теперь он проходит по ним все, вызывая другой php-скрипт, этот php-скрипт возвращает код для загрузки этого конкретного виджета и html-код для его отображения. JS добавляет элементы на экран для отображения, а затем загружает код JS для виджета.
5) Это сложная часть, на самом деле загрузка кода для каждого виджета, я сделал это так:
var func=new Function(ajax.responseText);
func();
И работает нормально, или, по крайней мере, похоже.
6) Теперь у меня проблема с объектами и массивами, и я думаю, что это как-то связано с контекстами выполнения.
Пример массива:
var myArray=new Array('foo', 'bar', 'fooBar', 'barFoo');
Выглядит нормально для меня, никаких проблем с реальным массивом (если я не напечатал там что-то не так :), не может работать без моего редактора Net Beans) Я попытался запустить его как отдельный скрипт, и он работает нормально, т.е. с: alert(myArray[0]);
в результате foo
Проблема с массивом:
Мой JS-код не может сделать что-либо полезное с этим массивом, потому что фактический вызов alert(myArray[0]);
приведет к foo, bar, fooBar, barFoo
.. Не знаю, почему это происходит на самом деле, но сейчас все портится.
Пример объекта:
var myObject=new Object();
myObject.a='foo';
myObject.b='bar';
myObject.c='fooBar';
myObject.d='barFoo';
Опять же, объект работает нормально, когда запускается сам.
Объектная проблема:
Очень похожая проблема, что и с массивами, вызов alert(myObject['a']);
на самом деле приведет к [object Object],[object Object],[object Object], [object Object]
...
... так что это та же проблема, что и с массивами, но с объектами становится еще хуже, если я вызову alert(myObject.a);
(заметьте, что я не использовал ['a'] на этот раз), это просто приведет к undefined
.
Итак, вернемся немного назад и объясним, как все связано друг с другом:
1) при загрузке JS он вызывает скрипт php, который возвращает закодированный в JSON объект, содержащий 3 ключа ('functions', 'JSscript', 'Other'). Каждый ключ содержит исходный код другого файла javacript. Все они загружаются с использованием динамически создаваемой функции, например: var func=new Function(ajax.responseText)
.
2) Тогда эти новые javascript-коды вызывают другой php-скрипт для дальнейших указаний.
3) Php отвечает JSON, который оценивается внутри динамически созданной функции и сохраняется в новой переменной.
4) Новая переменная теперь является объектом, содержащим, возможно, 3 ключа. (html, javascript, anotherObject)
HTML-код добавляется в документ. JavaScript выполняется в новой функции, как указано выше.
5) Проблемы возникают с объектами / массивами, которые существуют в JS, выполненном в моем последнем утверждении.
Так что, если кто-нибудь может помочь мне в этом, я был бы рад, и если вам нужны дополнительные объяснения или примеры кода, то, очевидно, я буду рад предоставить.
Спасибо
Richard