Я хочу вызвать функцию после создания элемента. Есть ли способ сделать это?
Пример:
$("#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 - это прямой вызов обратного вызова после создания элемента:)