Как включить файл js в вызов ajax? - PullRequest
9 голосов
/ 20 апреля 2010

Я вызываю метод ajax для обновления div. Он содержит ссылки и функции, которые требуют файлов сценариев Java. Но эти методы и функции не вызываются должным образом, так как файлы сценариев Java не включаются через вызов ajax. Например, я пытаюсь вызвать функцию лайтбокса, но она перенаправляется на другую страницу, а не в лайтбокс.

Заранее спасибо, Анубхоу Пракаш

Ответы [ 7 ]

2 голосов
/ 04 августа 2010

Фреймворк Ajax в прототипе будет правильно выполнять текстовое содержимое тегов <script>, но не будет импортировать новые файлы скриптов через <script src="somefile.js"/>. Единственное решение, которое я придумал, - это импортировать все файлы javascript, которые мне нужны, в верхней части страницы. Таким образом, функции в импортированном файле доступны для встроенного кода JavaScript, выполняемого в ответе Ajax.

1 голос
/ 08 августа 2010

У меня была похожая проблема, когда я действительно хотел загрузить какой-нибудь javascript. Я разделил загрузку фрагмента html и загрузил скрипт на два вызова. Для загрузки скрипта я вызываю следующую функцию (у меня JQuery обрабатывает часть ajax):

function loadModule(name, callback) {
    $.ajax({type: "POST"
          , url: "/js/" + name
          , dataType: "script"
          , success: callback
    });     
}
0 голосов
/ 03 января 2012

эй, я нашел способ добавить его ....:)

ПРИМЕЧАНИЕ. Это синхронный процесс, поэтому вам не нужно беспокоиться о том, загружен сценарий или нет .... сценарий всегда загружает экземпляр, вызывающий функцию, и вы можете сразу начать использовать загруженный сценарий.

позволяет использовать эти 2 функции

1) первая функция ajax для получения значений где async должно быть true, чтобы отправить запрос синхронно

    // AJAX FUNCTION
    function loadXMLDoc(reqt,url,reqp,cfunc,async)
    {
        var xmlhttp;
        try// code for IE7+, Firefox, Chrome, Opera, Safari
        {
            xmlhttp=new XMLHttpRequest();
        }
        catch(err)// code for IE6, IE5
        {
            try{
                xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
            }
            catch(e){
                try{
                    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
                }
                catch(E){}
            }
        }
        if(!xmlhttp)
        {
            alert("error");
        }
    xmlhttp.onreadystatechange=function(){
        if(xmlhttp.readyState==4 && xmlhttp.status==200)
        {
            cfunc(xmlhttp.responseText);
        }
    }
    if(reqt=='GET')
    {
        url+=(reqp!=""?"?":"")+reqp;
        xmlhttp.open("GET",url,(async?false:true));
        xmlhttp.send();
    }
    else if(reqt=='POST')
    {
        xmlhttp.open("POST",url,(async?false:true));
        xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
        xmlhttp.send(reqp);
    }
    else
    {
        return false;
    }
    }
    /*use this function
    loadXMLDoc(reqt,url,reqp,function(response){
    });
    */

2) затем мы используем ajax, чтобы загрузить файл js в виде строки, а затем добавить его в innerHTML нового тега сценария, а затем добавить его в раздел head и еще одну вещь, чтобы убедиться, что файл уже загружен. тег как путь к файлу, который позволяет легко найти дубликаты ...:)

    //add new script dynamically
    function add_script(src)
    {
        if(!document.getElementById(src))
        {
            loadXMLDoc("GET",src,"",function(jsresp){
                var head = document.getElementsByTagName("head")[0];
                var script=document.createElement("script");
                script.type='text/javascript';
                script.id=src;
                script.text=jsresp;
                head.appendChild(script);
            },true);
        }
    }

спасибо за всю помощь, которую я получал и получаю с этого сайта и его пользователей для целей разработки ...

С уважением, VIPIN JAIN

0 голосов
/ 05 августа 2010
  1. включает статические скрипты на страницах, которые должны их использовать (IE содержат лайтбокс, а затем включает скрипт лайтбокса)
  2. Проблема решена.Не загружайте сценарии, используя AJAX
  3. . Делайте необходимые вызовы функций для статических сценариев, используя обратные вызовы AJAX
.
0 голосов
/ 01 мая 2010

Возможно, вы захотите запустить какой-нибудь подготовительный javascript в опции: before для установки переменной с правильными файлами?

0 голосов
/ 20 апреля 2010
Теги

<script>, записанные в innerHTML, не выполняются во время записи. Вы можете сделать element.getElementsByTagName('script'), чтобы попытаться схватить их и выполнить их сценарии вручную, но это очень уродливо и ненадежно.

Существуют утомительные различия браузера, связанные с тем, что происходит с элементом <script>, записанным в innerHTML, который затем (напрямую или через предка) повторно вставляется в документ. Вы хотите избежать такого рода вещей: просто не пишите <script> с innerHTML вообще.

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

Гораздо лучше включать ваши сценарии статически и связывать их с элементами страницы вручную после записи новых элементов на страницу. Если вам действительно нужно, вы можете сделать так, чтобы ваши вызовы AJAX захватывали объект JSON, содержащий как новый HTML-код для добавления, так и ряд сценариев для выполнения.

0 голосов
/ 20 апреля 2010

Я вижу, что вы используете Ruby on Rails & mdash; Значит ли это, что вы используете Prototype на клиенте? В этом случае прототип Ajax.Updater будет игнорировать теги сценария, которые ссылаются на внешние файлы (он будет оценивать теги сценария, содержимое которых встроено). Поэтому, чтобы добавить эти внешние файлы на свою страницу, вам нужно подключиться к процессу с помощью обратного вызова onSuccess, найти в responseText теги сценария с атрибутами src и обработать их самостоятельно. После того, как вы определили соответствующие теги сценариев и извлекли их src атрибуты, вы можете включить их, динамически добавляя сценарии, как описано в этой статье из неофициальной вики Prototype & script.aculo.us.

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