我正在使用第三方CMS开发网站,我必须在内容的各个部分包含功能,具体取决于所显示的页面。为了减少每次页面加载时调用的函数数量,我想循环遍历一组函数,以便在触发它们之前检查它们是否存在。
然后在body onload上调用这个单个函数。
我修改了Javascript Array of Functions和How to implement an array of functions in Javascript?以及isFunction的代码。
我的理解是我可以将函数放在没有()的数组中并且它们不会被调用但是在我的Chrome控制台中,在数组中提到函数名称的行上会生成未捕获的引用错误。
e.g。 jb_underimage_height函数不在所有页面的代码中,因此当它不存在时会生成错误。
以下是目前的代码:
function jb_onloads() {
var functionArray = [
jb_category_price_POA,
jb_highlight_tech_columns,
jb_underimage_height,
jb_moveGuestButton,
jb_loginCheck,
jb_moveRefineSpan,
jb_style_from_url,
materials_dropdown,
jb_remove_search_spaces,
jb_init_social,
checkCookies,
jb_category_change_class,
jb_move_basket_text,
jb_style_form,
jb_checkNotifyEnvelope
]; // end of functionArray
$.each(functionArray, function(key, value) {
if(typeof functionArray[key] !== 'undefined' && typeof functionArray[key] === "function") { functionArray[key](); }
});
} // end of jb_onloads
答案 0 :(得分:1)
当我不得不这样做时,这就是我的解决方法。
function a() { alert ("I am a") };
function b() { alert ("I am b") };
var arr = [
typeof a === "function" && a || 0,
typeof b === "function" && b || 0,
typeof c === "function" && c || 0
];
arr.forEach(function(func) {
if(typeof func === "function") {
func();
}
});
答案 1 :(得分:0)
也许我们可以这样做:
1个函数定义:
if (typeof myFuncCollections == "undefined") // window.myFuncCollections
myFuncCollections = {};
myFuncCollections.func1 = function func1() {
console.log("func1");
};
//or
myFuncCollections['funcname'] = function funcname() {
console.log("funcname");
}
....
2 jb_onloads()
function jb_onloads() {
if (typeof myFuncCollections == "undefined")
myFuncCollections = {};
$.each(myFuncCollections, function(i) {
myFuncCollections[i]();
});
}
3在包含1和2之后调用jb_onloads()。并且在2脚本之前不需要包含1脚本。此外,在包含1脚本之后,您可以在jb_onloads之外的1脚本中使用任何函数。
由于使用全局值,请使用特殊前缀来命名您的" myFuncCollections"
答案 2 :(得分:-1)
您正在尝试向数组插入函数引用。但是如果没有定义函数,则该名称不存在,从而出现错误。
将它们添加为字符串
function jb_onloads() {
var functionArray = [
'jb_category_price_POA',
'jb_highlight_tech_columns',
'jb_underimage_height',
'jb_moveGuestButton',
'jb_loginCheck',
'jb_moveRefineSpan',
'jb_style_from_url',
'materials_dropdown',
'jb_remove_search_spaces',
'jb_init_social',
'checkCookies',
'jb_category_change_class',
'jb_move_basket_text',
'jb_style_form',
'jb_checkNotifyEnvelope'
]; // end of functionArray
$.each(functionArray, function(index, functionName) {
// assuming functions are in the global scope
var func = window[ functionName ],
funcType = typeof func;
if (funcType === "function") {
func();
}
});
} // end of jb_onloads