2009-08-22 55 views
1

我想从我的自定义js文件加载statcounter脚本。原来的剧本是这样的:加载javascript计数器脚本的替代方法

<html> 
<head>...</head> 
<body> 
... 
<script type="text/javascript"> 
var sc_project=11111111; 
var sc_invisible=1; 
var sc_partition=11111111; 
var sc_click_stat=1; 
var sc_security="11111111"; 
</script><script type="text/javascript" src="http://www.statcounter.com/counter/counter_xhtml.js"></script> 
... 
</body></html> 

代码似乎设置变量,然后加载计数器脚本读取变量的值和它的工作。 我想这样调用计数器脚本:

// file: counters.js 
function CounterFromStatCounter() { 
    sc_project=11111111; 
    sc_invisible=1; 
    sc_partition=11111111; 
    sc_click_stat=1; 
    sc_security="11111111"; 

    var oHead = document.getElementsByTagName('HEAD').item(0); 
    var oScript= document.createElement("script"); 
    oScript.type = "text/javascript"; 
    oScript.src="http://www.statcounter.com/counter/counter_xhtml.js"; 
    oHead.appendChild(oScript); 
} 

// main page 
<html> 
<head> 
... 
<script type="text/javascript" src="counters.js"></script> 
... 
</head> 
<body> 
... 
<script type="text/javascript"> 
    CounterFromStatCounter(); 
</script> 
... 
</body></html> 

代码似乎工作:脚本元素引用StatCounter的脚本出现在部分,因为它应该,但没有访问被记录 - 这意味着我的脚本中设置的变量不能被计数器脚本加载。

我在做什么错?

回答

1
var CounterFromStatCounter = function() { 
    var sc_project = 11111111, 
    sc_invisible = 1, 
    sc_partition = 11111111, 
    sc_click_stat = 1, 
    sc_security = "11111111", 
    oHead = document.getElementsByTagName('head').item(0), 
    oScript= document.createElement("script"); 
    oScript.setAttribute("type", "text/javascript"); 
    oScript.setAttribute("src", "http://www.statcounter.com/counter/counter_xhtml.js"); 
    oHead.appendChild(oScript); 
} 

我已经看过了上面的代码更密切,这里是我的想法:

1)这是怎样的代码看起来应该一次美化和简化为函数中的单个var命令没有任何隐含的全局变量,除了函数名称本身。

2)每次在每个用户加载页面时,动态创建的来自客户端代码的内容都会被销毁。因此,您可能不希望使用JavaScript编写输出作为提供数据参考点的任何方式。我建议在服务器端完全做到这一点,以提高效率。如果您必须使用JavaScript,则需要写入一些中间数据存储,如使用xmlHttpRequest对象连接到的JSON文件。

3)我不会推荐从客户端动态地向文档头部写任何东西,因为浏览器之间的DOM有不同的解释,而且一旦头部被加载,浏览器没有理由再次读取新的信息。

4)要成为最有效的脚本,应该在关闭body标记之前引用的外部文件中,因为脚本解释会阻止IE中的并行下载。因此,将脚本放在首位会导致IE中的页面加载速度大大降低。

5)我将“HEAD”更改为“head”,因为JavaScript和XHTML都区分大小写。

6)我还改变了属性添加到动态创建的脚本标签以使用DOM方法的方式。我不知道这是否是更正确的方法,但它肯定更符合标准。

+0

感谢您的帮助,但我正在尝试将调用statcounter脚本移至单独的文件。由于statcounter脚本不在我的控制之下,因此我必须在我的文件中将变量设置为全局变量才能用于其他脚本 - 这仍然不起作用,但它可能是statcounter站点的问题。 +1为您的答案的其余部分。 – alexandrul 2009-08-23 10:41:50

2

你正在做一些错误的事情。

1)您可能未验证您的代码。转到http://jslint.com并验证您的JavaScript。

2)不要将JavaScript写入HTML。这有强迫所有代码位进入全局名称空间的趋势,这很可能与其他任何JavaScript代码产生冲突。

3)仅在关闭正文标记之前引用外部JavaScript文件。脚本解释阻止IE中的并行下载。

完成这三个,然后回来寻求更多帮助。

+0

3)待办事项 – alexandrul 2009-08-22 17:28:59

+0

2)考虑到statcounter脚本在加载时需要运行并需要访问sc_ *变量,还有哪些其他选项? – alexandrul 2009-08-22 17:29:59

+0

1)当没有选项被选中时,JSLint只给出一个错误:“全局隐含:sc_project 2,sc_invisible 3,sc_partition 4,sc_click_stat 5,sc_security 6,document 8,9”。选择“The Good Parts”选项,它只会伤害我所有的小小感受。 – alexandrul 2009-08-22 17:35:00

1

定义变量globaly并写下如下的js。

window.attachEvent('onload', function() { 
    document.write('<script type=text\/javascript src=blabla.com\/counter.js><\/sc' + 'ript>'); 
}); 

这应该在IE中工作。对于其他其他浏览器实现的addEventListener ...

+0

statcounter脚本的加载工作正常,我无法将sc_ *变量提供给statcounter脚本。 – alexandrul 2009-08-22 19:03:49

+0

在全球范围内定义变量是非常糟糕的做法。 – 2009-08-23 00:27:44

+0

它有多极?它能爆炸吗?来吧,它不超过五个变量,你认为它可以从脚本文件可以访问,如果变量没有为全部市场上的所有浏览器全球定义。 – 2009-08-23 09:12:12