[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Javascript внутри AJAX response
Gadzilla
Добрый день.
Проблема такая: на страницу в DIV выводится контент через AJAX. Этот контент выводится из другого файла, и в нем присутствует Javascript. Проблема в том, что в результате вывода через AJAX не работают функции Javascript. Как это исправить - я уже нашел, оказывается, есть подобные решения, которые выдирают из response все, что стоит в тегах <script> и выполняют функции.
Но:
Что делать с javascript событиями, привязанными к элементам? К примеру, в подгруженном контенте присутствуют ссылки с событием onclick, которые должны вызывать функции, но и они не работают.



Спустя 11 минут, 40 секунд (14.03.2012 - 20:46) redreem написал(а):
если в подгружаемом коде обрамить исполняемую находу часть в отдельную функцию, которую вызвать принудительно уже после домреди, то сработает. я так делаю.

Спустя 50 секунд (14.03.2012 - 20:47) Игорь_Vasinsky написал(а):
покажи на кратком примере, пока не касалось, но чую пригодиться.

Спустя 3 минуты, 58 секунд (14.03.2012 - 20:51) Gadzilla написал(а):
Как именно? Можете привести пример на событии onclick?

Спустя 6 минут, 27 секунд (14.03.2012 - 20:57) Игорь_Vasinsky написал(а):
biggrin.gif

Спустя 3 минуты, 24 секунды (14.03.2012 - 21:01) redreem написал(а):
ну есть у тебя например подгружаемый аджаксом код:

<div id="blablaId">...</div>

<script>

document.getElementById('blblaId').onclick='blablaFunc';
</script>


я делаю так:

<div id="blablaId">...</div>

<script>
function
contentInit() {
document.getElementById('blblaId').onclick='blablaFunc';
}
</script>


а обработчике ajax-загрузки по complete идет вызов:

$(document).ready({
contentInit();
});






Спустя 2 часа, 43 минуты, 39 секунд (14.03.2012 - 23:44) Gadzilla написал(а):
Именно этот вариант почему-то не работает.
Причем, специально протестировал и на одной странице, без применения AJAX. Так как же все-таки выставить onclick для элемента отдельно от самого элемента?

Спустя 40 минут, 27 секунд (15.03.2012 - 00:25) bodja написал(а):
Подгрузка JS аяксом идет через JSON,через innerHTML он работать не обязан.
Точто вы хотите сделать - это лично ваши проблемы и ваши костыли.
Следут так же убедится ,прежде чем вешать событие на элемент ,существует ли он вообще.

Спустя 1 час, 33 минуты, 58 секунд (15.03.2012 - 01:59) Gadzilla написал(а):
Хорошо. Какие альтернативные методы вы можете посоветовать для реализации подгрузки контента в DIV, с условием выполнения всех JS скриптов?

Спустя 5 минут, 33 секунды (15.03.2012 - 02:04) Gadzilla написал(а):
Всем большое спасибо за ответы, вопрос решен.
Предполагаю, что проблема не редкая. Решение ее оказалось крайне простым. В настройках вызова страницы через AJAX необходимо указать:
http.type = 'text/javascript';

(если вы используете другую структуру, посмотрите, как для нее указать тип данных)

Далее, добавить функцию, где node=ID вашего блока, theResponse=Полученный контент.
Функцию, естественно, вызываем после получения контента.
function executeEmbeddedScripts(node,theResponse){
var bSaf = (myBindexOf(navigator.userAgent,'Safari',0) != -1);
var bOpera = (myBindexOf(navigator.userAgent,'Opera',0) != -1);
var bMoz = (navigator.appName == 'Netscape');
if (!node) return;
var myHead=document.getElementsByTagName('head');
if ((!bSaf)&&(!bOpera)&&(!bMoz)) node.innerHTML="  "+theResponse; // World's most retarded IE fix
var st = node.getElementsByTagName('SCRIPT');
var strExec;
var scripts = st.length;
var i = 0;
for(j = 0; j < scripts; j++){
var scriptsAtStart = st.length;
if (bSaf) {strExec = st[i].innerHTML; st[i].innerHTML = "";}
else if (bOpera) {strExec = st[i].text; st[i].text = "";}
else if (bMoz) {strExec = st[i].textContent; st[i].textContent = "";}
else {strExec = st[i].text; st[i].text = "";}
try {
var myScript = document.createElement("script");
myHead.item(0).appendChild(myScript);
myScript.type = "text/javascript";
myScript.text=strExec;
var html = node.innerHTML;
// jscript would prematurely eject if it encountered the full closing tag, even encapsulated in a string object
var endScriptL = '<' + '/script>';
var endScriptU = '<' + '/SCRIPT>';
var pos2 = myBindexOf(html,strExec,0);
var pos = myBindexOf(html,endScriptL,pos2) >= 0 ? myBindexOf(html,endScriptL,pos2) : myBindexOf(html,endScriptU,pos2);
pos += String(endScriptL).length;
html = html.substr(0,pos) + html.substr(pos);
node.innerHTML = html;
if(scriptsAtStart==st.length) i++;
} catch(e) {
alert("Script execution error: "+e);
}
}
}
function myBindexOf(myObject,mySearch,myPos){
if (myPos==null) myPos=0;
if (typeof(myObject)!='object') return -1;
if(!myObject.indexOf) {
for(var i=myPos; i < myObject.length; i++) if(myObject[i]==mySearch) return i;
return -1;
} else return myObject.indexOf(mySearch,myPos);
}
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.