d3选择.attr,.property等setter方法'值未定义时的行为

时间:2015-08-17 10:24:48

标签: javascript d3.js

拨打d3.select("input[type=checkbox]").property("checked", undefined)时的预期行为是什么?

是否应该将其视为假,因此将checked属性设置为false /删除,或者将其视为无值,从而调用.property("checked"),getter?< / p>

1 个答案:

答案 0 :(得分:1)

属性方法

d3_selectionPrototype.property = function (name, value) {
    if (arguments.length < 2) {
        if (typeof name === "string") return this.node()[name];
        for (value in name) this.each(d3_selection_property(value, name[value]));
        return this;
    }
    return this.each(d3_selection_property(name, value)); 
}; 

当您传入值undefined时,由于您已经传入了2个参数,它会调用d3_selection_property(对于选择中的每个条目),这是

function d3_selection_property(name, value) {
    function propertyNull() {
        delete this[name];
    }
    function propertyConstant() {
        this[name] = value;
    }
    function propertyFunction() {
        var x = value.apply(this, arguments);
        if (x == null) delete this[name]; else this[name] = x;
    }
    return value == null ? propertyNull : typeof value === "function" ? propertyFunction : propertyConstant; }

当值=== undefined时,非严格比较(最后一行)value == null的计算结果为true,因此调用propertyNull

delete this[name];

但是,由于checked属性实际上并不在this对象上(它实际上是DOM元素原型链的一级),这实际上什么也没做。

总而言之,它返回选择(如所有可链接的d3方法那样),但它不会修改实际的检查值。

根据文档 - https://github.com/mbostock/d3/wiki/Selections

  

如果指定了value,则将具有指定名称的属性设置为   所有选定元素的指定值。

但根据当前的代码,如果指定的值为undefined

,则不会发生