2010-04-15 68 views
0

通常情況下,如果我想在mootools的停止默認的事件中,我可以這樣做:在addEvent中使用命名函數時,如何停止默認事件?

$('form').addEvent('submit', function(e) { 
    e.stop(); 

    //Do stuff here 
    }); 

不過,我不喜歡在事件中使用匿名函數,因爲我經常要重用的代碼。可以說我有一個驗證功能。我可以這樣做:

$('form').addEvent('submit', validate); 

它工作正常,直到我想停止默認事件。驗證顯然不知道e是什麼,所以我不能只做e.stop()。另外我試過把事件作爲一個變量來驗證,但是每當我使用帶有參數的命名函數時,函數會在domready上自動調用,而不是在事件觸發時調用。更糟糕的是,事件被觸發時會引發錯誤。

我在做什麼錯?

更新:這裏是完整的驗證功能,以防萬一。但是,由於錯誤發生在第一行之後,所以在調用之後我會懷疑任何東西,所以它可能是不相關的。

var validate = function(e) { 
    e.stop(); 

    if(this.get('tag') === 'form') { 
     this.getElements('input.text').each(validate); 
     } 
    else { 
     element = this; 
     div = element.getParent(); 
     input = element.get('value'); 
     filter = JSON.decode(div.get('filter')); 

     if(!filter.some(function(value, key) { 
      if(value === 'required') if(!setAndNotEmpty(element, input)) return true; 
      if(value === 'email') if(!isEmail(element, input)) return true; 
      if(value === 'date') if(!isDate(element, input)) return true; 
      if(value === 'time') if(!isTime(element, input)) return true; 
      if(key === 'chars') if(!charsLessThan(element, input, value)) return true; 
      if(key === 'words') if(!wordsLessThan(element, input, value)) return true; 
      return false; 
      })) setFault('', element); 
     } 
    } 

回答

1

需要聲明 「確認」 的方法如下:

function validate(e){ 
} 

然後你可以使用e.stop()

function validate(e){ 
    e.stop(); 
} 

$('form').addEvent('submit', validate); 
注意

是,在jQuery的,你也可以從方法返回結果以停止傳播。我不知道,如果允許的mootools這一點,但你可能做到這一點的:

function validate(e){ 
    return false; 
} 

$('form').addEvent('submit', validate); 

要回答「我在做什麼錯」的一部分 - 你只是誤解,當你在傳遞發生了什麼匿名方法。傳遞匿名方法function(e) {}造成e傳遞,它只是界定在傳遞的第一個參數的名稱。本次活動對象將被傳遞到方法是否沒有方法名的說法,因此你會發現下面也將工作:

function validate(){ 
    arguments[0].stop(); 
} 

$('form').addEvent('submit', validate); 
+0

你好,非常感謝你的回答。 不幸的是,我試過這個,它給了我以下錯誤: e.stop不是函數 – 2010-04-15 16:52:06

+0

有趣....如果你聲明驗證爲var而不是函數,會發生什麼,例如'var validate =函數(e){...}'?我真的不能看到任何理由我的建議不起作用,並且真的希望看到你的驗證方法的聲明 - 這聽起來更像你意外地做錯了我們看不到的東西 – Graza 2010-04-15 16:58:16

0
$('form').addEvent('submit', function(e) { 
    e.stop(); 

    //Do stuff here 
    } 

我不知道如果這是你的問題的一部分,但看你的()中的addEvent參數。

$('form').addEvent('submit', function(e)) { 

您的'e'參數未在第一行中正確關閉。

+0

實際上,這是不正確的。當然,他需要額外的'';'在*所有代碼的末尾*,但肯定不在'{'之前,我確信他很清楚這一點,而且他的代碼的第一部分沒有完全複製並粘貼到他的帖子全 – Graza 2010-04-15 17:03:48

+0

謝謝我已經解決了這個問題,它確實不負責原來的問題 – 2010-04-15 17:06:52

0

bindWithEvent改變目標函數中的此範圍來引用綁定參數。它也爲事件提供「空間」。這允許函數與Element:addEvent和參數一起使用。

preventDefault跨瀏覽器的方法來阻止事件的默認操作。

function validate(e) 
{ 
    e.preventDefault(); 

    if(this.get('tag') === 'form') { 
    this.getElements('input.text').each(validate); 
    } 
    else { 
     element = this; 
     div = element.getParent(); 
     input = element.get('value'); 
     filter = JSON.decode(div.get('filter')); 

    if(!filter.some(function(value, key) { 
     if(value === 'required') if(!setAndNotEmpty(element, input)) return true; 
     if(value === 'email') if(!isEmail(element, input)) return true; 
     if(value === 'date') if(!isDate(element, input)) return true; 
     if(value === 'time') if(!isTime(element, input)) return true; 
     if(key === 'chars') if(!charsLessThan(element, input, value)) return true; 
     if(key === 'words') if(!wordsLessThan(element, input, value)) return true; 
     return false; 
     })) setFault('', element); 
} 

$('form').addEvent('submit', validate.bindWithEvent(this)); 

漂亮的自我解釋,當你看到彼此相鄰的單詞prevent default。因此,當您提交表單時,該頁面將不會轉到您的操作。

相關問題