Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/450.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript评估问题_Javascript_Javascript Events - Fatal编程技术网

Javascript评估问题

Javascript评估问题,javascript,javascript-events,Javascript,Javascript Events,我有一个页面A,它发出了一个ajax调用,并引入了截取的B。这个片段被添加到DOM中,并且该截取器中的所有脚本都被评估。在这个片段中,我有两个脚本标记: <script type="text/javascript"> function doOptions(){ alert('doOptions'); } </script> <script type="text/javascript"> X = { x : function(x) {

我有一个页面A,它发出了一个ajax调用,并引入了截取的B。这个片段被添加到DOM中,并且该截取器中的所有脚本都被评估。在这个片段中,我有两个脚本标记:

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


   }
</script>

函数选项(){
警报(“doOptions”);
}
X={
x:功能(x){
警报('x');
}
}
然后,上述脚本标记中声明的JS将在代码段B中使用:

  <button type="button" onclick="doOptions();"> options </button>       
  <button type="button" onclick="X.x();"> XX </button>
选项
XX
单击XX按钮有效,但单击选项按钮无效。firefox和IE都告诉我doOptions没有定义。为什么?

另外,这是什么类型的Javascript知识?意思是,如果我想读更多关于这方面的内容,我应该搜索什么,我应该在JS书籍的目录中查找什么

谢谢

此代码段将被添加到DOM中,并且该snipper中的所有脚本都将被评估

如果是,它将不起作用-脚本内容将不会被解析。有很多方法可以解决这个问题,但你永远不会有一个跨浏览器的解决方案。您应该考虑以不同的格式(例如文本)从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,但如果返回的内容不太复杂,则可以)

此代码段将被添加到DOM中,并且该snipper中的所有脚本都将被评估

如果是,它将不起作用-脚本内容将不会被解析。有很多方法可以解决这个问题,但你永远不会有一个跨浏览器的解决方案。您应该考虑以不同的格式(例如文本)从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,但如果返回的内容不太复杂,可能就可以了)。

如果我的猜测是正确的,并且您的问题属于这种情况,这可能有用。问题可能是由于evals是在调用环境上下文中执行的

我执行了以下测试:

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()函数


希望这有帮助。

如果我的猜测是正确的,而您的问题属于这种情况,这可能会有用。问题可能是由于evals是在调用环境上下文中执行的

我执行了以下测试:

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()函数


希望这有帮助。

您不必使用
标记。只需将代码缩进四个空格,然后还可以将HTML作为代码发布。还应该在问题文本框旁边的提示中提到。您使用什么用于ajax以及使用什么库来评估这些脚本?YUI用于ajax,以完成异步请求。一旦我得到响应,它是一个自定义代码,通过element.innerHTML将其注入dom,然后调用此元素上的函数来查询html中的所有脚本块,并逐个评估它们。根据我的其他评论,我现在知道两个脚本块都在求值。所以我的问题是,为什么在表面上成功的evel之后,调用自己声明的函数失败了,但是调用对象内部的函数n却有效。您不必使用
标记。只需将代码缩进四个空格,然后还可以将HTML作为代码发布。还应该在问题文本框旁边的提示中提到。您使用什么用于ajax以及使用什么库来评估这些脚本?YUI用于ajax,以完成异步请求。一旦我得到响应,它是一个自定义代码,通过element.innerHTML将其注入dom,然后调用此元素上的函数来查询html中的所有脚本块,并逐个评估它们。根据我的其他评论,我现在知道两个脚本块都在求值。所以我的问题是,为什么在看似成功的evel之后,调用自己声明的函数失败了,但调用对象内部的函数n却有效。我有一个自定义函数来评估脚本。它能很好地处理不同的浏览器。由于第二个代码段有效,因此这些代码段肯定会被删除。我可以在Firebug中看到两个代码段都调用了eval。我想我的问题是,这两个代码段之间有什么区别,在求值之后,函数不可用,但对象中的函数可用?我的意思是,脚本块肯定正在求值。我有一个自定义函数来求值脚本。它能很好地处理不同的浏览器。由于第二个代码段有效,因此这些代码段肯定会被删除。我可以在Firebug中看到两个代码段都调用了eval。我想我的问题是这两个代码段之间的区别是什么,在eval之后,函数不可用,但对象中的函数可用?我的意思是说脚本块是def