После запроса новые созданные элементы не распознаются обработчиками событий в моем коде jQuery.
Есть ли способ перезагрузить файл, чтобы перерегистрировать эти события?
После запроса новые созданные элементы не распознаются обработчиками событий в моем коде jQuery.
Есть ли способ перезагрузить файл, чтобы перерегистрировать эти события?
Я предполагаю, что вы имеете в виду, что события, которые вы зарегистрировали для элементов, которые были заменены результатами ваших запросов ajax, не срабатывают?
Используйте .live()
(см. http://api.jquery.com/live/), чтобы зарегистрировать события против элементов, которые соответствуют селектору (включая новые элементы DOM, созданные из результатов ajax), а не результаты селектора, когда обработчики событий были первыми, которые будут уничтожены при их замене.
например. заменить
$('div.someClass').click(function(e){
//do stuff
});
с
$('div.someClass').live('click', function(e){
//do stuff
});
Важно:
Хотя я рекомендовал использовать .live()
, это для ясности, так как его синтаксис похож на .bind()
, вы должны использовать .on()
, если это возможно. См. Ссылки в комментарии @jbabey для получения важной информации.
Этот вопрос касался привязки события привязки к элементу DOM, созданному после загрузки страницы. Например, если после запроса ajax вы создаете новый блок <div>
и хотите поймать событие onClick.
//This will work for element that are present at the page loading
$('div.someClass').click(function(e){
//do stuff
});
// This will work for dynamically created element but is deprecated since jquery 1.7
$('div.someClass').live('click', function(e){
//do stuff
});
// This will work for dynamically created element
$('body').on('click', 'div.someClass', function(e){
//do stuff
});
Здесь вы найдете документацию: http://api.jquery.com/on/
Эти коды отлично подходят для меня.
$("head script").each(function(){
var oldScript = this.getAttribute("src");
$(this).remove();
var newScript;
newScript = document.createElement('script');
newScript.type = 'text/javascript';
newScript.src = oldScript;
document.getElementsByTagName("head")[0].appendChild(newScript);
});
Он удаляет старый тег script и создает новый с тем же src (перезагружая его).
Чтобы повысить производительность сайта и уменьшить общий размер файла, вы можете загрузить файл JavaSript (.js), когда это необходимо. В jQuery вы можете использовать функцию $.getScript для загрузки файла JavaScript во время выполнения или по требованию.
Например,
$("#load").click(function(){
$.getScript('helloworld.js', function() {
$("#content").html('Javascript is loaded successful!');
});
});
когда нажата кнопка с идентификатором "load", она будет загружать файл JavaScript "helloworld.js" динамически.
Попробуйте сами В этом примере, когда вы нажали на кнопку загрузки, он будет загружать "js-example/helloworld.js" во время выполнения, содержащее функцию "sayhello()".
<html>
<head>
<script type="text/javascript" src="jquery-1.4.2.min.js"></script>
</head>
<body>
<h1>Load Javascript dynamically with jQuery</h1>
<div id="content"></div>
<br/>
<button id="load">Load JavaScript</button>
<button id="sayHello">Say Hello</button>
<script type="text/javascript">
$("#load").click(function(){
$.getScript('js-example/helloworld.js', function() {
$("#content").html('
Javascript is loaded successful! sayHello() function is loaded!
');
});
});
$("#sayHello").click(function(){
sayHello();
});
</script>
</body>
</html>
Что вы имеете в виду не распознанные jQuery?
jQuery посещает DOM каждый раз, когда вы делаете запрос, поэтому они должны быть видимыми. Однако приложенные события НЕ будут.
Что не видно точно?
P.S.: Перезагрузка JavaScript возможна, но очень обескуражена!
В обратном вызове запроса вызовите функцию, действующую на ваши недавно добавленные или созданные блоки.
$.ajax({
success: function(data) {
$('body').append(data);
//do your javascript here to act on new blocks
}
});
простой способ решить эту проблему
$(document).ready(function(){
$('body').on('click','.someClass',function(){
//do your javascript here..
});
});
var scripts = document.getElementsByTagName("script");
for (var i=0;i<scripts.length;i++) {
if (scripts[i].src)
if(scripts[i].src.indexOf('nameofyourfile') > -1 )
var yourfile = scripts[i].src;
}
jQuery.get(yourfile, function(data){
if(data){
try {
eval(data);
} catch (e) {
alert(e.message);
}
}
});
Вы можете попробовать плагин loadcript для загрузки файла javascript.
forexample
$("#load").click(function(){
$.loadScript('path/example.js');
});
or
$.ajax({
success: function(data) {
$.loadScript('path/example.js');
}
});