2014-01-14 118 views
0

原諒問這個問題。我經歷了相當多的解決方案,但它不適合我。每個循環的突破

我有大約5個輸入字段,如果它在任何輸入字段(如果有人輸入一個並試圖保存)發現一個非法字符,它應該提醒一條消息。

到目前爲止,當它發現一個,它確實提醒,然後它會去並保存它。

我想擺脫each()循環,返回false不起作用。

更好的解決方案也將不勝感激。

Fiddle here

// Illegal Character Check 
$('.illegal-check').click(function() { 
    var illegal = /[&<>]/; 
    $(".scoring input:text").each(function() { 
     var inptStr =$(this).val(); 
     if (illegal.test(inptStr)===true) { 
      alert('Your Scoring field(s) contain these & < > invalid characters. Please remove them and try again.'); 
      return false; 
     } 
    });//each 
});//click 
+1

'$( '#answer16')click'而不是'$('。illegal-check')。點擊' – Abhitalks

+0

如果這意味着一個表單,你應該在其周圍包裝'

'並在提交時應用一個處理程序。 –

+2

它工作正常。我在這裏添加了一個控制檯日誌 - http:// jsfiddle。net/infernalbadger/T2vT9/4 /,每個循環在第一個無效記錄之後停止。 –

回答

3
$('.illegal-check').click(function (e) { 
    ... 
    if (illegal.test(inptStr)===true) { 
     ... 
     e.preventDefault(); 
     return; 
    } 
} 

編輯: 爲什麼你的數據還是會被保存的原因是,即使你從通過打破「返回false;」您的數據提交仍在進行中。你也需要取消它。爲此,您使用事件參數「e」,通過調用其「preventDefault」函數將其傳遞給事件處理程序。

+0

如果你擴大你的答案並解釋這將如何解決問題,這將是很好的。提供代碼轉儲並不能真正幫助OP瞭解問題所在 – musefan

+0

@musefan添加了評論;它是一行代碼,代碼是不言自明的,但無論如何;繆斯是真棒,順便說一句:) – m1kael

0

您還可以添加一個變量看的非法值是否已經找到like this

// Illegal Character Check 
$('.illegal-check').click(function() { 
    var illegal = /[&<>]/; 
    var found = false; 
    $(".scoring input:text").each(function() { 
    var inptStr =$(this).val(); 
    if (illegal.test(inptStr)===true) { 
     alert('Your Scoring field(s) contain these & < > invalid characters. Please remove them and try again.'); 
     found = true; 
    } 
    }); 
    if(!found){ 
    alert("Nothing has been found") 
    }else{ 
    alert("Illegal char has been found"); 
    } 
}); 
+0

-1:你已經刪除了唯一會打破循環(你知道,問題是什麼)。建議,沒有解決方案,不符合答案 – musefan

0

個人而言,我想補充的形式,而不是在一個表格單元格單擊事件上提交處理程序。

$('form').on('submit', function(e) { 
    // ... 
    if (illegal.test(inptStr)===true) { 
     alert('...'); 
     e.preventDefault(); 
     return false; 
    } 
    // ... 

在這裏,事件傳遞給函數,任何錯誤都會阻止此事件觸發實際提交。

+0

我沒有在表單上使用的原因是還有更多的表單,它會自動創建,我無法訪問代碼端。我返回false或e.preventDefault();即使它意味着...; o( – 19eggs

+0

@ 19eggs)您可以使用'$('#answer16')。closest('form')。on('submit',...)'然後。 –

+0

再次取決於用戶登錄..可能會有更多的輸入和ids不斷變化... – 19eggs

0

jQuery的$.fn.each(與$.each相似)將跳出return false的循環,並繼續進行下一次迭代,並返回任何非僞造returnIt's documented on the API site

所有權利,你的代碼的這部分應該沒問題。

+0

但它不好,因爲點擊處理程序本身應'返回false;',以便點擊不傳播或對傳遞的事件執行類似的方法 –

+0

@Jack *你的代碼的這部分*涉及到*每個循環的突破*你的斷言與事件解析相比,更多的是jQuery循環,假設它有點飛躍這是OP實際上的意思,但你可能是對的 - 也許編輯問題(特別是標題)來說明這不是關於跳出循環嗎? – Barney

0

這裏是更新的小提琴。在一個單獨的函數

$('.illegal-check').click(function() { 
    if(checkIllegal()) evt.preventDefault(); 
}); 

function checkIllegal(){ 
    var illegal = /[&<>]/; 
    var isIllegal = false; 
    $(".scoring input:text").each(function() { 
     if (illegal.test($(this).val()) && !isIllegal) { 
     alert('Your Scoring field(s) contain these & < > invalid characters. Please remove them and try again.'); 
     isIllegal = true; 
     return false; 
     } 
    }); 
    return isIllegal; 
} 

http://jsfiddle.net/T2vT9/7/

+0

即使它在小提琴中工作,它仍然不起作用..我很困惑.. – 19eggs

+0

你可以從.illegal-檢查你的提交按鈕選擇器。 .illegal-check容器沒有任何默認操作,所以evt.preventDefault實際上沒有意義。改變你的提交按鈕,它應該工作 – Ankur

0

return false語句也跳出$(...).each(...)循環檢查錯誤。你的問題是,它仍然繼續並保存。您還應該使用e.preventDefault()停止事件執行其默認操作。 (注:這也是由m1kael代碼轉儲,其中沒有添加的解釋中提到)

這相當於這個代碼:

// Illegal Character Check 
$('.illegal-check').click(function (e) { 
    var illegal = /[&<>]/; 
    $(".scoring input:text").each(function() { // loop over elements in form 
     var inptStr = $(this).val(); 
     if (illegal.test(inptStr)===true) { 
      alert('...'); // show alert 
      e.preventDefault(); // prevent default action on click (stop submit) 
      return false; // break out of elements loop, no more alerts needed 
     } 
    });//each 
});//click 
+0

我一直懷疑我是否應該評論他的答案,或添加我自己的。因爲沒有解釋他的答案,所以我決定創建一個新的實際答案。然後,我根據他的回答添加了代碼轉儲。 –

+0

所以我因爲提到現有的工作而受到懲罰? 編輯:稍微修改M1kael提到 –

+0

你永遠不應該引用其他答案,這些答案可能會被刪除,並使你不完整。好的答案應該站在自己的位置,沒有依賴性 – musefan