2012-02-09 3 views
2

Я загружаю страницу ajax. Целая страница, включая <html> <head> <body>. Поэтому мне нужно вызвать все сценарии, которые должны быть вызваны на загруженной странице. Но браузер помнит, что некоторые из них были загружены в эти окна, и он больше не будет их исполнять.Удаление/перезагрузка уже загруженных скриптов

Как удалить все загруженные скрипты?

Или лучше, как загрузить всю страницу, но есть старые объекты, работающие в фоновом режиме с предыдущей страницы? Например, загрузка и другие сообщения.

Код: this.load = функция (АРС) {
this.iris();

$.ajax({ 
      type: 'GET', 
      url: adr, 
      dataType: 'html', 
      success: function(data) 
      {  
      $("body").html(html); 
      } 
    }); 

редактировать: Извините, ребята, я написал это неправильно, вероятно, потому, что ваши ответы хороши, но решать что-то другое, wchich я мог решить сам. Поэтому я попытаюсь сказать это по-разному.

  • Я не могу сохранить инициализацию в функции или что-нибудь еще

    Почему - потому что я работаю с некоторым шаблоном, которые имеют JS в плагинах (для форм, Callendar ..) файл для каждого из них. Каждый плагин инициализирует себя анонимной функцией сразу при загрузке скрипта.

Так что, когда я загружаю HTML ajax, он не будет инициализироваться в этом новом HTML. (например, не найдет и не добавит слушателей).

+1

Спасибо за -rep, но будьте героем и скажите почему :) – Jindra

+0

Не понимаю, почему вы остановили свой вопрос, ребята. Я думаю, проблема довольно ясная. –

+0

@ JanKuča Я не спускал вниз, но я все еще думаю, что этот вопрос показывает отсутствие понимания механики javascript. – Christian

ответ

3

Когда вы выполняете скрипт, вы не можете его не выполнить, и он сохраняется в области, даже если вы замените всю DOM.

Итак, если вы создадите объект window.a = new A(); и замените DOM на $('body').html(html);, объект по-прежнему будет доступен как window.a.

Update:

Я представляю ваши определения сценария включены в <head> и у вас есть одно место, где вы их называете.

<!DOCTYPE html> 
<html> 
<head> 
    <script src="script1.js"></script> 
    <script src="script2.js"></script> 
</head> 
<body> 
    ... content ... 

    <script> 
window.onload = function() { 
    // initialization code here 
}; 
    </script> 
</body> 
</html> 

Поместите инициализации <script> в головке, а при хранении function в переменной. Затем, когда вы загружаете новый контент, замените только содержимое <body> и вызовите функцию.

<!DOCTYPE html> 
<html> 
<head> 
    <script src="script1.js"></script> 
    <script src="script2.js"></script> 

    <script> 
var a = function() { 
    // initialization code here 
}; 

var load = function (adr) { 
    $.ajax({ 
    type: 'GET', 
    url: adr, 
    dataType: 'html', 
    success: function (data) { 
     data = data.exec(/<body[^>]*?>(.*)<\/body>/i); 
     $("body").html(data); 

     a(); // call the function after each load 
    } 
    }); 
}; 
    </script> 
</head> 
<body onload="a()"> 
    ... content ... 
</body> 
</html> 
+0

Спасибо за ответ! Но я не понимаю, как решить проблему с помощью скриптов. Например, существует по меньшей мере 15 скриптов с дизайном рукоятки, меню, ввод даты. Но каждый из них находится в отдельном файле, и они инициализируются анонимной функцией, поэтому я не могу их вызвать, когда страница снова загружается ajax , – Jindra

+0

См. Мой обновленный ответ. –

+0

Спасибо, но я не могу сохранить инициализацию в функцию. Я обновил свой вопрос для лучшего понимания, – Jindra

1

Единственный способ «не исполнять» сценарий - это его дизайн как таковой в первую очередь.

Это не особенно сложно, но требуется некоторое знание - нет волшебного переключателя, чтобы включить это.

Например ...

индекс.HTML

<script src="script1.js"></script> 
<script src="script2.js"></script> 
<script> alert(pie); </script> 

script1.js

var pie = 'Hello world!'; 

script2.js

var pie = 'Hello cruel world!'; 

Так короче говоря, является важным предварительным условием будет то, что вы держите весь код внутри одного греха gle, которую вы можете легко перезаписать/удалить позже.

+0

Я знаю это, но я не могу изменить загружаемые скрипты. Они являются частью шаблона. Но, возможно, будут работать сценарии загрузки как текст, сохранить их в функции, а затем eval. Это будет работать? Я не очень разбираюсь в javascript. Я просто прочитал несколько книг, но есть просто начинающие вещи, такие как загрузка текста, перемещение с меню ... – Jindra

+0

Ну, что вы спросите, «разгрузите» часть, очень расплывчато. В javascript вы можете удалить и перезаписать функции, свойства и многое другое. Вы также можете «исправить» поврежденную DOM (часть HTML). Итак, что вам нужно, на самом деле не из этого мира, но на данный момент это просто расплывчато. – Christian

0

Вместо того, чтобы вводить код инициализации непосредственно в скрипт, чтобы он выполнялся немедленно, поместите его в функцию и затем вызовите эту функцию по мере необходимости.

Включите этот раз:

function initialize() { 
    alert('(Re)initializing'); 
} 

Тогда всякий раз, когда страница "перезагружается", просто вызовите initialize() снова.

+0

Спасибо за ответ, но это один из соображений, который я не могу сделать. – Jindra

Смежные вопросы