我想在JavaScript中实现这一点:
function changeAttributeValue(theAttribute, numberOfPixels)
{
theAttribute = numberOfPixels + "px";
}
changeAttributeValue(myImage.style.left, 50);
changeAttributeValue(myImage.style.top, 80);
changeAttributeValue(myCanvas.width, 600);
前两个调用应移动图像,第三个调整应调整画布的宽度。
但是这样,只传递了传递的变量的值,所以没有任何反应。
有人知道如何解决这个问题吗?
答案 0 :(得分:4)
你可以这样做。
function changeAttributeValue(obj, propName, numberOfPixels) {
obj[propName] = numberOfPixels + "px";
}
changeAttributeValue(myImage.style, "left", 50);
changeAttributeValue(myImage.style, "top", 80);
changeAttributeValue(myCanvas, "width", 600);
答案 1 :(得分: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)
理论是合理的,但代码是未经测试的。因人而异。 : - )
答案 2 :(得分:2)
如果我实际发布并评论我在评论中提供的内容,这可能很有用。
即便:
function setDim(attr, modifier, pix) {
if (!modifier) {
this[attr] = pix + 'px';
} else {
this[attr][modifier] = pix + 'px';
}
}
现在,这是如何工作的? this
引用范围。如果您只是直接调用它:
setDim('style', 'width', 50);
只需拨打window
或global
范围即可。实际上,这是为了使用el.call()
或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()
is used多少。如果你“得到”它们,这两种方法真的很有用。