Chrome - 无法使用

时间:2013-08-27 07:18:42

标签: javascript

我知道

  

"当DOM完全加载时执行Onload。这意味着它在执行之后执行   页面结束。当您想要执行某项任务时,这非常有用   文件已全部借出。"

但为什么这些代码不能在chrome中工作(spBodyOnLoadWrapper是" init.debug.js"中定义的函数,未调用此函数):

 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns:o="urn:schemas-microsoft-com:office:office" lang="en-us" dir="ltr">
    <head>
   <script type="text/javascript">
    document.write('<script type="text/javascript" src="/_layouts/1033/init.debug.js?rev=Cn3X2qRiBI8U52EFeStGwg%3D%3D"></' + 'script>');
     </script>
    </head> 
    <body scroll="no" onload="if (typeof(_spBodyOnLoadWrapper) != 'undefined') _spBodyOnLoadWrapper();" class="v4master">
    </body>

这些HTML是由名为&#34; SharePoint 2010&#34;,丑陋,而不是&#34;最佳做法&#34;的Microsoft产品生成的。 ,但我必须让它在chrome中工作......

6 个答案:

答案 0 :(得分:5)

document.write()是JavaScript代码,因此必须包含在script元素中。

答案 1 :(得分:2)

我在HTML中看到了一些错误/不良做法:

首先,您必须将document.write语句包含在script标记

其次,使用document.write是不必要的(并且应该被认为是一种不好的做法)。 您只需将script标记放在headbody中即可将脚本添加到您的网页中:

<script type="text/javascript" src="/_layouts/1033/init.debug.jsrev=Cn3X2qRiBI8U52EFeStGwg%3D%3D"></script>

如果要动态指定脚本源,可以创建script元素,设置其来源并将其添加到文档中:

<script type="text/javascript">
    var headElement = document.getElementsByTagName('head')[0],
        script = document.createElement('script');
    script.setAttribute('src', '/_layouts/1033/init.debug.jsrev=Cn3X2qRiBI8U52EFeStGwg%3D%3D');
    script.setAttribute('type', 'text/javascript');
    headElement.appendChild(script);
</script>

不是使用onload属性,而是使用JavaScript为load事件添加EventListener更好:

window.addEventListener('load', function () {
    if (typeof(_spBodyOnLoadWrapper) != 'undefined') {
        _spBodyOnLoadWrapper();
    }
});

答案 2 :(得分:0)

我建议使用以下脚本:

window.onload = function() {
    var head = document.getElementsByTagName('head')[0];
    var script = document.createElement('script');
    script.type = 'text/javascript';
    script.onreadystatechange = function () {
        if(this.readyState == 'complete') {
            if (typeof(_spBodyOnLoadWrapper) != 'undefined') {
                        _spBodyOnLoadWrapper();
                    }
        }
    }
    script.src = '/_layouts/1033/init.debug.js?rev=Cn3X2qRiBI8U52EFeStGwg%3D%3D';
    head.appendChild(script);
}

document.write的用法并不是一个好主意。上面的代码动态地将新脚本标记添加到当前页面的标题中。它会检测何时加载此脚本并执行您的功能。

答案 3 :(得分:0)

只需将脚本标记放在头部,而不是document.write。其次,我建议你将你想要执行的代码放在一个单独的函数中以及你的头部中,但是下面的例子也可以正常工作(参见JS Bin):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns:o="urn:schemas-microsoft-com:office:office" lang="en-us" dir="ltr">
<head>
<script type="text/javascript" src="/_layouts/1033/init.debug.js?rev=Cn3X2qRiBI8U52EFeStGwg%3D%3D"></script>
</head>

  <body scroll="no" onload="javascript:if (typeof(_spBodyOnLoadWrapper) != 'undefined'){ _spBodyOnLoadWrapper();}" class="v4master">
</body>

答案 4 :(得分:0)

我遇到了这个问题并尝试了这里建议的解决方案,但它们没有用。更多搜索表明这是Chrome中的一个错误,至少可以追溯到2009年:

http://productforums.google.com/forum/#!topic/chrome/7VIpByhmU3U

问题是body.onload(以及window.onload)在网页完全加载之前触发了,显然在我的情况下,因为我正在加载大图像的时间到 - 负载随净流量而变化。解决方法是将您的JavaScript放入之后任何引用的HTML,但在结束标记之前:

<script type="text/javascript">
     if (typeof(_spBodyOnLoadWrapper) != 'undefined') _spBodyOnLoadWrapper();
</script>

这对我来说也有效,可以在其他不会发生错误的浏览器(Firefox,Safari)中更快地更新页面内容。

答案 5 :(得分:0)

检查您是否有2个onload事件。