将加载的javascript替换为新加载的javascript

时间:2013-02-16 09:38:57

标签: javascript javascript-events

我有一个网页,可以在下面的函数调用时加载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中无法实现..如果有人请分享一些想法怎么做...

提前谢谢你。

1 个答案:

答案 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]();