动态添加的HTML div元素的加载事件

9
我该如何制作类似于这样的东西?
<div id='myDiv' onload='fnName()'></div>

无法使用

window.onload = function () {
    fnName();
};

or

$(document).ready(function () {fnName();});
元素是动态的。该
内容由XML XSL生成。

有什么想法?


XSL 如何动态添加元素?它不是只用来转换 XML 到 HTML 吗?如果您的 HTML 是通过 XLS 生成的,那么 jQuery 的 $(document).ready(f); 仍然有效,因为它在 DOM 准备就绪时触发。 - Albireo
请参见:https://dev59.com/wW855IYBdhLWcg3w-JQr - Ciro Santilli OurBigBook.com
9个回答

10

如果您是动态注入

元素(因为文档可能已经加载),onload属性可能不会触发,但也许它仍然有效...?

但是,您可以轮询该元素,只需执行此操作即可(类似于YUI的onContentAvailable):

// when the document has loaded, start polling
window.onload = function () {
    (function () {
        var a = document.getElementById('myDiv');
        if (a) {
            // do something with a, you found the div
        }
        else {
            setTimeout(arguments.callee, 50); // call myself again in 50 msecs
        }
    }());
};

或者你可以更改标记(我不了解XSL),使其类似于以下内容:

在页面前面:

<script type="text/javascript">
    function myDivInserted() {
        // you're probably safe to use document.getElementById('myDiv') now
    }
</script>
你生成的XSL标记语言代码为:
<div id="myDiv"></div>
<script type="text/javascript">
    myDivInserted();
</script>

这有点巧妙,但应该能够工作。


哦,我可能误解了你的问题,但是如果fnNamt()或fnName()需要<div id="myDiv">,那么你需要找到一种方法来推迟直到该<div>出现。 - Dan Beam

10
您可以使用DOM变动观察器
每当dom发生更改时,它都会通知您,例如当新的div插入到目标div或页面中时。
我正在复制/粘贴示例代码。
// select the target node
var target = document.querySelector('#some-id');

// create an observer instance
var observer = new MutationObserver(function(mutations) {
  mutations.forEach(function(mutation) {
    console.log(mutation.type);
  });    
});

// configuration of the observer:
var config = { attributes: true, childList: true, characterData: true }

// pass in the target node, as well as the observer options
observer.observe(target, config);

// later, you can stop observing
observer.disconnect();

4

如果你还没有使用jQuery,那么没有理由为了这个而开始使用它,你可以写成:

window.onload = function () {
    fnName();
};

3
您可以使用jQuery。以下代码将放置在您的标签中。
$(document).ready(function() {
    // Your fnNamt function here
});

编辑

Kobi提出了一个很好的观点。

你也可以这样写 $(document).ready(function(){fnNamt();});, 或者更简单地写成 $(document).ready(fnNamt);, 甚至可以写成 $(fnNamt)


2
你也可以写成 $(document).ready(function(){fnNamt();});,或者更简单的 $(document).ready(fnNamt);,甚至是令人困惑的 $(fnNamt); - Kobi
我无法使用这些div元素,因为它们是动态的。div内容是由XML XSL生成的。 - Harold Sota
2
@Haroldis - 你的问题肯定需要提及更多细节。尝试编辑它以包含更多详细信息。 - Kobi
1
嗨Ardman,也许他不想包含一个库来做这样的事情...找出jQuery如何实现这个功能会很好 :) - stecb

2

使用纯JS而不是jQuery,例如:

<script type="text/javascript">
function bodyOnLoad() {
  var div = document.getElementById('myDiv');
  // something with myDiv
  ...
}
</script>

<body onload="bodyOnLoad()">
....
<div id='myDiv'></div>
....
</body>

2

我曾经遇到过同样的问题,后来搜索了一下找到了解决方法。

在我的情况下,javascript会将index.html的头部添加到一个tab content html文件中进行加载,当onload时,我想将该tab添加到dom中、显示它,并做其他js操作以更改tab的样式。

我加入了.onload = function(event) {...}这一行代码。

var link = document.createElement('link');
link.rel = 'import';
link.href = 'doc.html'
link.onload = function(event) {...};
link.onerror = function(event) {...};
document.head.appendChild(link);

这个方法非常有效,也许能帮助其他研究人员:)
我在HTML5 Imports: Embedding an HTML File Inside Another HTML File上找到了它。

这仅适用于链接、图像或 iframe(任何具有 href 或 src 的内容)。不适用于任何其他标准 HTML 元素。 - mplungjan

1

这个问题可以考虑使用jQuery/ready(..)吗?

就像这里所示:http://api.jquery.com/ready#fn

在你的问题背景下,

$(document).ready(function () {fnNamt();});

0
我建议使用圆形函数:
SwitchFUnc = false;

function FuncName(div_id) {
    var doc = window!=null ? window.document : document;
    var DivExists = doc.getElementById(div_id);

    if (DivExists) {
        //something...
        SwitchFunc = true;  //stop the circle
    }
}

while (SwitchFunc!=true) {
    FuncName('DivId');
}

1
这将是一件非常糟糕的事情。在繁忙等待期间,您会使CPU飙升。 - HaxElit
1
这是一个可怕的想法。JavaScript 是单线程的,并且会阻塞 UI 线程。它运行并阻塞直到某些事件发生,事实上防止那些等待事件发生,导致死锁。 - icktoofay

0
我建议您使用jQuery。
步骤:
1. 从这里http://code.jquery.com/jquery-1.5.min.js下载Jquery库。
2. 在您的HTML头部创建一个脚本标签,并使用下面的代码。
$(document).ready(function() {
// 在此编写您的代码..
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接