0

我有一个网页,它在下面的函数调用时加载 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 时,我可以看到加载了这么多相同的 javascript。

为了解决这个问题,我想做的是 -

1)如果未加载javascript,则调用该函数时,将其加载并附加到head。2)如果调用函数并且它是已经存在于头部部分的相同javascript,则不要加载新的,而是运行已经存在的javascript

它可以完成还是在javasctript中是不可能的..任何人都可以分享一些想法如何做到这一点..

先感谢您。

4

1 回答 1

1

这个问题表明需要重构。但回答实际问题::-)

1)如果未加载javascript,则调用该函数时,将其加载并附加到head。

这部分很简单,只需遍历 中的现有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)如果调用函数并且它是已经存在于头部部分的相同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]();
于 2013-02-16T09:51:46.830 回答