【问题标题】:Jquery/Zend toggling element disabled not workingJquery / Zend切换元素禁用不起作用
【发布时间】:2011-07-22 16:08:35
【问题描述】:

我有一个 Zend 表单,它有两个复选框,如果第一个未选中,则第二个应该被禁用。

这两个元素是:

    $element = $this->createElement('checkbox','show_assessments');
    $element->setLabel('Do you want to view assessments?');
    $element->setAttrib('onchange', 'javascript:toggleElement("show_assessments", "show_expired")');
    $element->clearDecorators();
    $element->addDecorator('StandardTable');
    if($preferences['show_assessments'])
        $element->setValue(1);
    $this->addElement($element);
    $this->_elementNames[] = 'show_assessments';

    $element = $this->createElement('checkbox','show_expired');
    $element->setLabel('Include expired programs?');
    if(!$preferences['show_assessments'])
        $element->setAttrib('disable', true);
    $element->clearDecorators();
    $element->addDecorator('StandardTable');
    if($preferences['show_expired'])
        $element->setValue(1);
    $this->addElement($element);
    $this->_elementNames[] = 'show_expired';

我切换元素的Javascript函数是:

    function toggleElement(sender, receiver)
    {
        if (!sender || !receiver) return;
            if ($('#'+sender).is(':checked'))
            {
                    $('#'+receiver+' :input').removeAttr('disabled');
                    alert(receiver+' is now enabled');
            }
            else
            {
                    $('#'+receiver+' :input').attr('disabled', true);
                    alert(receiver+' is now disabled');
            }
            if ($('#'+receiver).is('checked'))
                    alert(receiver+' is checked');
            else
                    alert(receiver+' is not checked');
    } 

问题是最后一个 if 语句,检查接收器是否被检查,无论如何都是假的,并且接收器永远不会切换。有什么想法吗?

编辑:

第二个元素似乎总是有问题。我尝试反转它,所以 show_expired 是发送者,show_assessments 是接收者,这一次它可以判断 show_expired 何时被检查,但无法判断 show_assessments。

【问题讨论】:

    标签: javascript jquery zend-framework


    【解决方案1】:

    可能是你的 javascript 中有错字:

    function toggleElement(sender, receiver)
    {
        if (!sender || !receiver) return;
            if ($('#'+sender).is(':checked'))
            {
                    $('#'+receiver+' :input').attr('disabled', false); // <-- use attr('disabled', false instead)
                    alert(receiver+' is now enabled');
            }
            else
            {
                    $('#'+receiver+' :input').attr('disabled', true);
                    alert(receiver+' is now disabled');
            }
            if ($('#'+receiver).is(':checked')) // < -- should be .is(':checked')
                    alert(receiver+' is checked');
            else
                    alert(receiver+' is not checked');
    } 
    

    第二个 IF 语句错误地遗漏了 'checked' 之前的冒号。

    【讨论】:

    • 这使第二个警报起作用,因此它正确地识别出第二个元素是否已检查,但 disabled 属性仍未设置/删除。
    • 更新了我的答案,您应该使用.attr('disabled', false)'.attr('disabled', '') 而不是.removeAttr
    • 还是没有运气。我尝试删除 jQuery 并仅使用老式的 getElementById 并且它起作用了。
    • 好东西。我一直在 jQuery 中遇到disabled 的问题。
    【解决方案2】:

    不用 jQuery 也能正常工作

    function toggleElement(sender, receiver)
    {
    var sendEl = document.getElementById(sender);
    var recEl = document.getElementById(receiver);
    if (sendEl.checked)
        recEl.disabled = false;
    else
        recEl.disabled = true;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-07
      • 2011-01-20
      相关资源
      最近更新 更多