Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/391.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_Ajax_Function_Scope - Fatal编程技术网

javascript范围问题

javascript范围问题,javascript,ajax,function,scope,Javascript,Ajax,Function,Scope,我编写了一个小的Ajax-y页面,它显示来自Ajax请求的数据行。每一行都有一个delete链接,允许用户通过ajax快速删除该行 我的问题是函数的范围- 主页面具有如下功能: <script language="javascript" type="text/javascript"> window.addEvent('domready', function() { function getRows(){ var myurl = 'myajaxurl.php'

我编写了一个小的Ajax-y页面,它显示来自Ajax请求的数据行。每一行都有一个delete链接,允许用户通过ajax快速删除该行

我的问题是函数的范围-

主页面具有如下功能:

<script language="javascript" type="text/javascript">
window.addEvent('domready', function() {

    function getRows(){
        var myurl = 'myajaxurl.php';
            var req = new Request({
            async:false,
            method: 'get',
            url: myurl,
            data: {'id':'<?php echo $id; ?>'},
            evalScripts:true,
            onSuccess: function(response) {
                $('my_rows_div').set('html',response);
            }
        }).send();
    }

    function deleteRow(rowid){
        alert(rowid);
    }
});    
<tr><td>data</td><td><a onclick="deleteRow(1)" href="javascript:void(0);">delete</a></td></tr>
<tr><td>data</td><td><a onclick="deleteRow(2)" href="javascript:void(0);">delete</a></td></tr>
“getRows”函数返回的数据只是一些html行,如下所示:

<script language="javascript" type="text/javascript">
window.addEvent('domready', function() {

    function getRows(){
        var myurl = 'myajaxurl.php';
            var req = new Request({
            async:false,
            method: 'get',
            url: myurl,
            data: {'id':'<?php echo $id; ?>'},
            evalScripts:true,
            onSuccess: function(response) {
                $('my_rows_div').set('html',response);
            }
        }).send();
    }

    function deleteRow(rowid){
        alert(rowid);
    }
});    
<tr><td>data</td><td><a onclick="deleteRow(1)" href="javascript:void(0);">delete</a></td></tr>
<tr><td>data</td><td><a onclick="deleteRow(2)" href="javascript:void(0);">delete</a></td></tr>
到目前为止还不错-但是当我呈现页面并单击delete链接时,我得到了一个js错误,即没有定义deleteRow

我知道这可能与范围有关,但我不太明白它是如何工作的。如何从返回的ajax数据中引用父页面的deleteRow函数


谢谢

页面的全局范围是窗口对象。从HTML属性添加事件处理程序时,默认情况下使用全局范围。这样做:

<script language="javascript" type="text/javascript">
window.addEvent('domready', function() {

function getRows(){
        var myurl = 'myajaxurl.php';
            var req = new Request({
            async:false,
            method: 'get',
            url: myurl,
            data: {'id':'<?php echo $id; ?>'},
            evalScripts:true,
            onSuccess: function(response) {
                $('my_rows_div').set('html',response);
            }
        }).send();
    }

    window.deleteRow = function(rowid){
        alert(rowid);
    }
});  

页面的全局范围是窗口对象。从HTML属性添加事件处理程序时,默认情况下使用全局范围。这样做:

<script language="javascript" type="text/javascript">
window.addEvent('domready', function() {

function getRows(){
        var myurl = 'myajaxurl.php';
            var req = new Request({
            async:false,
            method: 'get',
            url: myurl,
            data: {'id':'<?php echo $id; ?>'},
            evalScripts:true,
            onSuccess: function(response) {
                $('my_rows_div').set('html',response);
            }
        }).send();
    }

    window.deleteRow = function(rowid){
        alert(rowid);
    }
});  
将deleteRow函数移到getRows函数之外,并将这两个函数移到事件处理程序之外

一般来说,Javascript函数应该在全局范围或名称空间中定义;未嵌套在其他函数中。

将deleteRow函数移到getRows函数之外,并将这两个函数移到事件处理程序之外


一般来说,Javascript函数应该在全局范围或名称空间中定义;没有嵌套在其他函数中。

Hi Sam-感谢您的回复。我试过了,错误现在不见了;之前statement@julio:我第一次把代码片段弄糟了。注意更改:window.deleteRow=functionrowid{我的坏山姆,在你的代码片段中遗漏了一个paren。这很有效!非常感谢你的帮助。事实上,窗口是不需要的,因为所有声明没有变量的变量都是全局的。虽然不是严格必要的,但我认为这不是一个坏的做法,因为它使事情更可读。嗨山姆-谢谢你的回答。我尝试过了,错误现在就消失了失踪的;以前的statement@julio:我第一次弄糟了代码段。请注意更改:window.deleteRow=functionrowid{我的坏山姆,在你的代码片段中遗漏了一个paren。这很有效!非常感谢你的帮助。实际上,窗口是不需要的,因为所有声明没有var的变量都是全局的。虽然不是严格必要的,但我认为这不是一个坏做法,因为它使事情更可读。嗨,Slaks-它不是嵌套的,如果它看起来是这样的话,那是因为我的fa格式错误。deleteRow位于domready块内,但它不是getRows函数的一部分。谢谢。我不确定我是否理解为什么这两个函数是在domready块内定义的。不是函数的定义必须等到dom准备好后才能执行,而是函数的执行才是重要的。您好laks-它不是嵌套的,如果看起来是因为我的格式错误。deleteRow在domready块中,但它不是getRows函数的一部分。Thanks我不确定我是否理解为什么这两个函数是在domready块中定义的。它不是必须等到dom准备好的函数的定义-它是重要的是功能的执行。