我有一个网页,可以在下面的函数调用时加载javascript。
loadjavascript:function(v_url)
{
if (v_url != indef && v_url != ' ') {
var filename = '../includes/javascript.php?url=' + v_url;
var fileref=document.createElement('script');
fileref.setAttribute("type","text/javascript");
fileref.setAttribute("src", filename);
if (typeof fileref!="undefined")
document.getElementsByTagName("head")[0].appendChild(fileref);
}
}
当我签入firebug时,我可以看到很多相同的javascripts。
要解决此问题,我想要做的是 -
1)当没有加载javascript时调用该函数然后加载它并追加到头部。 2)如果函数被调用并且它与头部中已经存在的javascript相同,则不要加载新的,而是运行已经存在的javascript 。
是否可以完成或者在javasctript中无法实现..如果有人请分享一些想法怎么做...
提前谢谢你。
答案 0 :(得分:1)
这个问题表明需要重构。但回答实际问题: - )
1)如果未加载javascript则调用该函数,然后加载它并追加到头部。
这部分很简单,只需遍历script
中现有的head
元素:
var head = document.getElementsByTagName('head')[0];
var list = head.getElementsByTagName('script');
var index, script, found;
found = false;
for (index = 0; !found && index < list.length; ++index) {
script = list[index];
if (script.src.indexOf('?url=' + v_url) !== -1) { // Or however precise you want to be
found = true;
}
}
if (found) {
// It was found, don't load it again
}
else {
// It wasn't found, load it
}
2)如果调用了函数并且它与head部分中已经存在的javascript相同,则不要加载新的javascript,而是运行已经存在的javascript。
此部分需要更改相关脚本。基本上,如果脚本看起来像这样:
function defineSomeFunction() {
// ...
}
function defineSomeOtherFunction() {
// ...
}
if (foo) {
bar();
}
if (thisCondition) {
thatAction();
}
// etc.
...需要对其进行修改,使其正在执行的所有内联事务(上面的两个if
语句)实际上由一个函数完成,如下所示:
function defineSomeFunction() {
// ...
}
function defineSomeOtherFunction() {
// ...
}
function inlineStuff() {
if (foo) {
bar();
}
if (thisCondition) {
thatAction();
}
// etc.
}
inlineStuff();
然后,当您检测到它已经加载一次,而不是再次加载时,只需调用inlineStuff
函数。
如果您有多个这些(看起来像这样),您需要确保inlineStuff
函数名称是唯一的,并且可以由v_url
推断或定义,所以你知道要调用什么函数。然后你可以通过在window
上引用它来调用它,因为那是所有全局变量的所在。
var functionName = figureOutFunctionNameFromURL(v_url);
window[functionName]();