我有这个函数(在页面加载时)使用“css”jQuery方法改变我的边距......
function page_change() {
var h = window.location.hash;
switch (h) {
case 'home':
$('.page-slide-box').css({marginLeft: 0});
break;
case 'history':
$('.page-slide-box').css({marginLeft: '-820px'});
break;
// more cases here.....
}
}
...但是在加载页面后,我想改为动画更改。我以为我可以使用replace()来改变现有的函数(而不是编写另一个冗余函数),如下所示:
window.onhashchange = function() {
var get = page_change.toString();
var change = get.replace(/css/g, 'animate');
page_change();
}
这在我的page_change()函数中成功地将“css”的所有实例更改为“animate”。更换字符串后如何动态更改此功能?或者这只是一个坏主意?
答案 0 :(得分:4)
在你的例子中,我会说这是一个糟糕的主意。为什么不简单地定义1个可以同时执行这两个功能的函数,并相应地使用它:
var page_change = function(e)
{
var method = e instanceof Event ? 'animate' : 'css';
switch (location.hash)
{
case 'home':
$('.page-slide-box')[method]({marginLeft: 0});
break;
//and so on...
}
};
直接调用此函数,它将设置css,使用它如下:
window.onhaschange = page_change;
并且animate
而不是使用css
方法。易
如果您想轻松测试,可以试试这个:
var page_change = function(e)
{
var method = e instanceof Event ? 'animate' : 'css';
console.log(method);
};
document.body.onclick = page_change;
page_change();//logs css
//click the body and...
//animate will be logged
基本上,这是如何工作的。
定义像这样的函数(匿名函数,赋值给变量或引用)的额外好处是你可以轻松地为同一个变量分配一个新函数:
var myFunc = function(){ console.log('foo');};
myFunc();//logs foo
myFunc = function(){console.log('bar')};
myFunc();//logs bar
这也可能对你有用......当然。您甚至可以存储旧功能:
var myFunc = function(){ console.log('foo');};
myFunc();//logs foo
var oldMyFunc = myFunc;
myFunc = function(){console.log('bar')};
myFunc();//logs bar
oldMyFunc();//logs foo
暂时解决这个问题,找到最符合您需求的方法(这可能是我在这个答案中谈到的事情的组合)
答案 1 :(得分:0)
您仍然需要创建一个new Function()
,其中正文是已替换css
的正文,因此只需编写另一个函数,您可以在其中放置延迟和回调以及其他所需的所有内容animate()
{1}}。
答案 2 :(得分:0)
指定一个布尔值以反映页面加载状态(比如loadstatus
),并使用它来确定操作。您可以使用bracket notation触发正确的操作:
function page_change() {
var h = window.location.hash,
action = loadstatus ? 'animate' : 'css';
// ^ set loadstatus to true after page load.
switch (h) {
case 'home':
$('.page-slide-box')[action]({marginLeft: 0});
// ^ action used here
break;
case 'history':
$('.page-slide-box')[action]({marginLeft: '-820px'});
break;
// more cases here.....
}
}