3

我想在 JavaScript 中实现这一点:

function changeAttributeValue(theAttribute, numberOfPixels)
{
    theAttribute = numberOfPixels + "px";
}

changeAttributeValue(myImage.style.left, 50);
changeAttributeValue(myImage.style.top, 80);
changeAttributeValue(myCanvas.width, 600);

前两个调用应该移动图像,第三个调用应该调整画布的宽度。

然而,像这样,只是传递了传递变量的值,所以什么也没有发生。

有谁知道如何解决这个问题?

4

3 回答 3

4

你可以做这样的事情。

function changeAttributeValue(obj, propName, numberOfPixels) {
    obj[propName] = numberOfPixels + "px";
}

changeAttributeValue(myImage.style, "left", 50);
changeAttributeValue(myImage.style, "top", 80);
changeAttributeValue(myCanvas, "width", 600);
于 2012-08-18T00:39:10.350 回答
3

好吧,这是我的“解决方案”。

它的灵感来自 Jared Farrish 的评论。也就是说,这为可以使用的属性访问创建了一个“包装器”getter/setter 函数。我不在这里推荐它(因为它比需要的更复杂),但它可以用于其他地方很棒的东西。

function mkAccessor(obj, attribute) {
    return function (value) {
        if (arguments.length > 0) {
            obj[attribute] = value
        }
        return obj[attribute]
    }
}

function changeAttribute (accessor, value) {
    accessor(value)
}

changeAttribute(mkAccessor(myImage.style, "top"), 50)
changeAttribute(mkAccessor(myImage.style, "left"), 80)
var canvasWidthAccessor = mkAccessor(myCanvas, "width")
// somewhere later on
changeAttribute(canvasWidthAccessor, 600)
// or just
canvasWidthAccessor(600)

理论是合理的,但代码是未经测试的。YMMV。:-)

于 2012-08-18T00:44:32.253 回答
2

如果我真的发布并评论我在评论中提供的内容,这可能会很有用。

以机智:

function setDim(attr, modifier, pix) {
    if (!modifier) {
        this[attr] = pix + 'px';
    } else {
        this[attr][modifier] = pix + 'px';
    }
}

现在,这是如何工作的?this引用范围。如果您只是直接调用它:

setDim('style', 'width', 50);

这将简单地调用windoworglobal范围。实际上,这是为使用el.call()or传递范围而构建的el.apply(),或多或少相同,这取决于您希望如何将参数传递给函数。

你真的想怎么称呼它:

// Gives you the scope of the element #test1
var test = document.getElementById('test1');

然后可以像这样“调用”:

setDim.call(test, 'style', 'width', 50);

请注意,如果它只是一个属性(简单明了),请通过null

setDim.call(test, 'width', null, 50);

setTimeout()在这个小提琴中使用效果,但它不是必需的:

http://jsfiddle.net/userdude/tCz6j/2/

浏览一下 jQuery 核心源代码,看看.apply()使用了多少。如果你“得到”它们,这两种方法真的很有用。

于 2012-08-18T01:21:52.267 回答