2011-12-04 66 views
0

在表單驗證中,模糊時,會觸發數據驗證。在這種形式下,我有3種不同的onblur可能的觸發器。但是如果觸發,我會得到兩個警報框,這意味着觸發了兩個功能。javascript一個函數觸發觸發另一個意外函數

形式(HTML代碼):

<form id="processpayment" action="https://www.paypal.com/cgi-bin/webscr" method="post"> 
<table class="paypal"> 
<tbody> 
<tr> 
<td class="etiqueta" width="50%"><label>Nombre</label></td> 
</tr> 
<tr> 
<td><input id="nombre" class="requerido" type="text" name="nombre" value="" /></td> 
</tr> 
<tr> 
<td class="etiqueta"><label>Forma de comunicación</label></td> 
</tr> 
<tr> 
<td><span id="medio" class="requerido">Skype</span></td> 
</tr> 
<tr> 
<td class="etiqueta"><label id="label_medio_id">Usuario de Skype</label></td> 
</tr> 
<tr> 
<td><input id="medio_id" class="requerido" type="text" name="medio_id" value="" /></td> 
</tr> 
<tr> 
<td class="etiqueta"><label id="confirm:label_medio_id">Verifica usuario de Skype </label></td> 
</tr> 
<tr> 
<td><input id="confirm:medio_id" class="requerido" onblur="confirm_data(this.id);" type="text" name="confirm:medio_id" value="" /></td> 
</tr> 
<tr> 
<td class="checkbox" colspan="2"><input id="warningpaypalverified" class="requerido" type="checkbox" name="warningpaypalverified" value="payment constraints acknowledged" /><label class="alerta">Pagos de tarjeta de crédito son procesados inmediatamente.<br /><br /> En caso de que use su cuenta PayPal, es necesario ser verificado por PayPal con anterioridad.<br /><a id="explain" class="explain" onclick="explain('La conversación inmediata tiene como característica el comunicarse con alguien inmediatamente.\n\nCuando PayPal no ha verificado su cuenta estos pagos toman mas de 24 horas.\n\nSi desea una conversación inmediata, pague con tarjeta de crédito.')">Por que es esto necesario</a></label></td> 
</tr> 
<tr> 
<td id="paypal" colspan="2"><input type="hidden" name="notify_url" value="http://root.com/process/listener.php" /> <input type="hidden" name="locale.x" value="es_XC" /> <input class="alldata" type="hidden" name="custom" value="" /> <input type="hidden" name="cmd" value="_s-xclick" /> <input type="hidden" name="image_url" value="http://root.com/images/root_logo.png" /> <input type="hidden" name="hosted_button_id" value="THISANDTHAT" /> <input class="paypal" type="image" name="submit" src="https://www.paymentobjects.com/es_XC/i/btn/btn_buynowCC_LG.gif" alt="PayPal, la forma más segura y rápida de pagar en línea." /> <img src="https://www.paymentobjects.com/es_XC/i/scr/pixel.gif" border="0" alt="" width="1" height="1" /></td> 
</tr> 
</tbody> 
</table> 
</form> 

我有以下的javascript代碼:

function clear_fields(fieldid, confirm_fieldid){ 
     document.getElementById(fieldid).value = ""; 
     if (typeof(confirm_fieldid) !== 'undefined'){ document.getElementById(confirm_fieldid).value = ""; } 
     document.getElementById(fieldid).focus(); 
     return false; 
    } 

function validate_email(email_field_id){ 

     email = typeof(email_field_id) != 'undefined' ? document.getElementById(email_field_id) : function(){alert('Parameter error when calling Validate Email. Check your form'); return;}(); 

     var reg = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/; 

     if(reg.test(email.value) == false) { 

      alert('El email que ingresaste no es correcto. Por favor, intenta nuevamente siguiendo este formato [email protected]'); 

      return clear_fields(email_field_id); 

     } else { return true; } 

    } 

function confirm_email(confirm_email_field_id){ 

     var confirmemail = typeof(confirm_email_field_id) != 'undefined' ? document.getElementById(confirm_email_field_id) : function(){alert('Parameter error when calling javascript function confirm_email(). Check your form, and make sure input field for confirm email calls the function confirm_email("confirm:email_id");'); return;}(); 

     var confirmemailarray = confirmemail.id.split(':'); 

     var email = document.getElementById(confirmemailarray[1]); 

     if(email.value === confirmemail.value) {  

      return true; 

     } else { 

      alert("ERROR: \"Email\" no coincide con \"Confirmar Email\". \n Agrega tu \"Email\" y CONFIRMA este Email") 

      return clear_fields(email.id, confirmemail.id); 

     } 

    } 

function confirm_data(confirm_data_field_id){ 

     if(typeof(confirm_data_field_id) == 'undefined'){ 

      alert('Parameter error when calling javascript function confirm_data. Check your form, and make sure input field to confirm data calls the function confirm_data("confirm:data_field_id");'); 

      return; 

     } else { 

      var confirmidarray = confirm_data_field_id.split(':'); 

      thedata = document.getElementById(confirmidarray[1]); 

      confirmthedata = document.getElementById(confirm_data_field_id); 

      if(thedata.value == confirmthedata.value) return true; 
      else { 

       thedatalabel = document.getElementById('label_' + thedata.id); 
       confirmthedatalabel = document.getElementById('confirm:label_' + thedata.id); 

       alert('ERROR: Los datos que ha ingresado en los campos de informacion \n\n' + thedatalabel.innerHTML + '\n' + confirmthedatalabel.innerHTML + '\n\n NO COINCIDEN. \n\n Para proceder con su pago agregue la informacion correcta.'); 

       return clear_fields(confirmidarray[1], confirmidarray[0] + ':' + confirmidarray[1]); 

      } 

     } 

    } 

這究竟是爲什麼?

我需要做些什麼改變?

謝謝

回答

1

在某些瀏覽器,一個alert()可以觸發焦點事件(因爲焦點轉到警告框,然後返回頁面之後)。在調試這類問題時,最好使用console.log(),它不會混淆焦點來記錄正在發生的事情,然後只需查看日誌即可查看真正發生的情況,而無需更改行爲。

+0

這隻發生在手機網站,Windows手機,iPhone等...如果我改變onblur到onchange,我沒有得到雙重或tripple警報。當焦點沒有改變時,onchange的onchange與onblur有什麼不同? – IberoMedia

+0

您是否理解我的意見,即將警報()導致焦點更改,以便在某些瀏覽器中觸發模糊事件?這種特定行爲因瀏覽器而異,所以如果您在某些地方看到它,而不是其他地方,則不會感到意外。因爲這個問題,在onblur上放置一個警報對瀏覽器來說是一個糟糕的設計。 – jfriend00

+0

呃,起初我並不完全明白,但是在發表評論之後,我不得不仔細考慮一下onblur警報會發生什麼......是的,我現在明白了......我認爲所有的onblur字段都是受焦點影響,並且由於只有一個會被選中,警報將被無縫觸發?因此額外的警報框?謝謝。順便說一下,我不使用console.log()...我是一個新手...有沒有一個頁面或某處我可以獲得有關如何使用此實用程序的信息(可在Chrome,Firefox中使用和其他一些瀏覽器)?再次感謝您 – IberoMedia