Вызов функции JavaScript, возвращенной из ответа Ajax - PullRequest
67 голосов
/ 04 февраля 2009

У меня есть система, в которой я посылаю команду Ajax, которая возвращает блок скрипта с функцией в нем. После того, как эти данные правильно вставлены в DIV, я хочу иметь возможность вызывать эту функцию для выполнения необходимых действий.

Возможно ли это?

Ответы [ 17 ]

1 голос
/ 04 февраля 2009

Это не похоже на хорошую идею.

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

Для чего это стоит, хотя (и я не понимаю, почему вы вставляете блок скрипта в div?), Будут доступны даже встроенные методы скрипта, написанные в блоке скрипта.

0 голосов
/ 13 июля 2016

Ответ Федерико Занкана правильный, но вам не нужно указывать свой сценарий и проверять весь сценарий. Просто введите имя вашей функции, и оно может быть вызвано.

Чтобы добиться этого в нашем проекте, мы написали прокси-функцию для вызова функции, возвращенной в ответе Ajax.

function FunctionProxy(functionName){
    var func = eval(functionName);
    func();
}
0 голосов
/ 09 октября 2015

Если вашему AJAX-сценарию требуется более пары миллисекунд, eval () всегда будет выполняться вперед и оценивать пустой элемент ответа, прежде чем AJAX заполнит его сценарием, который вы пытаетесь выполнить.

Вместо того, чтобы возиться с таймингом и eval (), здесь есть довольно простой обходной путь, который должен работать в большинстве ситуаций и, вероятно, немного более безопасен. Использование eval () обычно не одобряется, потому что символы, оцениваемые как код, могут легко манипулироваться на стороне клиента.

Концепция

  1. Включите вашу функцию JavaScript на главной странице. Запишите его так, чтобы любые динамические элементы могли быть приняты в качестве аргументов.
  2. В вашем AJAX-файле вызовите функцию, используя официальное событие DOM (onclick, onfocus, onblur, onload и т. Д.). В зависимости от того, какие другие элементы содержатся в вашем ответе, вы можете быть достаточно умными, чтобы заставить его чувствовать себя без шва. Передайте ваши динамические элементы в качестве аргументов.
  3. Когда ваш элемент ответа заполняется и событие происходит, функция запускается.

Пример

В этом примере я хочу прикрепить динамический список автозаполнения из библиотеки jquery-ui к элементу AJAX ПОСЛЕ добавления элемента на страницу. Легко, правда?

start.php

<!DOCTYPE html>
<html>
<head>
<title>Demo</title>
<!-- these libraries are for the autocomplete() function -->
<link rel="stylesheet" type="text/css" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/themes/ui-lightness/jquery-ui.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js"></script>
<script type="text/javascript">
<!--
// this is the ajax call
function editDemoText(ElementID,initialValue) {
    try { ajaxRequest = new XMLHttpRequest();
    } catch (e) {
    try { ajaxRequest = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
    try { ajaxRequest = new ActiveXObject("Microsoft.XMLHTTP");
    } catch (e) {
    return false;
    }}}
    ajaxRequest.onreadystatechange = function() {
        if ( ajaxRequest.readyState == 4 ) {
            var ajaxDisplay = document.getElementById('responseDiv');
            ajaxDisplay.innerHTML = ajaxRequest.responseText;
            }
        }
    var queryString = "?ElementID="+ElementID+"&initialValue="+initialValue;
    ajaxRequest.open("GET", "ajaxRequest.php"+queryString, true);
    ajaxRequest.send(null);
    }

// this is the function we wanted to call in AJAX, 
// but we put it here instead with an argument (ElementID)
function AttachAutocomplete(ElementID) {
    // this list is static, but can easily be pulled in from 
    // a database using PHP. That would look something like this:
    /*
     * $list = "";
     * $r = mysqli_query($mysqli_link, "SELECT element FROM table");
     * while ( $row = mysqli_fetch_array($r) ) {
     *    $list .= "\".str_replace('"','\"',$row['element'])."\",";
     *    }
     * $list = rtrim($list,",");
     */
    var availableIDs = ["Demo1","Demo2","Demo3","Demo4"];
    $("#"+ElementID).autocomplete({ source: availableIDs });
    }
//-->
</script>
</head>
<body>
<!-- this is where the AJAX response sneaks in after DOM is loaded -->
<!-- we're using an onclick event to trigger the initial AJAX call -->
<div id="responseDiv"><a href="javascript:void(0);" onclick="editDemoText('EditableText','I am editable!');">I am editable!</a></div>
</body>
</html>

ajaxRequest.php

<?php
// for this application, onfocus works well because we wouldn't really 
// need the autocomplete populated until the user begins typing
echo "<input type=\"text\" id=\"".$_GET['ElementID']."\" onfocus=\"AttachAutocomplete('".$_GET['ElementID']."');\" value=\"".$_GET['initialValue']."\" />\n";
?>
0 голосов
/ 06 февраля 2014

Я решил это сегодня, поместив свой JavaScript внизу HTML ответа.

У меня был AJAX-запрос, который возвращал группу HTML, которая отображалась в оверлее. Мне нужно было прикрепить событие click к кнопке в возвращенном ответном HTML / оверлее. На обычной странице я бы обернул свой JavaScript в "window.onload" или "$ (document) .ready", чтобы он прикреплял обработчик событий к объекту DOM после рендеринга DOM для нового наложения, но поскольку это был ответ AJAX, а не загрузка новой страницы, это событие никогда не происходило, браузер никогда не выполнял мой JavaScript, мой обработчик событий никогда не привязывался к элементу DOM, и моя новая функциональность не работала. Опять же, я решил «выполнить JavaScript в проблеме ответа AJAX», не используя «$ (document) .ready» в заголовке документа, а разместив свой JavaScript в конце документа и запустив его после HTML / DOM визуализирован.

0 голосов
/ 26 июня 2013

Этот код также работает, вместо этого используйте HTML, я собираюсь добавить скрипт к голове

function RunJS(objID) {
//alert(http_request.responseText);
var c="";
var ob = document.getElementById(objID).getElementsByTagName("script");
for (var i=0; i < ob.length - 1; i++) {
    if (ob[i + 1].text != null) 
       c+=ob[i + 1].text;
}
var s = document.createElement("script");
s.type = "text/javascript";
s.text = c;
document.getElementsByTagName("head")[0].appendChild(s);
}
0 голосов
/ 09 декабря 2012

Я перепробовал все методы, предлагаемые здесь, но, в конце концов, сработал просто поместить функцию JavaScript в страницу / файл, где она должна происходить, и вызвать ее из ответной части Ajax просто как функцию:

...
}, function(data) {
    afterOrder();
}

Это сработало с первой попытки, поэтому я решил поделиться.

0 голосов
/ 01 января 2012

Я проверил это, и это работает. В чем проблема? Просто поместите новую функцию в ваш элемент javascript и затем вызовите ее. Это будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...