【发布时间】:2009-06-15 16:04:51
【问题描述】:
我正在尝试使用 jQuery 设置小部件框架,因此我需要通过解析小部件的 xhtml 并包含在框架页面中来导入 java 脚本。问题是这可能会导致命名空间的污染。是否可以在运行时将 java 脚本加载到命名空间中?
也许我忽略了一些更好的方法?
谢谢, 皮特
【问题讨论】:
标签: javascript jquery dynamic
我正在尝试使用 jQuery 设置小部件框架,因此我需要通过解析小部件的 xhtml 并包含在框架页面中来导入 java 脚本。问题是这可能会导致命名空间的污染。是否可以在运行时将 java 脚本加载到命名空间中?
也许我忽略了一些更好的方法?
谢谢, 皮特
【问题讨论】:
标签: javascript jquery dynamic
正如 Josh Stodola 所说,在运行时创建变量不是问题
var holdsWidgetUUID = "widgetUUIDValue";
eval(holdsWidgetUUID + "= (" + data + ")");
alert(eval(holdsWidgetUUID));
或者如果你喜欢
var UUID = "widgetUUID";
var holdsWidgetUUID = "widgetUUIDValue";
window["widgets"] = new Array();
window["widgets"][holdsWidgetUUID] = data;
alert(window["widgets"][holdsWidgetUUID]);
问题是让加载的 javascript 可以像 dynamicvariablename.methodname() 一样调用
如果您对包含的 javascript 强制执行某种编码实践,我有一个可行的解决方案。也许这会让你朝着正确的方向前进。
这是一个小部件 javascript (works.js)。请注意,它是一个带有内部定义的字段和方法的 javascript“类”。它本身保持命名空间污染低,并允许我们实现所需的调用形式 x.getInfo()
function () {
this.type = 1;
this.color = "red";
this.getInfo = function() {
return this.color + ' ' + this.type + ' widget';
};
}
这是在运行时将其包含在命名空间中的文件
<html>
<head>
<title>Widget Magic?</title>
<script type='text/javascript' src='jquery.js'></script>
<script type='text/javascript'>
var UUID = "widgetUUID";
var holdsWidgetUUID = "widgetUUIDValue";
window["widgets"] = new Array();
$.get("works.js", function(data) {
window["widgets"][holdsWidgetUUID] = eval("(" + data + ")");
$(document).ready(function() {
window["widgets"][holdsWidgetUUID] = new (window["widgets"][holdsWidgetUUID])();
alert(window["widgets"][holdsWidgetUUID].color);
alert(window["widgets"][holdsWidgetUUID].getInfo());
});
});
</script>
</head>
<body>
<p>Just some stuff</p>
</body>
</html>
【讨论】:
你可以做这样的事情......
var myOtherFramework = null;
$.get("myScript.js", function(data) {
myOtherFramework = eval("(" + data + ")");
});
然后像...一样引用它
myOtherFramework.funcName();
【讨论】:
您加载的 javascript 本身应该已经在使用唯一的命名空间。
【讨论】: