【发布时间】:2016-06-07 02:14:52
【问题描述】:
我创建了一个 JavaScript/jQuery 小部件,它需要能够多次嵌入到页面中,每个页面都有不同的变量设置。目前,最后加载的小部件正在覆盖各种变量。
这里是一个精简版,用于示例目的。
(function () {
var scriptName = "my.widget.js";
var TGW;
var jqueryPath = "https://ajax.googleapis.com/yada_yada...";
var scriptTag;
var jScript;
/******** Get reference to self (scriptTag) *********/
var allScripts = document.getElementsByTagName('script');
var targetScripts = [];
for (var i in allScripts) {
var name = allScripts[i].src
if(name && name.indexOf(scriptName) > 0)
targetScripts.push(allScripts[i]);
}
scriptTag = targetScripts[targetScripts.length - 1];
/******** Set jQuery noConflict *********/
if (window.TGW === undefined || window.TGW.fn.jquery !== jqueryVersion) {
loadScript(jqueryPath, initTGW);
} else {
initTGW();
}
function initTGW() {
TGW = window.jQuery.noConflict(true);
main();
}
function main() {
TGW(document).ready(function ($) {
loadParams();
});
}
function loadParams() {
jScript = TGW(scriptTag);
comments = jScript.data("comment");
}
})();
这里是它两次添加到网页的方式,评论数据属性的设置不同。
<script src='https://...my.widget.js' data-comment='yes'></script>
<script src='https://...my.widget.js' data-comment='no'></script>
根据上述情况,如果小部件中有一个假设按钮显示变量comments 的内容,则该变量将随机包含/显示“是”或“否”,具体取决于最后加载的小部件。
按下第一个小部件上的按钮时需要发生什么,是否显示“是”。当按下第二个小部件上的按钮时,它会显示“否”。
我认为这与命名空间或其他东西有关,但我不太了解。我认为将整个小部件包装在 (function () { 中作为匿名函数运行,这意味着所有变量都是独立的。
任何帮助表示赞赏
【问题讨论】:
-
你可能应该检查一些设计模式,例如addyosmani.com/resources/essentialjsdesignpatterns/book/… 另外,你不应该像那样多次加载你的脚本 - 只需加载一次基本模块并调用它任意次数不同的参数。
-
@Alex.Me 这是其他用户将添加到他们自己网站的小部件,它不属于我自己的网站。不过,我会检查该链接。谢谢。
标签: javascript jquery namespaces widget