Я хочу вызвать функцию после создания элемента. Есть ли способ сделать это?
Пример:
$("#myElement").ready(function() {
// call the function after the element has been loaded here
console.log("I have been loaded!");
});
Я хочу вызвать функцию после создания элемента. Есть ли способ сделать это?
Пример:
$("#myElement").ready(function() {
// call the function after the element has been loaded here
console.log("I have been loaded!");
});
Как вы создаете элемент?
Если вы создаете его в статическом HTML, просто используйте .ready(handler)
или .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'});
Возможно, вы захотите посмотреть события jQuery live. Вы присоединяете обработчик событий к селектору, который либо соответствует сейчас, либо после того, как в вашем DOM создаются дополнительные элементы.
Итак, если у вас есть <ul>
и вы динамически создаете новые элементы <li>
, в $(document).ready()
вы можете подключить селектор к обработчику событий, чтобы все ваши элементы <li>
были подключены для этого событие.
Здесь jsFiddle пример demos live
.
Надеюсь, что это поможет.
проверить .live() лучше всего после создания элемента,
$('.clickme').live('click', function() {
// Live handler called.
});
Затем добавьте новый элемент:
$('body').append('<div class="clickme">Another target</div>');
вы можете попробовать этот код
$('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>
Иногда это необходимо для элемента DOM, созданного/загруженного вне вашего собственного script, либо другой библиотекой 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
});
$("<div id=\"elem\"></div>").appendTo("#parent").each(function(){
console.log("I have been created!");
});
Вы можете использовать функцию 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
Самый straight- forward - это прямой вызов обратного вызова после создания элемента:)