2010-09-20 120 views
1

我寫了一個Ajax-y頁面,它顯示來自ajax請求的數據行。每行都有一個「刪除鏈接」,允許用戶通過ajax快速刪除該行。javascript範圍問題

我的問題是一個與function--的範圍

「主」頁面有一個功能,看起來像這樣:由返回

<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); 
    } 
});  

數據'getRows'函數只是一些html行,它看起來像這樣:

<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> 

所以非常好 - 但是當我渲染頁面並單擊「刪除」鏈接時,出現「deleteRow未定義」的js錯誤。

我知道這可能與範圍有關,但我不太明白這是如何工作的。如何從返回的Ajax數據中引用「父」頁面的deleteRow函數?

謝謝!

回答

4

頁面的「全局範圍」是「窗口」對象。當您從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); 
    } 
}); 
+0

嗨,薩姆 - 感謝您的回覆。我試過了,現在錯誤「缺失;在聲明之前」 – julio 2010-09-20 23:23:06

+0

@julio:我第一次弄糟了代碼片段。請注意更改:'window.deleteRow = function(rowid){' – 2010-09-20 23:28:57

+0

我的壞山姆,在你的片段中錯過了一個paren。這樣可行!非常感謝你的幫助。 – julio 2010-09-20 23:30:12

1

移動deleteRow功能getRows功能之外,移動和事件處理外兩種功能。

一般來說,Javascript函數應該在全局範圍(或​​名稱空間)中定義;不嵌套在其他函數內部。

+0

嗨Slaks--它不是嵌套的,如果它看起來像這是由於我的格式錯誤造成的。 deleteRow位於domready塊內,但它不是getRows函數的一部分。謝謝 – julio 2010-09-20 23:25:06

+0

我不知道我是否明白爲什麼這兩個函數是在domready塊中定義的。這不是函數的定義,必須等到dom準備好之後才能執行 - 這將是執行那些重要的函數。 – Brian 2010-09-21 00:53:49