Еще раз я хочу загрузить страницу, которая содержит ее собственный сценарий в отделение, использующее $ ("divid") .load (...). Проблема, с которой я сталкиваюсь, связана с событиями. Скажем, мы инициировали ("обезьяна") от родительской страницы, и на загруженной странице мы связываем ("обезьяна") и просто делаем предупреждение ("обезьяна, связанная"). Если тот же метод загрузки называют многократно, связывание называют многократно. Теперь я мог просто развязать его, прежде чем я свяжу его, или проверю количество обработчиков перед связыванием и затем не обяжу его предотвращать это. Никакая опция не масштабируема как какой, если я позже хочу связать с тем триггером в другом "sub страницу" (страница, загруженная в отделение).
Что я идеально хочу сделать, тогда проверка, если обработчик, который я собираюсь добавить уже, существует, но я все еще ХОЧУ использовать анонимные обработчики... (выяснение у слишком с тем последним запросом, я думаю). В настоящее время у меня есть обходное решение при помощи pre-defined/named методов и затем проверяющий это перед связыванием.
// Found this on StackOverflow
function getFunctionName(fn)
{
var rgx = /^function\s+([^\(\s]+)/
var matches = rgx.exec(fn.toString());
return matches ? matches[1] : "(anonymous)"
}
function HandlerExists(triggerName, handlerName) {
exists = false;
if ($(document).data('events') !== undefined) {
var event = $(document).data('events')[triggerName];
if(event !== undefined)
{
$.each(event, function(i, handler) {
alert(handlerName);
if (getFunctionName(handler) == handlerName) {
exists = true;
}
});
}
}
return exists;
}
Это - довольно сырой способ идти об этом, я чувствую, но, кажется, работает. Я просто делаю следующее перед связыванием следующим образом:
if (!HandlerExists("test", "theMethod")) {
$(document).bind("test", theMethod);
}
У кого-либо есть более изящное решение? например, есть ли какой-либо способ проверить, что конкретный сценарий загружается? таким образом, я мог использовать getScript (), чтобы загрузить js из дочерней страницы на первой загрузке и затем затем не загрузить его на последующих загрузках (и просто запустить триггер, который будет обработан им существующий ранее js)..
ммм Как насчет использования One ()
? http://api.jquery.com/One/
Или я полностью не понимаю?
Это не полный ответ, но я быстро нашел, как исправить весь свой код с минимальными изменениями. В моем классе «Base» JS (это объект, который используется на каждой странице для стандартных подключений кнопки по имени класса и т. Д.) Я добавил следующий метод, который выполняет чек для обработчиков дупэ:
BindOnce: function(triggerName, fn) {
function handlerExists(triggerName, theHandler) {
function getFunctionName(fn) {
var rgx = /^function\s+([^\(\s]+)/
var matches = rgx.exec(fn.toString());
return matches ? matches[1] : "(anonymous)"
}
exists = false;
var handlerName = getFunctionName(theHandler);
if ($(document).data('events') !== undefined) {
var event = $(document).data('events')[triggerName];
if (event !== undefined) {
$.each(event, function(i, handler) {
if (getFunctionName(handler) == handlerName) {
exists = true;
}
});
}
}
return exists;
}
if (!handlerExists(triggerName, fn)) {
$(document).bind(triggerName, fn);
}
},
, тогда я только что призываю его вместо Метод связывания!
$.mystuff.BindOnce("TheTrigger", OnTriggered)
Обратите внимание, что вы не можете использовать методы Anon здесь, так как они просто называют 1, 2, 3 и т. Д., И единственным способом проверки на теп. Комплексное приложение