【问题标题】:How can I change this function so that I can call it from the parent element?如何更改此函数以便可以从父元素调用它?
【发布时间】:2013-02-28 04:45:02
【问题描述】:

我正在使用这个函数来替换标准的 html 复选框,我想从 label for 属性而不是它当前所在的 <div> 属性中调用它。

我不确定如何修改它,以便我可以调用孩子<div> 而不是onclick="toggle_colorbox(this);"。我将它用于大量复选框,所以我不想通过 id 调用它。

HTML

<label for="color_Black"><div style="background-color: #000000" class="color" onclick="toggle_colorbox(this);"><div class=CheckMark>&#10003;</div>
<input type="checkbox" name="color[]" value="Black" id="color_Black" class="cbx"/></div>Black</label>

JS

function toggle_colorbox(span) {
    div = span.getElementsByTagName('div')[0];
    cb = span.getElementsByTagName('input')[0];
    if (cb.checked == false) {
        div.style.visibility = "visible";
        span.className = "color ColorboxSelected";
        cb.checked = true;
    }
    else {
        div.style.visibility = "hidden";
        span.className = "color";
        cb.checked = false;
    }
}

CSS

.color { border: 1px solid silver; vertical-align:baseline; margin-right:4px; width: 1.65em; height:1.65em; font-size:8px;float:left;  }
.color input {height: 100%; width: 100%; font-size:200%;}
.ColorboxSelected {opacity: 0.5; filter: alpha(opacity = 50);}  
.ColorboxSelected .CheckMark {visibility: visible; }        
.CheckMark {position:relative; top:-2px; vertical-align:middle; text-align:center ; color:white; font-family: Arial Narrow; font-size:1.6em;  display:block; visibility:hidden; }   /* text-shadow: black 0.1em 0.1em 0.2em;*/
.cbx { visibility:hidden; display:none;}

【问题讨论】:

  • 为什么标记为 jQuery,为什么不标记为 javascript?
  • 请注意,如果您使用 jQuery,则不应使用 onclick=
  • 我只想指出,“for”属性通常是used to associate a label with an input
  • @contactmatt 实际上,您可以在 HTML 中将 label 包裹在 input 周围。然后你省略了for 属性。
  • HTML 可以让你做各种疯狂的事情,比如省略一半的标签。这就是为什么手动解析如此困难的原因。

标签: javascript jquery function call children


【解决方案1】:

如果你想从标签中调用它,你可以像这样获取子 DIV...

<label for="color_Black" onclick="toggle_colorbox(this.children[0]);">

【讨论】:

  • 我发现这会导致另一个功能 - 一个在另一个容器中显示所选值的功能 - 停止正常工作:-( (每次选中或未选中时,它都会将每个值添加 2 倍)任何建议我该如何纠正?每个元素都是一个列表项,我遇到问题的函数是: $(".dropdown_container ul li a").click(function () { var text = $(this) .find("input").val(); var currentHtml = $(".dropdown_box span").html(); $(".dropdown_box span").html(currentHtml.replace('Colors','') ); $(".dropdown_box span").append(text); });
  • 感谢另一位出色的 SO 成员:stackoverflow.com/a/15263557/1056713,我解决了这个问题。我选择了这个答案是因为它很简单(@SimonC 的方法非常优雅,并且得到了肯定的支持,但在我需要修改它时略高于我的技能)。
【解决方案2】:

您可以执行以下操作。这将设置切换功能以在单击任何具有toggle 类的标签时触发。它会直接在该标签中查找 div 和复选框。

HTML:

<label class="toggle" for="color_Black"><div style="background-color: #000000" class="color"><div class=CheckMark>&#10003;</div>
<input type="checkbox" name="color[]" value="Black" id="Checkbox1" class="cbx"/></div>Black</label>

JS:

$(".toggle").on("click", function toggle_colorbox() {
    $div = $(this).children('div');
    $cb = $(this).find('input');
    $innerdiv = $div.find('div');

    if (!$cb.is(':checked')) {    
        $innerdiv.show();
        $div.addClass("ColorboxSelected");
        $cb.prop('checked', true);
    }
    else {
        $innerdiv.hide();
        $div.removeClass("ColorboxSelected");
        $cb.prop('checked', false);
    }
    return false;

});

小提琴:http://jsfiddle.net/aLJwH/1/

编辑:现在回答包含工作代码!

【讨论】:

  • 这绝对是我想要做的,但我无法让这段代码正常工作:-(在你发布的小提琴中,当我双击它时,整个颜色框都被隐藏了,并且由于某种原因,当我将其复制并粘贴到文档中时它根本不起作用。
  • :-D 2 个小问题 - 当你点击文本时,新的 fiddle 可以完美地工作,但是当你点击颜色框时它就不能工作了。此外,我发现这会导致另一个函数 - 一个在另一个容器中显示所选值的函数 - 当它们未被选中时停止删除值:-(你介意看看这个同时具有这两个功能的小提琴吗?jsfiddle.net/chayacooper/aLJwH/5
  • 在 Chrome 和 FF 中单击颜色框时对我有用。对于显示所选内容的框,这个怎么样? jsfiddle.net/aLJwH/6
  • 您对其他浏览器的看法是绝对正确的——我在 Chrome、Safari 和 IE 中检查了它,它在这些浏览器中都可以使用,但奇怪的是它在 FF 中对我不起作用(v. 18.0 .2) :-( 你认为这是特定版本的问题吗?
  • 您发布的删除值的解决方案很棒 :-) 不幸的是,您使用的代码比我先进一点,所以我无法弄清楚在哪里调整内容以修改函数或将其与其余代码集成(即替换字符串以格式化显示的值,或使用长度来评估检查的选项数),或者当我想在其他地方做类似的事情时。您能否向我解释一下新字段与我之前使用的字段之间的关系(或者如果更简单,请将 dropdown_container 值分离回它自己的函数)?
猜你喜欢
  • 2012-03-09
  • 1970-01-01
  • 2012-03-13
  • 1970-01-01
  • 1970-01-01
  • 2017-05-20
  • 2011-01-05
  • 1970-01-01
  • 2010-12-04
相关资源
最近更新 更多