javascript范围问题
我编写了一个小的Ajax-y页面,它显示来自Ajax请求的数据行。每一行都有一个delete链接,允许用户通过ajax快速删除该行 我的问题是函数的范围- 主页面具有如下功能: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'
<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准备好的函数的定义-它是重要的是功能的执行。