2011-09-14 50 views
2

我有一堆的控制多个其他控制:禁用/启用的按钮基于使用Javascript/jQuery的

form

当用户点击生成按钮,一个函数使用所有从值的其他控件生成一个字符串,然后放入标签文本框中。

所有其他控件可以具有null或空字符串的值。要求是,如果ANY的控件没有用户输入值,则“生成”按钮将被禁用。一旦全部控件有一个有效值,然后生成按钮启用。

使用Javascript/jQuery执行此操作的最佳方法是什么?

回答

0

这可以进一步优化,但应该让你开始:

var pass = true; 

$('select, input').each(function(){ 
    if (! ($(this).val() || $(this).find(':selected').val())) { 
     $(this).focus(); 
     pass = false; 
     return false; 
    } 
}); 

if (pass) { 
    // run your generate function 
} 

http://jsfiddle.net/ZUg4Z/

注:不要使用此:if (! ($(this).val() || $(this).find(':selected').val()))
这只是为了说明的目的。

+0

你能更新你的例子,我如何绑定控件更改事件? – link664

+0

@ link664 - 您不必绑定到更改事件。当用户点击你的“生成”按钮时,只需运行该代码即可。 –

+0

我想你可能误解了这个问题。我想基于其他控件中是否存在有效值来禁用/启用该按钮 - 即,如果值不全都是有效的,则用户不应该能够点击该按钮。 – link664

0

如果你想生成按钮以尽快用户按下一键启动,那么你可能想捕捉每个输入和每个选择框更改事件的按键事件。处理程序都可以指向一种启用/禁用“生成”按钮的方法。

function updateGenerateButton() { 
    if (isAnyInputEmpty()) { 
     $("#generateButton").attr("disabled", "disabled"); 
    } else { 
     $("#generateButton").removeAttr("disabled"); 
    } 
} 

function isAnyInputEmpty() { 
    var isEmpty = false; 
    $("#input1, #input2, #select1, #select2").each(function() { 
     if ($(this).val().length <= 0) { 
      isEmpty = true; 
     } 
    }); 
    return isEmpty; 
} 

$("#input1, #input2").keypress(updateGenerateButton); 
$("#select1, #select2").change(updateGenerateButton); 

上面假设您的输入标签具有“id”属性,如input1和select2。

0

此代码假定所有表单字段都具有空字符串的默认值。

$('selector_for_the_parent_form') 
    .bind('focus blur click change', function(e){ 

    var 
     $generate = $('selector_for_the_generate_button'); 

    $generate.removeAttr('disabled'); 

    $(this) 
     .find('input[type=text], select') 
     .each(function(index, elem){ 
      if (!$(elem).val()) { 
      $generate.attr('disabled', 'disabled'); 
      } 
     }); 

    }); 

基本上,只要一个事件冒泡到可能影响是否产生按钮应该被显示的形式,测试的任何输入是否具有空值。如果有,则禁用该按钮。

声明:我还没有测试过上面的代码,只是一次性写过。

+0

一个简单的bug就是'focus'和'blur'事件不会自行冒泡。 JQuery可能会在幕后做一些奇特的事情来让它们冒泡,或者你可以将它们改为focusin和focusout,但这只是一些需要注意的事情。 – sdleihssirhc

+0

谢谢你指出 - 我不知道这些没有泡沫。我发现了一个quirksmode文章,描述了使用事件捕获和focusin/focusout的解决方法,所以我拖动了jQuery源代码。如果您搜索“focusin”,您会发现一个专门为符合标准的浏览器应用捕获阶段处理程序的部分,以及针对IE的focusin部分。所以它看起来像jQuery将泡沫这些处理程序,即使规范不会。去jQuery! – jimbojw