Javascript评估问题

时间:2010-07-29 19:23:39

标签: javascript javascript-events

我有一个页面A发出一个ajax调用并带来剪切的B.这个片段被添加到DOM中,并且该snipper中的所有脚本都被评估。在那个片段中,我有两个脚本标签:

<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 个答案:

答案 0 :(得分:1)

  

此片段已添加到DOM中,并且该片段中的所有脚本都已经过评估。

如果您是using innerHTML to insert the script,则无效 - 脚本内容将不会被解析。 get it working with Internet Explorer有方法,但您永远不会有跨浏览器解决方案。您应该看一下以不同的格式(例如文本)从AJAX请求返回数据,然后使用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来说并不理想,但如果返回的内容不是太复杂。)

答案 1 :(得分:0)

如果我的猜测是对的并且您的问题属于这种情况,那么这可能很有用。问题可能是由于eval在调用环境上下文中执行的原因。

我执行了以下测试:

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


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

这里调用foo()失败,因为它是test()函数的本地变量而变量'x'是全局变量(因为'var'未指定)因此对x上的bar()的调用成功;

如果你想在外面提供'foo'功能,

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


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

现在我们将函数分配给全局变量(未指定'var')。现在你可以在外面调用foo()函数。

希望这有帮助。