Плагин jQuery становится неопределенным при вызове из $ .get - PullRequest
3 голосов
/ 18 ноября 2011

Я использую jQuery TokenInput, и в моем коде есть место, где я хотел бы сделать Ajax-вызов до фактического вызова TokenInput.Однако, если я пытаюсь вызвать TokenInput из $.get, я получаю

Uncaught TypeError: Object #<Object> has no method 'tokenInput'

Так что это работает:

$("#myfield").tokenInput('/search/', {
    tokenLimit: 3
});
$("#myfield").tokenInput("add", { id: 100, name: "Fake Data" });

Ноэто не работает:

var old_value = $("#myfield").val();
$("#myfield").tokenInput('/search/', {
    tokenLimit: 3
});
$.get('/search/', { q: old_value }, function (data) {
    record = data[0];
    $("#myfield").tokenInput("add", {id: record.id, name: record.name });
});

Так что я думаю, что мне интересно, что случилось с $.tokenInput?Есть ли что-то, что я могу сделать, чтобы убедиться, что он доступен из $.get?

Исходный код для jQuery.TokenInput: https://github.com/loopj/jquery-tokeninput/blob/master/src/jquery.tokeninput.js

Обновление

О Horsefeathers .Глядя на код, я вижу, что другой раздел кода (в данном случае от django-cms) использует другую версию jQuery.Это , а не в результате моего запроса $.get, он просто находится в другой части страницы.

Вот что я не понимаю: почему это работает в одномконтекст, а не другой?Обе версии jQuery уже загружены к тому времени, когда мы получаем код $.tokenInput.Так что же происходит с $, так что он сохраняет .tokenInput?

Кроме того, я подумал, что есть способ иметь две версии jQuery на одной странице и не сталкиваться с проблемами - этаверсия jQuery каким-то образом «сохранит» другую версию.Очевидно, что он может сделать это частично, так как $ .tokenInput работает в некоторых случаях времени.

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

Ответы [ 2 ]

2 голосов
/ 11 ноября 2012

Относительно проблемы.

Это не прямой ответ на вопрос, а общий факт убийства плагинов jQuery.У меня была проблема, как описано ниже, и после поиска в Google я оказался здесь, так что, возможно, кто-то тоже.

Добавление тегов <script /> к document выполнит эти сценарии и, возможно, уничтожитвсе ваши плагины внутри $.

Вредный скрипт:

// Here html response has full index.php body,
// i.e. html has <body /> and <script /> tags inside
// (including `<script src="js/jquery.js">`).
$.get(url).done(function(html)
{
    // Here happens redeclaration of jQuery variable (i.e. $ variable),
    // because of `<script src="js/jquery.js">` inside `<body />`.
    // 
    // Redeclaration of jQuery variable mean
    // that all plugins will die (i.e. all
    // not native jQuery attributes become undefined).
    $(html).appendTo("body");
});

edit:

Другой пример:

$("<html />").html("<script src='js/jquery.js'></script>");

будет загружаться jquery.js.

Важно отметить: скрипты, введенные таким образом, будут загружаться через ajax (то есть XMLHttpRequest).

Примечание: все это было протестировано в Chrome, но поведение jQuery в отношении разбора htmlis not cross-browser:

"При передаче в сложном HTML некоторые браузеры могут не создавать DOM, который точно копирует предоставленный источник HTML. Как уже упоминалось, мы используем браузер.innerHTML свойство для анализа переданного HTML и вставки его в текущий документ. Во время этого процесса некоторые браузеры отфильтровывают определенные элементы, такие как <html>, <title> или <head>. AsВ результате вставленные элементы не могут быть представленыуказывает на переданную исходную строку. "

source

1 голос
/ 18 ноября 2011

Я подозреваю, что блоки скриптов, в которых он работает, находятся над элементом скрипта, который загружается во второй копии. Таким образом, они работают просто отлично - пока вы не добавите что-то в асинхронный метод, такой как обратный вызов AJAX. К моменту запуска более поздние блоки скриптов были выполнены, удалив поддержку, необходимую для обратного вызова

См. Пример: http://jsfiddle.net/RukeN/1/

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