Внедрение JavaScript и HTML с использованием AJAX - PullRequest
0 голосов
/ 14 сентября 2010

Прежде всего, я хотел бы сказать, что, хотя я публикую здесь впервые, эти доски очень помогли мне. С учетом сказанного у меня возникла странная проблема, связанная с AJAX и скриптами.

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

E.x: если у нас есть верхний заполнитель меню, но нет верхнего меню, контекстное меню будет иметь одну опцию - «Добавить меню». Но, скажем, у нас уже есть верхнее меню, в контекстном меню будут разные опции, такие как «меню редактирования» и т. Д. *

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

весь этот код поступает в тот же элемент div, где старый скрипт контекстного меню и верхний заполнитель меню были настолько простыми, что перезаписывались. Теперь само меню в HTML, поэтому оно переопределяет текущий код, однако JS действует странно и теперь отображает 2 контекстных меню - старое и новое, хотя я перезаписываю его код.

Мне нужно кое-как избавиться от старого скрипта контекстного меню, не обновляя страницу. Есть идеи?

P.S все JS генерируются динамически, если это что-то меняет (я не думаю, что это так).

Ответы [ 3 ]

1 голос
/ 15 сентября 2010

Ну, после некоторой поломки головы я понял это .. (проблема еще не решена) это функция ajax, верно?

$.ajax({
            type: "GET",
            url: "../../../Tier1/EditZone/Generate.aspx?Item=contentholder&Script=true",
            dataType: "html",
            success: function (data) {
                $('#CPH_Body_1_content_holder').html(data);
            }
        });

теперь они используют страницу с обработчиком событий, этот обработчик событий повторно вводит данные в соответствие с response.write (answer), мне просто кажется, что когда вы используете response.write, он отправляет код после его компиляции и запуска наш случай на странице Generate.aspx.

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

то, что я считаю плохим, возвращает данные в виде строки, а затем и только потом вставляет код в контейнер div.

плохо сообщу вам, если это сработает. ура и спасибо за советы эти форумы рок.

1 голос
/ 14 сентября 2010

Независимо от того, что кто-то говорит, не используйте EVAL.Это зло и вызовет проблемы с памятью, если использовать его на странице несколько раз.

См. Мое решение здесь: попытка вызвать код js, который передается обратно из вызова ajax

По сути, создайте div с идентификатором codeHolder и вуаля.В основном вы захотите передать свои HTML и JS обратно в приемник AJAX (разделенный разделителем), проанализировать его на стороне JS, отобразить HTML и поместить код JS в переменную javascriptCode .

//Somehow, get your HTML Code and JS Code into strings
var javascriptCode="function test(){.....}";
var htmlCode="<html>....</html>";

//HTML /////////////////////////////////////////
  //Locate our HTML holder Div
  var wndw=document.getElementById("display");

  //Update visible HTML
  wndw.innerHTML = htmlCode;

//Javascript ///////////////////////////////////
  //Create a JSON Object to hold the new JS Code
  var JSONCode=document.createElement("script");
  JSONCode.setAttribute("type","text/javascript");

  //Feed the JS Code string to the JSON Object
  JSONCode.text=javascriptCode;

  //Locate our code holder Div
  var cell=document.getElementById("codeHolder");

  //Remove all previous JS Code
  if ( cell.hasChildNodes() )
      while ( cell.childNodes.length >= 1 )
          cell.removeChild( cell.firstChild );

  //Add our new JS Code
  cell.appendChild(JSONCode);

//Test Call///////////////////////////////////////
test();

Этот код заменит весь предыдущий код JS, который вы могли поместить туда, новой строкой кода JS.

0 голосов
/ 14 сентября 2010

Спасибо за ответы.

Голландка - это именно то, что я сделал.теперь дело в том, что HTML правильно перезаписан (я не использовал append, я переписал весь div) и да, javascript просто продолжает кэшировать ...

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

Ян, Моя функция AJAX создает теги div и теги сценария и помещает их в другой тег div контейнера на странице.

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

Я не думаю, что коднужно, но я опубликую это завтра.

Есть идеи?

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