Javascript Eval вопрос - PullRequest
       5

Javascript Eval вопрос

1 голос
/ 29 июля 2010

У меня есть страница A, которая выполняет вызов ajax и вводит фрагмент кода B. Этот фрагмент добавляется в DOM, и все сценарии в этом фрагменте проверяются.В этом фрагменте у меня есть 2 тега сценария как таковые:

<script type="text/javascript">
function doOptions(){
   alert('doOptions');
}
</script>
<script type="text/javascript">
   X = { 
      x : function(x) {
           alert('x');
      }


   }
</script>

Затем JS, объявленный в приведенных выше тегах сценария, используется внутри фрагмента B следующим образом:

  <button type="button" onclick="doOptions();"> options </button>       
  <button type="button" onclick="X.x();"> XX </button>

Нажатие на кнопку XX работает, но нажатие на кнопку настроек не дает.И Firefox, и IE говорят мне, что doOptions не определен.Почему?

Кроме того, что это за категория знаний Javascript?То есть, если я хочу узнать больше об этом, что мне искать, где я могу посмотреть содержание в книге JS?

Спасибо.

Ответы [ 2 ]

1 голос
/ 29 июля 2010

Этот фрагмент добавляется в DOM, и все сценарии в этом фрагменте имеют eval-ed.

Если вы используете innerHTML для вставки сценария , это не будет работать - содержание скрипта не будет проанализировано.Есть способы заставить его работать с Internet Explorer , но у вас никогда не будет кросс-браузерного решения.Вы должны обратить внимание на возврат данных из запроса AJAX в другом формате (например, в виде текста), а затем на создание и добавление элемента script с использованием функций DOM.Например:

// Create the script element
var script = document.createElement("script");
script.type = "text/javascript";

// Set the source as the location of the ajax service
script.src = "http://path.to/myajaxhandler.php?ajaxopt=2&anotheropt=5";

// Add the script element
document.getElementsByTagName("head")[0].appendChild(script);

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

0 голосов
/ 30 июля 2010

Если мое предположение верно и ваша проблема решается, это может быть полезно.Проблема может быть связана с тем, что evals выполняются в контексте вызывающей среды.

Я выполнил следующий тест:

function test() {
    eval('x={bar:function(){alert("bar");}}');
    eval('function foo(){alert("foo")}')


}
test();
x.bar(); //succeeds
foo(); //fails.

Здесь вызов foo () завершается неудачно, потому что онлокально по отношению к функции test (), тогда как переменная 'x' является глобальной переменной (поскольку переменная 'var' не указана), следовательно, вызов bar () для x завершается успешно;

Если вы хотите сделать 'fooфункция доступна снаружи,

function test() {
    eval('x={bar:function(){alert("bar");}}');
    eval('foo = function(){alert("foo")}')


}
test();
x.bar();
foo();

Теперь мы присваиваем функцию глобальной переменной (переменная не указана).Теперь вы можете вызывать функцию foo () снаружи.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...