具有不同函数调用定义的共享JavaScript文件
Shared JavaScript File with Different Definitions of a Function Call
我有一个300行的javascript文件,它为ASP中的多个视图使用的部分视图设置jQuery事件处理程序和其他所需的函数。NET MVC应用程序。无论哪个视图使用分部,事件处理程序都能以相同的方式处理99%的所有内容。这个问题是关于1%的差异。
既然JavaScript没有接口,那么定义一个由一个或多个事件处理程序调用的函数是否安全?该事件处理程序处理单独文件中的不同内容,该文件根据使用的视图加载?如果没有,处理这种情况的最佳方法是什么?在其他语言中,我会在这种情况下使用接口和/或抽象类。
示例:
共享文件
$(document).ready(function() {
//shared variables here for methods
$(document).on('click', '.selectable-table tbody tr', function() {
//do shared actions
mySpecificFunction();
//finish shared actions (if necessary)
});
});
定义1.js
function mySpecificFunction() {
//do stuff
}
定义2.js
function mySpecificFunction() {
//do other stuff
}
视图将加载适当的脚本,例如:
<script src="definitionX.js"></script>
<script src="sharedScript.js"></script>
mySpecificFunction()
的"签名"(因为javascript而被大量使用)对于每个定义都是一样的,但我的直觉告诉我这是一种糟糕的做法。有没有更好/正确的方法或为此目的的设计模式?
我认为您可以在这里使用OOP方法,不需要抽象类或接口,而是可以使用对象(比其他语言更灵活)。
例如,您可以有一个具有共享代码的基本View
原型,然后加载特定的view1.js
、view2.js
,其中基本原型将使用特定代码进行扩展:
$(document).ready(function() {
// view is a view instance coming from the specific view.js
view.init();
});
// sharedScript.js, view prototype
var View = {
init: function() {
$(document).on('click', '.selectable-table tbody tr', function() {
// do shared actions
// ...
// do specific actions
this.mySpecificFunction();
});
},
mySpecificFunction: function() {
//do specific things, can be left empty in the "prototype" object
return;
}
};
// view1.js
var view = Object.create(View);
view.mySpecificFunction = function() {
alert('view 1');
}
// view2.js
var view = Object.create(View);
view.mySpecificFunction = function() {
alert('view 2');
}
视图将加载共享和特定的脚本:
<script src="sharedScript.js"></script>
<script src="view1.js"></script>
这只是一个可以改进的粗略想法,例如,您可能希望将所有js代码连接并压缩到一个文件中以进行生产。在这种情况下,来自view1.js
、view2.js
等的全局view
变量将成为一个问题。
一种改进可以是某种"路由器",它可以检测应该实例化的视图:
$(document).ready(function() {
router.when('/', function() {
view = HomePageView();
}).when('/about', function() {
view = AboutPageView();
});
view.init();
});
上面概述的方法可以工作,但就可维护性而言,这不是最好的方法。通过脚本标记添加一个或另一个文件以导入特定函数并不一定让另一个开发人员清楚地知道您实际上已经更改了共享代码中事件处理程序的行为。
一个简单的替代方案可以是,在每个视图中,您将部分视图包装在一个包含元素中,该元素具有一个标识css类,以区分此时所需的行为。
然后为这些不同的css类分别分配事件处理程序:
$(document).ready(function() {
//shared variables here for methods
$(document).on('click', 'div.type1 .selectable-table tbody tr', function() {
//do shared actions
mySharedActions();
mySpecificFunction1();
//finish shared actions (if necessary)
});
$(document).on('click', 'div.type2 .selectable-table tbody tr', function() {
//do shared actions
mySharedActions()
mySpecificFunction2();
//finish shared actions (if necessary)
});
});
这将允许您将所有特定函数放在一个地方,并使css类预测的变化行为变得明确以供未来的开发人员查看。
- 通过javascript/html访问twitter共享iframe
- 在Javascript服务器/客户端中共享对象定义
- Javascript创建函数,以便在其他函数之间共享变量
- 在javascript客户端和java服务器之间共享Google Analytics ClientID
- 在新表单上使用JavaScript创建多个共享点项目,但将下一页加载延迟到全部创建
- 关于node.js/javascript在文件之间共享变量
- Javascript ES6共享类变量
- 具有不同函数调用定义的共享JavaScript文件
- 共享javascript和样式表文件
- 可以在 iframe 之间共享 JavaScript 导入
- 在父帧和子帧之间共享 javascript 包含文件
- 共享 JavaScript sdk 在 IE7 和 IE8 上没有弹出
- 共享javascript属性
- 在多个nashorn脚本引擎之间共享JavaScript数组和对象
- 测试深度相等*与共享*JavaScript对象
- 在Rails中共享Javascript和Sass数据的最佳方式
- 存储,编辑和共享javascript变量值
- 在服务器和客户端之间共享JavaScript模型代码,这种方法有效吗
- Websphere Liberty 中的共享 Javascript 库
- 如何在Adobe AIR中的不同页面之间共享javascript对象