1

我知道

“Onload 在 DOM 完全加载时执行。这意味着它在页面结束后执行。当您想要在文档完全加载时执行某些任务时,这很有用。”

但是为什么这些代码在 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 是由名为“SharePoint 2010”的微软产品生成的,丑陋,而不是“最佳实践”,但我必须让它在 chrome 中工作......

4

6 回答 6

5

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

于 2013-08-27T07:23:50.317 回答
2

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

首先,您必须将document.write语句包装在script标签中,

其次,使用document.write是不必要的(应该被认为是一种不好的做法)。您可以简单地将脚本添加到您的页面,只需将script标签放在heador中body

<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>

最好使用 JavaScriptonload为事件添加 EventListener,而不是使用属性:load

window.addEventListener('load', function () {
    if (typeof(_spBodyOnLoadWrapper) != 'undefined') {
        _spBodyOnLoadWrapper();
    }
});
于 2013-08-27T07:30:42.773 回答
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 的使用不是一个好主意。上面的代码动态地将一个新的脚本标签添加到当前页面的页眉中。它检测何时加载此脚本并执行您的函数。

于 2013-08-27T07:23:53.297 回答
0

只需将脚本标签放在不带document.write. 其次,我建议您将要执行的代码也放在 head 部分中的单独函数中,但是下面的示例也可以正常工作(另请参见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>
于 2013-08-27T07:29:31.060 回答
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)中更直接地更新页面内容的效果。

于 2013-12-04T06:13:14.040 回答
0

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

于 2016-10-12T06:54:29.580 回答