35

我想在创建元素后调用一个函数。有没有办法做到这一点?

例子:

$("#myElement").ready(function() {
    // call the function after the element has been loaded here
    console.log("I have been loaded!");
});
4

9 回答 9

45

你是如何创建元素的?

如果您在静态 HTML 中创建它,那么只需使用.ready(handler)or .on("load", handler)。如果您使用的是 AJAX,那又是另一回事了。

如果您使用的是 jQuery 的load()函数,那么您可以在加载内容时运行一个回调:

$('#element').load('sompage.html', function(){ /* callback */ });

如果您使用的是 jQuery$.ajax$.get/$.post函数,那么会有一个成功回调:

$.ajax({
  url: 'somepage.html',
  success: function(){
    //callback
  }
});

如果您只是创建元素并像这样附加它:

$('body').append('<div></div>');

然后你可以这样做:

$('<div />', { id: 'mydiv' }).appendTo('body').ready(function(){ /* callback */ });

但这无关紧要 - 因为它是同步的(这意味着下一行代码在将元素添加到 DOM 之前不会运行...... - 除非你正在加载图像等)所以你可以这样做:

$('<div />', { id: 'mydiv' }).appendTo('body');
$('#mydiv').css({backgroundColor:'red'});

但实际上,说你可以这样做:

$('<div />', {id:'mydiv'}).appendTo('body').css({backgroundColor:'red'});
于 2011-06-17T13:07:02.973 回答
7

您可能想查看 jQuery实时事件。您将事件处理程序附加到现在匹配或在 DOM 中创建其他元素之后匹配的选择器。

因此,如果您有一个<ul>并且您动态创建新<li>项目,$(document).ready()您可以在您的中将选择器连接到事件处理程序,以便您的所有<li>元素都将为该事件连接。

这是一个演示的jsFiddle示例live

希望这可以帮助。

于 2011-06-17T13:04:07.080 回答
4

创建一个元素没有多大意义,除非它被插入到页面中。我认为这就是你所说的ready功能。

onLoad事件仅限于某些元素,不支持divorp元素。你必须选择:

您可以使用setInterval函数来检查元素的存在。找到元素后,您可以清除间隔:

var CONTROL_INTERVAL = setInterval(function(){
    // Check if element exist
    if($('#some-element').length > 0){
        // Since element is created, no need to check anymore
        clearInterval(CONTROL_INTERVAL);
    }
}, 100); // check for every 100ms

第二种也是更惯用的方法是在目标元素上添加一个变异观察者,并在目标发生变异时检查该元素是否是插入元素之一,即添加新元素:

let el = document.createElement("div");
el.innerHTML = "New Div";

const targetNode = document.querySelector("body");

const observerOptions = {
  childList: true,
  attributes: true,
  subtree: false
};

function callback(mutationList, observer) {
  mutationList.forEach((mutation) => {
    mutation.addedNodes.forEach((node) => {
      const isAdded = node.isEqualNode(el);
      console.log(isAdded);
    });
  });
}

const observer = new MutationObserver(callback);
observer.observe(targetNode, observerOptions);

document.body.appendChild(el);

https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver

还有另外两种选择,为DOMNodeInsertedorDOMNodeInsertedIntoDocument事件添加事件侦听器,但由于MutationEvent已弃用,因此最好避免使用它们。

https://developer.mozilla.org/en-US/docs/Web/API/MutationEvent

于 2019-05-14T10:47:30.750 回答
3

有时,这对于在您自己的脚本之外创建/加载的 DOM 元素是必需的,无论是由不同的 js 库还是您直接控制之外的事件。

对于这种情况,我总是设置一个间隔,它会定期检查目标元素是否存在,如果是这样,则间隔会自行删除并运行回调函数。

为此,我有一个重用的预定义函数:

function runAfterElementExists(jquery_selector,callback){
    var checker = window.setInterval(function() {
     //if one or more elements have been yielded by jquery
     //using this selector
     if ($(jquery_selector).length) {

        //stop checking for the existence of this element
        clearInterval(checker);

        //call the passed in function via the parameter above
        callback();
        }}, 200); //I usually check 5 times per second
}

//this is an example place in your code where you would like to
//start checking whether the target element exists
//I have used a class below, but you can use any jQuery selector
runAfterElementExists(".targetElementClass", function() {
    //any code here will run after the element is found to exist
    //and the interval has been deleted
    });
于 2017-09-05T12:05:45.073 回答
1

在创建元素后检查 .live() 最好的,,

$('.clickme').live('click', function() {
      // Live handler called.
});

然后再添加一个新元素:

$('body').append('<div class="clickme">Another target</div>');
于 2011-06-17T13:08:16.193 回答
1

你可以试试这段代码

$('body').on('click', '#btn', function() {
  $($('<div>').text('NewDive').appendTo("#old")).fadeOut(0).fadeIn(1000);
})
#old > div{
  width: 100px;
  background: red;
  color: white;
  height: 20px;
  font: 12px;
  padding-left: 4px;
  line-height: 20px;
  margin: 3px;
}
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Test</title>
    <link rel="stylesheet" href="./index.css">
  </head>
  <body>
    <div>
      <!-- Button trigger modal -->
      <button type="button" id="btn">Create Div</button>
      <div id="old">

      </div>
    </div>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
  </body>
</html>

于 2016-10-14T12:16:10.037 回答
0
$("<div id=\"elem\"></div>").appendTo("#parent").each(function(){

   console.log("I have been created!");

});
于 2011-06-17T13:12:01.177 回答
0

旧线程,但在我的情况下,我遇到了一个带有大附加树的情况,我想做一些内联初始化,可以这么说,并做了以下事情:

$("<div>").append(
  ...
  $("<div>").foo(...).bar(...).etc(...).each(function(){
    // init code to run after chain of init functions called
  })
...    
)
于 2019-12-12T18:29:40.467 回答
-1

最直接的是在创建元素后直接调用回调:)

于 2011-06-17T13:04:22.357 回答