Еще раз хочу загрузить страницу, содержащую ее script, в div, используя $( "div" ). load (...). Проблема, с которой я сталкиваюсь, связана с событиями. Пусть говорят, что мы запускаем ( "обезьяна" ) с родительской страницы и на загружаемой странице, которую мы связываем ( "обезьяна" ), и просто делаем предупреждение ( "обезьяна привязана" ). Если один и тот же метод загрузки вызывается несколько раз, связывание вызывается несколько раз. Теперь я мог бы просто отпереть его, прежде чем связывать его, или проверить количество обработчиков перед связыванием, а затем не связывать его, чтобы предотвратить это. Ни один из вариантов не масштабируется, как если бы я позже захотел привязать этот триггер к другой "вспомогательной странице" (страница, загружаемая в div).
То, что я в идеале хочу сделать, это проверить, есть ли обработчик, который я собираюсь добавить, уже существует, но я все еще ХОЧУ использовать анонимных обработчиков... (прошу немного больше о том, что последний запрос я думаю). В настоящее время у меня есть обходное решение, используя предварительно определенные/именованные методы, а затем проверяя это до привязки.
// 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);
}
Есть ли у кого-нибудь более элегантное решение? например, есть ли способ проверить загрузку определенного script? поэтому я мог бы использовать getScript() для загрузки js с дочерней страницы при первой загрузке, а затем просто не загружать ее при последующих нагрузках (и просто запускать триггер, который будет обрабатываться им уже существующим js).